使用Claude挖掘.NET反序列化漏洞的技术实践

本文详细介绍了如何利用Model Context Protocol(MCP)和Claude AI挖掘.NET程序集中的反序列化漏洞,包括环境搭建、已知漏洞复现和新漏洞发现的全过程,展示了AI辅助安全研究的实际应用。

使用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一些提示,但这种文件分析和接近工作漏洞利用的过程比手动操作要快得多。下一步将是探索是否能够大规模进行这种分析。

完整的概念验证代码可在相关资源中找到。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计