Skip to content

UncleJ4ck/Phage

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

44 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Phage

Phage is a security research tool for fuzzing and racing HTTP/3 (over QUIC) servers, and for evolving HTTP/3-to-HTTP/1 request-smuggling desync vectors. It implements the Quic-Fin-Sync race-condition primitive and layers an evolutionary search on top of it.

Phage began as CyberArk Labs' QuicDrawH3 (the Quic-Fin-Sync racing client by Maor Abutbul), originally published in "Racing and Fuzzing HTTP/3". This fork adds phage.evo: a coverage-guided, quality-diverse evolutionary engine that searches the H3 framing space for desyncs, with biology- and physics-inspired search mechanisms. See docs/EVO.md.

TOC

 Main Features

  • Implements the Quic-Fin-Sync on HTTP3 (over QUIC), for race-condition testing.
  • Supports fuzzing multiple requests with the FUZZ and wordlist (-w argument) mechanisms.
  • Custom HTTP headers functionality (-H argument).
    • Note: Custom headers are converted to lowercase since we have seen issues with some server implementations.
  • Supports SSLKEYLOGFILE (-l argument) for TLS decryption/inspection via packet analyzers such as Wireshark.
  • Based on aioquic (http3_client)
    • aioquic is a library for the QUIC network protocol in Python.
    • It features a minimal TLS 1.3 implementation, a QUIC stack, and an HTTP/3 stack.

Quick Start

Prerequisite:

  • python >=3.9
  • pip3

Install using pip

The easiest way to install Phage is to run:

pip install phage

Install phage-ui using pip (PyPi)

The easiest way to install Phage-UI is to run:

pip install phage[ui]
phage-ui -h

Runninig (after pip install)

phage -h

Build and install locally by cloning the source (optional)

If there are no wheels for your system or if you wish to build Phage from source.

Clone the repository:

git clone https://github.com/UncleJ4ck/Phage.git
python3 -m build
pip install .\dist\phage-<VERSION>.tar.gz

Install module dependencies. (You may prefer to do this within a Virtual Environment)


Usage

Print Help

phage -h

Normal HTTP/3 (over QUIC) Requests

An HTTP/3 GET Request

phage <https://http3_server.com/path>

An HTTP/3 POST Request

HTTP POST requests are determined by using the -d argument followed by the HTTP POST data to be sent.

phage <https://http3_server.com/path> -d '{"key":"value"}'

Log TLS Secrets to file -l SECRETS_LOG

log secrets to a file, for use with Wireshark

To inspect the traffic in wireshark: Open Wireshark → Edit → Preferences → Protocols → TLS and set "(Pre)-Master-Secret log filename" to the full path of secrets.log

Verbose logging -v

Using the verbose (-v) output will log (print) the request data to be sent and the HTTP response content.

In the case of GET requests (no -d argument supplied), the request URL (:path) will be logged (printed).

Testing Race-Conditions in HTTP3 applications -tr TOTAL_REQUESTS

To use the same request multiple times (using the Quic-Fin-Sync / single-packet), use the -tr/--total-requests argument.

Note: If a WORDLIST (-w) argument is specified, this argument (-tr TOTAL_REQUESTS) is overridden by the wordlist number of lines.

Racing example

Repeat the same request 12 times (-tr 12) (using Quic-Fin-Sync)

phage <https://http3_server.com/path> -d '{"key":"value"}' -H 'Authorization: bearer eyJ...' -tr 12

Repeat the same request 12 times (-tr 12), use Quic-Fin-Sync and log (-l) TLS secrets

phage <https://http3_server.com/path> -d '{"key":"value"}' -H 'Authorization: bearer eyJ...' -H 'content-type: application/json' -l /m2a/ssl_key_log_file.log -tr 12

Repeat the same request 12 times (-tr 12), use Quic-Fin-Sync, log (-l) TLS secrets, and print verbose (-v) output including HTTP response content

phage <https://http3_server.com/path> -d '{"key": "value"}' -H 'Authorization: bearer eyJ...' -H 'content-type: application/json' -l /m2a/ssl_key_log_file.log -tr 12 -v

Fuzzing HTTP3 applications -d DATA -w WORDLIST

