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 请求编辑器:** ![HTTP/3 请求编辑器](screenshots/QD-UI_basic_1.png "HTTP/3 Request Editor") **高级选项卡** ![高级选项卡](screenshots/QD-UI_basic_3.png "Advanced Tab") 可以通过高级选项卡设置以下选项 选项 描述 `-l, --secrets-log` TLS 密钥文件(用于 Wireshark) `-v, --verbose` 详细输出 **结果选项卡:** ![结果选项卡](screenshots/QD-UI_basic_2.png "Results Tab") ## 示例 2:使用 Wordlist 进行 Fuzzing 要对 HTTP/3 endpoint 进行 fuzzing,你需要: ``` phage-ui https://example.com -w path/to/wordlist -d '{"example_key":"FUZZ"}' ``` ![Fuzzing 示例](https://static.pigsec.cn/wp-content/uploads/repos/cas/ae/aee87b575224732c5babd506fcbe6e238c9c562cd2b58109add96a85f6cc47b3.png) `{"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, 无后门, 请求走私, 逆向工具