项目简介

Pwno MCP 是一个专为LLM(大型语言模型)智能体设计的后端服务,旨在提供一个隔离、可扩展且具备完整调试能力的二进制安全研究环境。LLM可以利用该服务与GDB/pwndbg进行交互,执行程序、设置断点、检查内存和寄存器,进行编译,管理后台进程,甚至获取二进制文件的反编译代码,从而自动化地进行漏洞分析和利用开发。每个Pwno MCP实例都运行在独立的容器中,确保研究环境的隔离和安全性。

主要功能点

  • 交互式调试与分析:
    • 执行任意GDB/pwndbg命令: 允许LLM直接向GDB发送任何调试命令,获取详细响应。
    • 加载与运行程序: 载入可执行二进制文件进行调试,支持向目标程序传递命令行参数。
    • 精确控制程序流程: 提供单步执行(next, step)、继续执行、运行至函数结束、跳转到指定位置等功能。
    • 获取运行时上下文: 检索寄存器状态、堆栈信息、反汇编代码、源代码及函数调用回溯等关键调试上下文。
    • 断点管理: 支持设置带有条件表达式的断点,方便在特定程序状态下暂停执行。
    • 内存操作: 能够读取指定地址和大小的内存内容,并以不同格式(如十六进制、字符串)显示。
    • 会话状态跟踪: 维护调试会话的当前状态,包括已加载二进制、断点、进程ID等,方便LLM跟踪调试进度。
  • 系统与进程管理:
    • 编译二进制文件: 执行GCC、Clang等编译器命令,支持启用ASAN(地址消毒器)等安全检查,用于构建和测试漏洞程序。
    • 后台进程管理: 启动、监控和终止独立的后台进程,例如在漏洞利用场景中启动一个易受攻击的服务器或客户端。
    • Git仓库操作: 支持克隆远程Git仓库,并检出特定的分支、标签或提交版本,便于分析历史漏洞版本。
    • Python脚本执行: 在共享环境中执行Python脚本或直接运行Python代码片段,支持安装额外的Python包,用于自动化任务或编写漏洞利用脚本。
  • 静态分析与反编译:
    • 集成RetDec服务: 支持对外部URL提供的二进制文件进行反编译,返回可读的C语言代码,帮助LLM理解程序逻辑。

安装步骤

Pwno MCP 服务器推荐通过Docker容器部署,以确保环境的隔离和一致性。

  1. 构建Docker镜像: 在项目根目录下执行以下命令构建Docker镜像。 '--platform linux/amd64' 参数确保镜像在x86-64架构上运行。

    docker build -t pwno-mcp:latest . --platform linux/amd64
  2. 运行Docker容器: 构建完成后,可以使用以下命令运行容器。这会启动Pwno MCP服务器,并挂载一个名为 'workspace' 的本地目录到容器内部,用于存放二进制文件、源代码和日志等。

    docker run -it \
      --cap-add=SYS_PTRACE \
      --cap-add=SYS_ADMIN \
      --security-opt seccomp=unconfined \
      --security-opt apparmor=unconfined \
      -v $(pwd)/workspace:/workspace \
      -p 5500:5500 \
      pwno-mcp:latest
    • '--cap-add=SYS_PTRACE' 和 '--cap-add=SYS_ADMIN':为容器赋予调试和进程管理所需的特权。
    • '--security-opt seccomp=unconfined' 和 '--security-opt apparmor=unconfined':禁用安全限制,确保GDB等工具能正常运行。
    • '-v $(pwd)/workspace:/workspace':将当前目录下的 'workspace' 目录挂载到容器内部的 '/workspace' 目录,便于文件共享。
    • '-p 5500:5500':将容器的5500端口映射到主机的5500端口,供MCP客户端连接。

服务器配置

MCP客户端需要配置与Pwno MCP服务器建立连接的信息。

  • 服务器地址和端口: Pwno MCP服务器默认通过HTTP协议在 '0.0.0.0:5500' 地址上提供服务。因此,MCP客户端应配置连接到 'http://<服务器IP或域名>:5500'。如果服务器在本地运行,通常是 'http://localhost:5500'。
  • 服务器启动命令(如果客户端支持自动启动): 如果MCP客户端需要自动启动Pwno MCP服务器进程,则启动命令为 'python',参数为 '-m pwnomcp'。客户端需要在Pwno MCP项目的根目录下执行此命令。
  • 认证信息: 如果服务器启用了Nonce认证(通过 '/app/.nonce' 文件配置),MCP客户端需要在HTTP请求头中携带 'X-Nonce: <你的认证令牌>' 进行身份验证。

基本使用方法

以下是一个LLM智能体与Pwno MCP服务器交互的典型工作流程示例:

  1. 编译目标二进制: 首先,LLM智能体可以使用 'run_command' 工具编译一个易受攻击的程序。
    执行工具: run_command
    参数: {"command": "gcc -g -fsanitize=address -fno-omit-frame-pointer vuln.c -o vuln", "cwd": "/workspace"}
  2. 加载二进制文件: 编译成功后,LLM智能体使用 'set_file' 工具将编译好的二进制文件加载到GDB中。
    执行工具: set_file
    参数: {"binary_path": "/workspace/vuln"}
  3. 设置断点并运行: LLM智能体可以在感兴趣的函数(如 'main')设置断点,然后使用 'run' 工具运行程序,程序将在断点处停止。
    执行工具: set_breakpoint
    参数: {"location": "main"}
    ---
    执行工具: run
    参数: {"args": ""}
  4. 单步调试和检查上下文: 程序停止后,LLM智能体可以使用 'step_control' 进行单步执行,并使用 'get_context' 工具获取当前的寄存器、堆栈、代码等调试信息,分析程序状态。
    执行工具: step_control
    参数: {"command": "n"}  // 执行下一行
    ---
    执行工具: get_context
    参数: {"context_type": "all"} // 获取所有上下文信息
  5. 读取内存: 如果需要检查特定内存区域的内容,LLM智能体可以使用 'get_memory' 工具。
    执行工具: get_memory
    参数: {"address": "$rsp", "size": 64, "format": "hex"} // 读取栈顶64字节的十六进制内容
  6. 管理后台服务(例如漏洞利用): 在某些漏洞利用场景中,可能需要启动一个后台服务。LLM智能体可以使用 'spawn_process' 启动一个进程,并通过 'get_process' 监控其状态。
    执行工具: spawn_process
    参数: {"command": "./vulnerable_server 8080", "cwd": "/workspace"}
    ---
    执行工具: get_process
    参数: {"pid": 12345} // 假设返回的PID是12345

信息

分类

开发者工具