UncleJ4ck/Phage
GitHub: UncleJ4ck/Phage
Phage 是一个结合进化算法的 HTTP/3 协议模糊测试与请求走私漏洞研究工具,用于发现 QUIC/H3 服务器中的 desync 向量。
Stars: 0 | Forks: 0
# Phage
Phage 是一个安全研究工具,用于对 HTTP/3(基于 QUIC)服务器进行 fuzzing 和 racing,并用于演进 HTTP/3 到 HTTP/1 的请求走私(request-smuggling) desync 向量。它实现了 `Quic-Fin-Sync` 竞态条件原语,并在其上层叠加了演进式搜索。
Phage 最初是 CyberArk Labs 的 [QuicDrawH3](https://github.com/cyberark/QuicDrawH3)(由 Maor Abutbul 编写的 `Quic-Fin-Sync` racing 客户端),最初发表于“[Racing and Fuzzing HTTP/3](https://www.cyberark.com/resources/threat-research-blog/racing-and-fuzzing-http-3-open-sourcing-quicdraw)”。
此 fork 版本添加了 `phage.evo`:一个覆盖率引导的、质量多样的演进引擎,它通过受生物学和物理学启发的搜索机制,在 H3 帧空间中搜索 desync。参见 [docs/EVO.md](docs/EVO.md)。
## 目录
- [Phage](#phage)
- [主要功能](#main-features)
- [快速开始](#quick-start)
- [使用 pip 安装](#install-using-pip)
- [通过克隆源码在本地构建并安装(可选)](#build-and-install-locally-by-cloning-the-source-optional)
- [用法](#usage)
- [打印帮助](#print-help)
- [常规 HTTP/3(基于 QUIC)请求](#normal-http3-over-quic-requests)
- [将 TLS 密钥记录到文件 `-l SECRETS_LOG`](#log-tls-secrets-to-file--l-secrets_log)
- [详细日志 `-v`](#verbose-logging--v)
- [测试 HTTP3 应用中的竞态条件 `-tr TOTAL_REQUESTS`](#testing-race-conditions-in-http3-applications--tr-total_requests)
- [Racing 示例](#racing-example)
- [对 HTTP3 应用进行 Fuzzing `-d` DATA `-w` WORDLIST](#fuzzing-http3-applications--d-data--w-wordlist)
- [Fuzzing 示例](#fuzzing-example)
- [Phage-UI](#phage-ui)
- [使用 pip (PyPi) 安装 phage-ui](#install-phage-ui-using-pip-pypi)
- [示例 1:简单的 HTTP/3 请求](#example-1-simple-http3-request)
- [示例 2:使用 Wordlist 进行 Fuzzing](#example-2-fuzzing-with-a-wordlist)
- [贡献](#contributing)
- [局限性](#limitations)
- [已知问题](#known-issues)
- [许可证](#license)
- [致谢](#credits)
- [联系方式](#contact)
## 主要功能
- 在 HTTP3(基于 QUIC)上实现 `Quic-Fin-Sync`,用于竞态条件测试。
- 支持通过 `FUZZ` 和 wordlist(`-w` 参数)机制对多个请求进行 fuzzing。
- 自定义 HTTP 标头功能(`-H` 参数)。
- 注意:自定义标头会被转换为小写,因为我们发现某些服务器实现存在大小写相关的问题。
- 支持 SSLKEYLOGFILE(`-l` 参数),以便通过 Wireshark 等网络包分析器进行 TLS 解密/检查。
- 基于 aioquic (http3_client)
- [aioquic](https://github.com/aiortc/aioquic) 是一个用于 Python 中 QUIC 网络协议的库。
- 它包含一个极简的 TLS 1.3 实现、一个 QUIC 协议栈和一个 HTTP/3 协议栈。
## 快速开始
前置条件:
- python \>=3.9
- pip3
## 使用 pip 安装
安装 Phage 最简单的方法是运行:
```
pip install phage
```
### 使用 pip (PyPi) 安装 phage-ui
安装 Phage-UI 最简单的方法是运行:
```
pip install phage[ui]
phage-ui -h
```
### 运行(在 pip 安装之后)
```
phage -h
```
### 通过克隆源码在本地构建并安装(可选)
如果你的系统没有对应的 wheels,或者你希望从源码构建 Phage。
克隆仓库:
```
git clone https://github.com/UncleJ4ck/Phage.git
python3 -m build
pip install .\dist\phage-.tar.gz
```
安装模块依赖。(你可能更倾向于在[虚拟环境](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/)中执行此操作)
## 用法
### 打印帮助
```
phage -h
```
### 常规 HTTP/3(基于 QUIC)请求
### 一个 HTTP/3 GET 请求
```
phage
```
### 一个 HTTP/3 POST 请求
HTTP POST 请求是通过使用 `-d` 参数加上要发送的 HTTP POST 数据来确定的。
```
phage -d '{"key":"value"}'
```
### 将 TLS 密钥记录到文件 `-l SECRETS_LOG`
将密钥记录到文件中,以便配合 Wireshark 使用
要在 Wireshark 中检查流量:打开 Wireshark → 编辑 (Edit) → 首选项 (Preferences) → 协议 → TLS,并将“(Pre)-Master-Secret log filename”设置为 secrets.log 的完整路径。
### 详细日志 `-v`
使用详细(`-v`)输出将会记录(打印)要发送的请求数据和 HTTP 响应内容。
在 GET 请求的情况下(未提供 `-d` 参数),将会记录(打印)请求的 URL(:path)。
### 测试 HTTP3 应用中的竞态条件 `-tr TOTAL_REQUESTS`
若要多次使用相同的请求(使用 `Quic-Fin-Sync` / `single-packet`),请使用 `-tr/--total-requests` 参数。
注意:如果指定了 WORDLIST(`-w`)参数,此参数(`-tr TOTAL_REQUESTS`)将被 wordlist 的行数覆盖。
### Racing 示例
#### 将相同请求重复 12 次(`-tr 12`)(使用 `Quic-Fin-Sync`)
```
phage -d '{"key":"value"}' -H 'Authorization: bearer eyJ...' -tr 12
```
#### 将相同请求重复 12 次(`-tr 12`),使用 `Quic-Fin-Sync` 并记录(`-l`)TLS 密钥
```
phage -d '{"key":"value"}' -H 'Authorization: bearer eyJ...' -H 'content-type: application/json' -l /m2a/ssl_key_log_file.log -tr 12
```
#### 将相同请求重复 12 次(`-tr 12`),使用 `Quic-Fin-Sync`,记录(`-l`)TLS 密钥,并打印包含 HTTP 响应内容的详细(`-v`)输出
```
phage -d '{"key": "value"}' -H 'Authorization: bearer eyJ...' -H 'content-type: application/json' -l /m2a/ssl_key_log_file.log -tr 12 -v
```
### 对 HTTP3 应用进行 Fuzzing `-d` DATA `-w` WORDLIST
Phage 中的 Fuzzing 基于一个简单的概念,类似于其他 Web Fuzzer([Ffuf](https://github.com/ffuf/ffuf)、[Wfuzz](https://github.com/xmendez/wfuzz)),它会遍历数据部分(`-d`),并将对 `FUZZ` 关键字的任何引用替换为 wordlist(`-w`)中作为 payload 给定的值。
要定义 fuzzing,请在数据(`-d 参数`)部分的任意位置使用带有 `FUZZ` 关键字的 wordlist(`-w`/`--wordlist`)参数。
注意:如果 payload(`-d`)不包含 `FUZZ` 关键字,系统将根据 wordlist 文件中的_行数_发送相同的数据。
### Fuzzing 示例
#### 使用 `Quic-Fin-Sync`,遍历数据部分(`-d`),并将对 `FUZZ` 关键字的任何引用替换为 wordlist 文件(`-w`)中作为 payload 给定的值
```
phage -w path/to/wordlist -d '{"example_key":"FUZZ"}'
```
# Phage-UI
Phage-UI 是一个 HTTP/3 请求编辑器:Phage 的 fuzzing 和 racing 客户端的 GUI。
## 使用 pip (PyPi) 安装 phage-ui
安装 Phage-UI 最简单的方法是运行:
```
pip install phage[ui]
phage-ui -h
```
## 示例 1:简单的 HTTP/3 请求
向 HTTP/3 服务器发送一个基本请求:
```
phage-ui https://example.com
```
**HTTP/3 请求编辑器:** 
**高级选项卡**

可以通过高级选项卡设置以下选项
选项 描述
`-l, --secrets-log` TLS 密钥文件(用于 Wireshark)
`-v, --verbose` 详细输出
**结果选项卡:**

## 示例 2:使用 Wordlist 进行 Fuzzing
要对 HTTP/3 endpoint 进行 fuzzing,你需要:
```
phage-ui https://example.com -w path/to/wordlist -d '{"example_key":"FUZZ"}'
```

`{"example_key":"FUZZ"}` 中的 `FUZZ` 关键字将被替换为你的 wordlist 文件中的每一行。
## 命令行选项
Phage-UI 的参数已导入到 UI 中。
选项 描述
`-d, --data` HTTP POST 数据(使用 `FUZZ` 进行 wordlist 替换)
`-H, --header` 自定义标头(可重复使用)
`-b, --cookie` 自定义 cookie 标头
`-w, --wordlist` Fuzzing wordlist 文件
`-tr, --total-requests` 并发请求数(竞态测试)
`-l, --secrets-log` TLS 密钥文件(用于 Wireshark)
`-v, --verbose` 详细输出
注意:“兼容 copy-as-curl”意味着 Phage-UI 支持常见的 curl 参数 (-d,-H,-b)。
# 局限性
- `Quic-Fin-Sync` 在 POST 请求中(使用 `-d` 参数)最为有效。
- GET 请求也会从该机制中受益,但根据我们的测试,只有少数请求能“容纳”在单个 QUIC 数据包中。
- fuzzing 机制(`FUZZ` 和 `--wordlist/-w`)仅在 POST 消息数据**或** GET 请求的 URL(:path)参数中有效。
- 目前,fuzzing 机制仅能运行**一次**,这意味着如果提供了 data 参数(`-d`),我们假定是对 POST 数据进行 fuzzing,如果在 URL(:path)中提供 `FUZZ` 关键字,将导致 URL(:path)按原样发送(包含 `FUZZ` 关键字)。
- 当前版本不支持多个不同的域名。(对于不同的路径,你可以在 URL 的路径部分使用 FUZZ 关键字)
# 已知问题
- 发生 DNS 错误时 - 返回以下错误:“socket.gaierror: \[Errno 11001\] getaddrinfo failed”
# 许可证
版权所有 (c) 2025 CyberArk Software Ltd. 保留所有权利。本仓库根据 Apache-2.0 许可证授权 - 有关更多详细信息,请参见 [`LICENSE`](LICENSE)。
# 联系方式
如有功能请求或 Bug,请提交 GitHub issue。
标签:CISA项目, HTTP/3, Python, QUIC, 无后门, 请求走私, 逆向工具