使用Claude挖掘反序列化漏洞
环境搭建
在开始漏洞挖掘之前,我们需要一个支持Claude反编译.NET程序集的MCP服务器。虽然通常使用dotPEAK进行.NET二进制文件反编译,但这是一个仅限Windows的工具。幸运的是,ilspycmd可以在Mac/Linux上运行。
由于GitHub上的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 .
|
然后使用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 """
您可以使用以下命令反编译.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是否能找到已知漏洞。2023年9月,Blue-Prints博客披露了AddinUtil.exe中存在不安全的反序列化漏洞,这是一个默认随Windows发布的.NET二进制文件。
通过Claude分析System.AddIn.dll,它成功识别出潜在的漏洞,包括由于使用TypeFilterLevel.Full而导致的.NET远程处理中的不安全反序列化调用。
经过调整提示词和明确要求Claude检查所有文件后,它最终识别出了已知的不安全反序列化调用,并正确识别出缓存文件可能不受信任。
识别攻击路径
通过指导Claude识别从AddinUtil.exe到不安全反序列化代码的路径,Claude成功识别出可能的入口点,包括pipelineroot标志,这是Blue-Prints博客文章中提到的另一个反序列化调用路径。
Claude还正确识别了攻击路径,并能够生成漏洞利用的概念验证代码。生成的代码正确识别了需要在有效载荷数据前添加12字节的填充,虽然无法确定这些字节的实际用途。
发现新漏洞
测试Claude是否能识别pipelineroot标志的攻击路径,该路径在Blue-Prints博客中没有详细展开。Claude生成了详细的Python代码并解释了漏洞原理。
通过使用ysoserial.net生成有效载荷:
1
|
ysoserial.exe -f BinaryFormatter -g TypeConfuseDelegate -c calc -o raw > e:\tools\payload.bin
|
运行Claude生成的概念验证代码时发现,Claude忽略了创建AddIns目录和正确命名.store文件的步骤。经过手动修正后,成功实现了calc.exe的弹出。
技术总结
本文展示了如何使用MCP服务器赋予Claude分析.NET程序集的能力,发现了Microsoft签名二进制文件中的已知漏洞,并构建了针对原始漏洞披露中提到的攻击路径的工作概念验证。
虽然过程中需要给Claude一些提示,但这种文件分析和接近工作漏洞利用的过程比手动操作要快得多。下一步将是探索是否能够大规模进行这种分析。
完整的概念验证代码可在相关资源中找到。