
Outil de test de désynchronisation et de contrebande de requêtes HTTP basé sur Python qui détecte les vulnérabilités CL.TE et TE.CL en utilisant des charges utiles de mutation configurables et un balayage automatisé.
______ _
/ _____) | |
( (____ ____ _ _ ____ ____| | _____ ____
\____ \| \| | | |/ _ |/ _ | || ___ |/ ___)
_____) ) | | | |_| ( (_| ( (_| | || ____| |
(______/|_|_|_|____/ \___ |\___ |\_)_____)_|
(_____(_____|
@defparam
Un outil de test de contrebande de requêtes HTTP / désynchronisation écrit en Python 3
Un remerciement spécial à James Kettle pour ses recherches et méthodes sur les désynchronisations HTTP
Et un remerciement spécial à Ben Sadeghipour pour avoir bêta-testé Smuggler et pour m'avoir permis de discuter de mon travail à Nahamcon 2020
Cet outil ne garantit pas l'absence de faux positifs ou de faux négatifs. Ce n'est pas parce qu'une mutation signale OK qu'il n'y a pas de problème de désynchronisation, mais plus important encore, ce n'est pas parce que l'outil indique un problème potentiel de désynchronisation qu'il en existe définitivement un. Le script peut rencontrer des processeurs de requêtes de grandes entités (par exemple Google/AWS/Yahoo/Akamai/etc.) pouvant afficher des résultats faussement positifs.
Hôte unique :
python3 smuggler.py -u <URL>
Liste d'hôtes :
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 affiche ce message d'aide et quitte
-u URL, --url URL URL cible avec le point de terminaison
-v VHOST, --vhost VHOST
Spécifie un hôte virtuel
-x, --exit_early Quitte le scan dès la première découverte
-m METHOD, --method METHOD
Méthode HTTP à utiliser (par exemple GET, POST) Défaut : POST
-l LOG, --log LOG Spécifie un fichier de log
-q, --quiet Mode silencieux, ne logue que les problèmes trouvés
-t TIMEOUT, --timeout TIMEOUT
Valeur de timeout de socket Défaut : 5
--no-color Supprime les codes couleur
-c CONFIGFILE, --configfile CONFIGFILE
Chemin du fichier de configuration des charges utiles
Smuggler nécessite au minimum soit une URL via l'argument -u/--url, soit une liste d'URLs transmise via l'entrée standard. Si l'URL spécifie https://, Smuggler se connectera à l'hôte:port en utilisant SSL/TLS. Si l'URL spécifie http://, aucun SSL/TLS ne sera utilisé. Si seul l'hôte est spécifié, le script utilisera https:// par défaut.
Utilisez -v/--vhost <host> pour spécifier un en-tête Host différent de l'adresse du serveur.
Utilisez -x/--exit_early pour quitter le scan d'un serveur donné lorsqu'un problème potentiel est trouvé. En mode pipé, Smuggler continuera simplement vers l'hôte suivant de la liste.
Utilisez -m/--method <method> pour spécifier un verbe HTTP différent de POST (par exemple GET/PUT/PATCH/OPTIONS/CONNECT/TRACE/DELETE/HEAD/etc...)
Utilisez -l/--log <file> pour écrire la sortie dans un fichier en plus de la sortie standard.
Utilisez -q/--quiet pour réduire la verbosité et ne loguer que les problèmes trouvés.
Utilisez -t/--timeout <value> pour spécifier le timeout de la socket. La valeur doit être suffisamment élevée pour conclure que la socket est bloquée, mais suffisamment basse pour accélérer les tests (défaut : 5).
Utilisez --no-color pour supprimer les codes couleur imprimés sur la sortie standard (les logs n'incluent pas les codes couleur par défaut).
Utilisez -c/--configfile <configfile> pour spécifier votre fichier de configuration de mutations Smuggler (défaut : default.py).
Les fichiers de configuration sont des fichiers Python qui se trouvent dans le répertoire ./config de Smuggler. Ces fichiers décrivent le contenu des requêtes HTTP et les mutations de l'encodage de transfert à tester.
Voici un exemple de contenu de 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))
Il n'y a pas encore d'arguments d'entrée pour spécifier vos propres en-têtes personnalisés et user-agents. Il est recommandé de créer votre propre fichier de configuration basé sur default.py et de le modifier selon vos besoins.
Smuggler est livré avec 3 fichiers de configuration : default.py (rapide), doubles.py (spécifique, lent), exhaustive.py (très lent). default.py est le plus rapide car il contient moins de mutations.
spécifiez les fichiers de configuration à l'aide de l'option de ligne de commande -c/--configfile <configfile>
Dans le répertoire Smuggler se trouve le répertoire payloads. Lorsque Smuggler trouve un problème potentiel de désynchronisation CLTE ou TECL, il sauvegarde automatiquement un fichier texte binaire de la charge utile problématique dans le répertoire payloads. Tous les noms de fichiers de charges utiles sont annotés avec le nom d'hôte, le type de désynchronisation et le type de mutation. Utilisez ces charges utiles pour netcat directement sur le serveur ou pour les importer dans d'autres outils d'analyse.
Après avoir trouvé un problème de désynchronisation, n'hésitez pas à utiliser mes scripts de désynchronisation Turbo Intruder disponibles ici : https://github.com/defparam/tiscripts
DesyncAttack_CLTE.py et DesyncAttack_TECL.py sont d'excellents scripts pour aider à organiser une attaque de désynchronisation.
Ces scripts sont publiés sous la licence MIT. Voir LICENSE.