
Python-basiertes Werkzeug zum Testen von HTTP-Request-Smuggling und Desynchronisation, das CL.TE- und TE.CL-Schwachstellen mit konfigurierbaren Mutations-Payloads und automatisierter Überprüfung erkennt.
______ _
/ _____) | |
( (____ ____ _ _ ____ ____| | _____ ____
\____ \| \| | | |/ _ |/ _ | || ___ |/ ___)
_____) ) | | | |_| ( (_| ( (_| | || ____| |
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|
(_____(_____|
@defparam
Ein Tool zum Testen von HTTP-Request-Smuggling/-Desync, geschrieben in Python 3
Ein besonderer Dank geht an James Kettle für seine Forschung und Methoden zu HTTP-Desyncs
Und ein besonderer Dank an Ben Sadeghipour für das Beta-Testen von Smuggler und dafür, dass er mir erlaubt hat, meine Arbeit auf der Nahamcon 2020 zu besprechen.
Dieses Tool garantiert keine Fehlerfreiheit von Falsch-Positiven oder Falsch-Negativen. Nur weil eine Mutation möglicherweise OK meldet, heißt das nicht, dass es kein Desync-Problem gibt, aber wichtiger noch: Nur weil das Tool ein potenzielles Desync-Problem anzeigt, heißt das nicht, dass definitiv eines existiert. Das Skript kann auf Anfrageverarbeiter großer Entitäten (z. B. Google/AWS/Yahoo/Akamai/usw.) stoßen, die falsch-positive Ergebnisse liefern können.
Einzelner Host:
python3 smuggler.py -u <URL>
Liste von Hosts:
cat list_of_hosts.txt | python3 smuggler.py
usage: smuggler.py [-h] [-u URL] [-v VHOST] [-x] [-m METHOD] [-l LOG] [-q]
[-t TIMEOUT] [--no-color] [-c CONFIGFILE]
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL Target URL with Endpoint
-v VHOST, --vhost VHOST
Specify a virtual host
-x, --exit_early Exit scan on first finding
-m METHOD, --method METHOD
HTTP method to use (e.g GET, POST) Default: POST
-l LOG, --log LOG Specify a log file
-q, --quiet Quiet mode will only log issues found
-t TIMEOUT, --timeout TIMEOUT
Socket timeout value Default: 5
--no-color Suppress color codes
-c CONFIGFILE, --configfile CONFIGFILE
Filepath to the configuration file of payloads
Smuggler benötigt mindestens entweder eine URL über das Argument -u/--url oder eine Liste von URLs, die über stdin an das Skript übergeben werden.
Wenn die URL https:// angibt, verbindet sich Smuggler mit SSL/TLS mit dem Host:Port. Wenn die URL http:// angibt,
wird überhaupt kein SSL/TLS verwendet. Wenn nur der Host angegeben wird, verwendet das Skript standardmäßig https://
Verwenden Sie -v/--vhost <host>, um einen anderen Host-Header als die Serveradresse anzugeben.
Verwenden Sie -x/--exit_early, um den Scan eines bestimmten Servers zu beenden, wenn ein potenzielles Problem gefunden wird. Im gepipelten Modus fährt Smuggler einfach mit dem nächsten Host auf der Liste fort.
Verwenden Sie -m/--method <method>, um ein anderes HTTP-Verb als POST anzugeben (z. B. GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD usw.)
Verwenden Sie -l/--log <file>, um die Ausgabe sowohl in eine Datei als auch nach stdout zu schreiben.
Verwenden Sie -q/--quiet, um die Ausführlichkeit zu reduzieren und nur gefundene Probleme zu protokollieren.
Verwenden Sie -t/--timeout <value>, um das Socket-Timeout anzugeben. Der Wert sollte hoch genug sein, um festzustellen, dass der Socket hängt, aber niedrig genug, um den Test zu beschleunigen (Standard: 5).
Verwenden Sie --no-color, um die ausgegebenen Farbcodes in stdout zu unterdrücken (Logs enthalten standardmäßig keine Farbcodes).
Verwenden Sie -c/--configfile <configfile>, um Ihre eigene Smuggler-Mutationskonfigurationsdatei anzugeben (Standard: default.py).
Konfigurationsdateien sind Python-Dateien, die im Verzeichnis ./config von Smuggler existieren. Diese Dateien beschreiben den Inhalt der HTTP-Anfragen und die zu testenden Transfer-Encoding-Mutationen.
Hier ist ein Beispielinhalt von default.py:
def render_template(gadget):
RN = "\r\n"
p = Payload()
p.header = "__METHOD__ __ENDPOINT__?cb=__RANDOM__ HTTP/1.1" + RN
# p.header += "Transfer-Encoding: chunked" +RN
p.header += gadget + RN
p.header += "Host: __HOST__" + RN
p.header += "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" + RN
p.header += "Content-type: application/x-www-form-urlencoded; charset=UTF-8" + RN
p.header += "Content-Length: __REPLACE_CL__" + RN
return p
mutations["nameprefix1"] = render_template(" Transfer-Encoding: chunked")
mutations["tabprefix1"] = render_template("Transfer-Encoding:\tchunked")
mutations["tabprefix2"] = render_template("Transfer-Encoding\t:\tchunked")
mutations["space1"] = render_template("Transfer-Encoding : chunked")
for i in [0x1,0x4,0x8,0x9,0xa,0xb,0xc,0xd,0x1F,0x20,0x7f,0xA0,0xFF]:
mutations["midspace-%02x"%i] = render_template("Transfer-Encoding:%cchunked"%(i))
mutations["postspace-%02x"%i] = render_template("Transfer-Encoding%c: chunked"%(i))
mutations["prespace-%02x"%i] = render_template("%cTransfer-Encoding: chunked"%(i))
mutations["endspace-%02x"%i] = render_template("Transfer-Encoding: chunked%c"%(i))
mutations["xprespace-%02x"%i] = render_template("X: X%cTransfer-Encoding: chunked"%(i))
mutations["endspacex-%02x"%i] = render_template("Transfer-Encoding: chunked%cX: X"%(i))
mutations["rxprespace-%02x"%i] = render_template("X: X\r%cTransfer-Encoding: chunked"%(i))
mutations["xnprespace-%02x"%i] = render_template("X: X%c\nTransfer-Encoding: chunked"%(i))
mutations["endspacerx-%02x"%i] = render_template("Transfer-Encoding: chunked\r%cX: X"%(i))
mutations["endspacexn-%02x"%i] = render_template("Transfer-Encoding: chunked%c\nX: X"%(i))
Es gibt noch keine Eingabeargumente, um eigene benutzerdefinierte Header und User-Agents anzugeben. Es wird empfohlen, eine eigene Konfigurationsdatei basierend auf default.py zu erstellen und nach Ihren Wünschen zu ändern.
Smuggler wird mit 3 Konfigurationsdateien ausgeliefert: default.py (schnell), doubles.py (speziell, langsam), exhaustive.py (sehr langsam) default.py ist am schnellsten, da es weniger Mutationen enthält.
Konfigurationsdateien mit der Befehlszeilenoption -c/--configfile <configfile> angeben.
Im Smuggler-Verzeichnis befindet sich das Verzeichnis payloads. Wenn Smuggler ein potenzielles CLTE- oder TECL-Desync-Problem findet, wird es automatisch eine binäre txt-Datei des problematischen Payloads im payloads-Verzeichnis ablegen. Alle Payload-Dateinamen sind mit dem Hostnamen, dem Desync-Typ und dem Mutationstyp annotiert. Verwenden Sie diese Payloads, um sich direkt per Netcat mit dem Server zu verbinden oder sie in andere Analysetools zu importieren.
Wenn Sie ein Desync-Problem gefunden haben, können Sie gerne meine Turbo-Intruder-Desync-Skripte verwenden, die Sie hier finden: https://github.com/defparam/tiscripts
DesyncAttack_CLTE.py und DesyncAttack_TECL.py sind großartige Skripte, um einen Desync-Angriff vorzubereiten.
Diese Skripte werden unter der MIT-Lizenz veröffentlicht. Siehe LICENSE.