项目简介
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容器部署,以确保环境的隔离和一致性。
-
构建Docker镜像: 在项目根目录下执行以下命令构建Docker镜像。 '--platform linux/amd64' 参数确保镜像在x86-64架构上运行。
docker build -t pwno-mcp:latest . --platform linux/amd64 -
运行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服务器交互的典型工作流程示例:
- 编译目标二进制:
首先,LLM智能体可以使用 'run_command' 工具编译一个易受攻击的程序。
执行工具: run_command 参数: {"command": "gcc -g -fsanitize=address -fno-omit-frame-pointer vuln.c -o vuln", "cwd": "/workspace"} - 加载二进制文件:
编译成功后,LLM智能体使用 'set_file' 工具将编译好的二进制文件加载到GDB中。
执行工具: set_file 参数: {"binary_path": "/workspace/vuln"} - 设置断点并运行:
LLM智能体可以在感兴趣的函数(如 'main')设置断点,然后使用 'run' 工具运行程序,程序将在断点处停止。
执行工具: set_breakpoint 参数: {"location": "main"} --- 执行工具: run 参数: {"args": ""} - 单步调试和检查上下文:
程序停止后,LLM智能体可以使用 'step_control' 进行单步执行,并使用 'get_context' 工具获取当前的寄存器、堆栈、代码等调试信息,分析程序状态。
执行工具: step_control 参数: {"command": "n"} // 执行下一行 --- 执行工具: get_context 参数: {"context_type": "all"} // 获取所有上下文信息 - 读取内存:
如果需要检查特定内存区域的内容,LLM智能体可以使用 'get_memory' 工具。
执行工具: get_memory 参数: {"address": "$rsp", "size": 64, "format": "hex"} // 读取栈顶64字节的十六进制内容 - 管理后台服务(例如漏洞利用):
在某些漏洞利用场景中,可能需要启动一个后台服务。LLM智能体可以使用 'spawn_process' 启动一个进程,并通过 'get_process' 监控其状态。
执行工具: spawn_process 参数: {"command": "./vulnerable_server 8080", "cwd": "/workspace"} --- 执行工具: get_process 参数: {"pid": 12345} // 假设返回的PID是12345
信息
分类
开发者工具