Fuzzing in Phage is based on a simple concept, like other web fuzzers (Ffuf, Wfuzz), go over the data section (-d), and replace any reference to the FUZZ keyword with the value given in the wordlist (-w) as the payload.

To define fuzzing, use the wordlist (-w/--wordlist) argument with the FUZZ keyword anywhere in the DATA (-d argument) section.

Note: If the payload (-d) does not include the FUZZ keyword, the same data will be sent according to the number of lines in the wordlist file.

Fuzzing Example

Use Quic-Fin-Sync, go over the data section (-d), and replace any reference to the FUZZ keyword with the value given in the wordlist file (-w) as the payload

phage <https://http3_server.com/path> -w path/to/wordlist -d '{"example_key":"FUZZ"}'

Phage-UI

Phage-UI is an HTTP/3 request editor: a GUI for Phage's fuzzing and racing client.

Install phage-ui using pip (PyPi)

The easiest way to install Phage-UI is to run:

pip install phage[ui]
phage-ui -h

Example 1: Simple HTTP/3 Request

Send a basic request to an HTTP/3 server:

phage-ui https://example.com

HTTP/3 Request Editor: HTTP/3 Request Editor

Advanced Tab

Advanced Tab

The following options can be set by the advanced tab

Option Description


-l, --secrets-log TLS secrets file (for Wireshark) -v, --verbose Verbose output

Results Tab:

Results Tab


Example 2: Fuzzing with a Wordlist

To fuzz an HTTP/3 endpoint, you need:

  1. A wordlist file (-w) - contains payloads to test (one per line)
  2. The FUZZ keyword in your data - gets replaced by each wordlist entry
phage-ui https://example.com -w path/to/wordlist -d '{"example_key":"FUZZ"}'

Fuzzing Example

The FUZZ keyword in {"example_key":"FUZZ"} will be replaced with each line from your wordlist file.


Command-Line Options

Phage-UI parameters are imported to the UI.


Option Description


-d, --data HTTP POST data (use FUZZ for wordlist substitution)

-H, --header Custom header (repeatable)

-b, --cookie Custom cookie header

-w, --wordlist Fuzzing wordlist file

-tr, --total-requests Number of concurrent requests (race testing)

-l, --secrets-log TLS secrets file (for Wireshark)

-v, --verbose Verbose output


Note: "copy-as-curl compatible" meaning common curl arguments (-d,-H,-b) are supported by Phage-UI.


Contributing

We welcome contributions of all kinds to this repository. For instructions on how to get started and descriptions of our development workflows, please see our contributing guide

Limitations

  • The Quic-Fin-Sync is mostly effective in POST requests (using the -d argument).
    • GET requests will benefit from the mechanism, but according to our tests, only a few requests "fit" on a single QUIC packet.
  • The fuzzing mechanism (FUZZ and --wordlist/-w) only works in POST messages data or in the GET request URL (:path) argument.
  • Currently, the fuzzing mechanism only works once, meaning if the data argument is supplied (-d), we assume fuzzing on the POST data, supplying the FUZZ keyword in the URL (:path) will result in sending the URL (:path) as-is (including the FUZZ keyword).
  • We do not support multiple different domains in the current version. (For different paths, you can use the FUZZ keyword in the URL's path part)

Known issues

  • On DNS error - the following error returned: "socket.gaierror: [Errno 11001] getaddrinfo failed"

License

Copyright (c) 2025 CyberArk Software Ltd. All rights reserved This repository is licensed under the Apache-2.0 License - see LICENSE for more details.

Credits

Phage is a fork of CyberArk Labs' QuicDrawH3, the Quic-Fin-Sync racing client by Maor Abutbul, published in "Racing and Fuzzing HTTP/3". The phage.evo evolutionary engine and the HTTP/3-to-HTTP/1 downgrade research are additions on top of that base.

Built on aioquic.

Contact

Open a GitHub issue for feature requests or bugs.

About

Phage: an evolutionary HTTP/3-to-HTTP/1 request-smuggling desync fuzzer. A fork of CyberArk QuicDrawH3 that adds a MAP-Elites engine, QUIC-state genes (bare FIN, RESET), and H3/H2 downgrade operators on top of the Quic-Fin-Sync primitive.

Topics

Resources

License

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages

  • Python 97.6%
  • JavaScript 1.4%
  • Other 1.0%