关于 ntobjmanager-mcp
ntobjmanager-mcp 是面向安全研究人员的有状态 MCP 服务,用于研究 Windows RPC 攻击面。它结合持久 RPC 会话、实验室 VM 执行,以及针对已公开 CVE 研究方法的专用工具。
主要功能
- 01持久化 RPC 客户端与会话
- 02RPC 解析和端点发现
- 03CVE 研究流程工具
- 04在实验室 VM 中有状态执行 PowerShell
- 05记录工具调用审计日志
适用场景
- 01检查 Windows 二进制文件中的 RPC 接口
- 02跨调用测试上下文句柄行为
- 03盘点端点和已停止服务的接口
- 04在隔离实验室 VM 中开展 RPC 研究
MCP 相关
它通过 stdio 向 MCP 客户端提供 24 个 Windows RPC 研究工具,涵盖解析、枚举、连接、调用、模糊测试和 VM 执行。RPC 会话和存储对象可跨调用保持状态。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
🛰️ NtObjectManager-MCP
有状态的 Windows RPC 研究 MCP——将 2024–2026 年的 CVE 方法论变成一键工具
🌐 中文版
什么是 NtObjectManager-MCP?
一个 Model Context Protocol 服务,为 AI Agent 提供对 Windows RPC 攻击面的研究结果的实时、有状态访问。它基于 James Forshaw 的 NtObjectManager (NtCoreLib) 构建。
通用 PowerShell MCP 无法做到的三件事,也是本项目存在的原因:
- 有状态的 RPC 连接——持久化的 PowerShell 引擎可在多次工具调用之间保留已解析的
RpcServer对象和已连接的 RPC 客户端: 执行一次rpc_connect,即可多次调用rpc_call(身份验证握手、上下文句柄 链和会话变量均可保留)。 - 将 CVE 方法论作为固定工具——2024–2026 年公开研究中的标准漏洞搜寻工作流可一键执行,无需精心编写提示词。
- 在实验室虚拟机中进行有状态执行——将同一套单引擎原则应用于客户机:
rpc_vm_exec通过单个持久客户机运行空间,在多次调用之间保留变量和已连接的 RPC 客户端,而不是每次调用都启动一个全新的 Shell(vmrun 回退方案会报告stateful: false)。
┌────────────────────────────────────────────────────────────────────┐
│ AI Agent (Claude Code / OpenCode / any MCP client) │
│ │ MCP (stdio, 24 tools) │
│ ▼ │
│ server.py ── snippets.py (PS templates, @@TOKEN@@ + ps_str escape)│
│ │ │
│ ▼ │
│ ps_engine.py ── persistent powershell.exe (base64 + __MCP_DONE__) │
│ │ state: $RPCMCP = @{ Servers; Clients; vars } │
│ ▼ │
│ NtObjectManager / NtCoreLib ──► RPC runtime (ALPC / pipe / TCP) │
└────────────────────────────────────────────────────────────────────┘
工具矩阵(24 个)
核心有状态流水线
| 工具 | 用途 |
|---|---|
rpc_parse(file, symbol_path?) | 解析 PE 以查找 RPC 服务,并缓存(键为 file_N) |
rpc_state() | 已缓存的服务 + 活动会话 |
rpc_get_interface(key) | 过程、NDR 参数、上下文句柄、严格性 |
rpc_query_endpoints(ifid?, search_binding?, find_alpc_port?) | EPM 查询(本地或远程) |
rpc_running_servers(pid?/service?) | 活动进程/服务枚举 |
rpc_connect(session, key, binding?, auth?) | 生成并连接客户端(有状态) |
rpc_methods(session) | 带有操作号映射的签名 |
rpc_call(session, method, args_json, store_as?) | 通过反射调用;{"__var__"} 可传递已存储对象 |
rpc_disconnect(session) | 断开会话 |
虚拟机实验室桥接(有状态客户机执行)
| 工具 | 用途 |
|---|---|
rpc_vm_exec(ps, timeout?, vm?) | 在实验室虚拟机内运行 PowerShell;状态会在多次调用之间保留(持久客户机运行空间) |
rpc_vm_start_listener(vm?) | 部署/启动持久客户机 HTTP 引擎(vm_listener.ps1) |
2024–2026 CVE 方法论工具
| 工具 | 方法论来源 |
|---|---|
rpc_scan_context_handles(paths) | 上下文句柄类型混淆——CVE-2025-48815 模式(whereisk0shl 2026) |
rpc_inventory(paths?, limit?) | 攻击面清点 + EPM 交叉核查——MS-RPC-Fuzzer 阶段 1(CVE-2025-26651) |
rpc_fuzz(session, dry_run=True) | 仅对基本类型的默认值进行模糊测试,并分类为 ok/denied/error——默认 dry-run |
rpc_find_hijackable() | 已停止服务的未注册接口——EPM 投毒 / RPC-Racer(CVE-2025-49760/59200/59230) |
rpc_etw_unreachable(duration, trigger_script?) | 调用已失效服务端的客户端——PhantomRPC(Kaspersky 2026),需要管理员权限 |
rpc_interface_security(key) | ALPC SD / 匿名 ACE 审计——MS-NRPC 空会话(SafeBreach/Securelist 2025) |
rpc_decode_flags(flags) | RpcServerRegisterIf3 标志位掩码解码 |
rpc_format_client(key) | 导出生成的 C# 客户端源代码(离线 grep 工作流) |
rpc_new_struct(session, type, store_as) | 将 NDR 复合类型构建为会话变量 |
rpc_alpc_squat(name, duration) | ALPC 端口占位 + 连接捕获(竞态验证基本工具) |
rpc_accessible_tasks() | 用户可启动的任务(Dark-Elevator 链材料,CVE-2026-66804 模式) |
rpc_vars / rpc_clear_cache | 会话变量和缓存管理(淘汰上限为 150) |
每次工具调用都会追加记录到 output/mcp_audit.log。
实测验证(真实机器,完整狩猎流程)
| 候选项 | 结果 |
|---|---|
srvsvc.dll 98716d03… 标记为 HIGH | 识别为 XactSrv(XsOpenPrinter/XsClosePrinter/XsAddJob/XsScheduleJob)——单一打印机句柄类型;实时探测:非管理员可连接,但 XsOpenPrinter → ACCESS_DENIED(授权门控有效)。已记录扫描器误报模式 |
ssdpsrv.dll(CVE-2025-48815 原始问题) | 全部 20 个上下文句柄均为 strict——当前版本已修补 |
| 51 模块扫描 | 31 个发现项,6 个 HIGH,均为“一个生产者 → 多个使用者”;NDR 层无法证实多种类型句柄(需要 RE) |
| EPM 劫持面 | 10 个已停止服务存在未注册接口(AppIDSvc、ClipSVC、dcsvc……) |
| 任务链 | 清点出 44 个用户可启动的 SYSTEM 任务 |
| 结论 | 在受测主机上没有可确认的可利用漏洞——每个步骤均有证据 |
🚀 快速开始
# 1) Prerequisites (one-time)
Install-Module NtObjectManager -Scope CurrentUser -Force
pip install -r requirements.txt # mcp>=1.2.0 (1.x / 2.x compatible)
# 2) Verify — three suites, all green
python tests\smoke_test.py # 17 checks (live MCP stdio round-trip)
python tests\var_test.py # 10 checks (store_as / __var__ mechanics)
python tests\audit.py # 43 checks (edge cases, hostile paths, concurrency)
# 3) Run the server
python server.py # stdio MCP
Claude Code:
claude mcp add ntobjectmanager-rpc -- python C:\path\to\ntobjmanager-mcp\server.py
任意 MCP 客户端(例如 OpenCode opencode.json):
{
"mcp": {
"ntobjectmanager-rpc": {
"type": "local",
"command": ["python", "C:\\path\\to\\ntobjmanager-mcp\\server.py"],
"enabled": true
}
}
}
示例:上下文句柄类型混淆(CVE-2025-48815 模式)
1. rpc_parse C:\Windows\System32\target.dll [symbol_path optional]
2. rpc_scan_context_handles ["C:\\Windows\\System32\\target.dll"]
3. rpc_get_interface target_0 → producer ([out] ctx) / consumer ([in] ctx) pairs
4. rpc_connect s1 target_0 → auto-discovers binding via EPM
5. rpc_methods s1 → opnum-mapped signatures
6. rpc_call s1 XsOpenPrinter-like args store_as="h" → keep the raw handle object
7. rpc_call s1 XsClosePrinter-like [{"__var__":"h"}] → feed it to the other type
store_as / {"__var__"} 是核心链路基本工具:RPC 返回对象在不同调用间无需序列化往返即可传递,这正是测试生产者→使用者句柄混淆所需的能力。
📁 项目结构
ntobjmanager-mcp/
├── server.py # 24 MCP tools + audit logging wrapper
├── snippets.py # PowerShell templates (@@TOKEN@@ render + ps_str escaping)
├── ps_engine.py # Persistent engine: base64 cmds + __MCP_DONE__ markers, timeouts
├── wrapper.ps1 # PS-side loop (state lives in $RPCMCP)
├── vm_listener.ps1 # Persistent guest HTTP bridge (stateful VM exec)
├── tests/
│ ├── smoke_test.py # 17 checks — live stdio end-to-end
│ ├── var_test.py # 10 checks — store_as/__var__ object passing
│ ├── audit.py # 43 checks — hostile inputs, concurrency, engine kill/restart
│ ├── hunt.py # Full dogfood hunting round (safe policy)
│ ├── hunt2_static.py # Deep-dive: symbols + producer/consumer map
│ ├── hunt2_wide.py # 51-module sweep
│ └── hunt2_probe.py # Safe runtime probes (exposure / task cross-ref)
├── ARCHITECTURE.md # Engine protocol + design decisions
├── CHANGELOG.md # Decision history (R1–R13)
├── SECURITY.md # Authorized-use policy + MSRC disclosure
├── CONTRIBUTING.md # Development invariants
└── LICENSE # MIT
🛡️ 如实说明能力边界
| 声明 | 状态 |
|---|---|
| 跨工具调用的有状态客户端 | 是——持久化引擎 + $RPCMCP |
| 在实验室虚拟机内有状态执行 | 是——一个持久化的来宾运行空间(rpc_vm_exec);vmrun 回退方案为无状态 |
| 上下文句柄链式传递(生产者 → 使用者) | 是——通过 store_as / __var__ 传递原始对象 |
| 自动确认类型混淆 | 否——NDR 无法证实句柄类型不同;需通过 RE 验证(参见 XactSrv 案例) |
| 完整的恶意 RPC 托管 | 否——NtObjectManager 2.0.1 未提供服务端构建器;rpc_alpc_squat 仅支持竞态捕获 |
| ETW 跟踪 / ALPC SDDL | 需要管理员权限(logman / SeDebugPrivilege) |
| 符号解析的过程名称 | 取决于环境(symsrv 链);否则使用启发式回退名称 |
| 在 Windows PS 5.1 以外的环境运行 | 尚未支持(未测试 pwsh 7) |
📖 文档
- ARCHITECTURE.md — 引擎协议、状态模型、设计决策
- CHANGELOG.md — R1–R13 决策历史,包括两个 PS 5.1 编组错误
- SECURITY.md — 授权使用、虚拟机隔离、MSRC 漏洞披露
- CONTRIBUTING.md — 开发不变量和测试要求
⚠️ 免责声明
仅用于合法的安全研究、教育和授权测试。
rpc_call 会调用真实的 RPC 方法,可能导致服务崩溃——请在隔离的虚拟机中运行,切勿在生产主机或日常使用的主机上运行。通过此工具发现的漏洞必须遵循负责任的漏洞披露流程(MSRC)。
📄 许可证
MIT — 版权所有 (c) 2026 ntobjmanager-mcp Contributors
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。