
Une manière un peu moins hackish d'intercepter et de modifier les protocoles non-HTTP via Burp et autres.
Une façon un peu moins bidouillée d'intercepter et modifier des protocoles non-HTTP via Burp et autres, avec prise en charge de l'interception SSL et TLS. Cet outil est destiné aux chercheurs et testeurs d'intrusion applicative qui réalisent des audits de sécurité de clients lourds.
Une version améliorée du fantastique projet mitm_relay.
Dans le cadre de notre travail au sein du département de recherche de CyberArk Labs, nous avions besoin d'un moyen d'inspecter les communications SSL et TLS sur TCP et de pouvoir modifier le contenu des paquets à la volée. Il existe de nombreuses façons de le faire (par exemple, l'extension Burp Suite bien connue NoPE), mais aucune ne fonctionnait pour nous dans certains cas. Finalement, nous sommes tombés sur mitm_relay.
mitm_relay est un moyen rapide et simple de réaliser une MITM de tout protocole basé sur TCP via des logiciels d'interception HTTP existants, comme le proxy de Burp Suite. C'est particulièrement utile pour les audits de sécurité de clients lourds. Mais cela ne fonctionnait pas complètement pour nous, donc nous avons dû le personnaliser. Après de nombreuses personnalisations, chaque nouveau changement nécessitait beaucoup de travail, et nous avons fini par tout réécrire de manière plus modulaire.
Nous espérons que d'autres trouveront ce script utile, et nous espérons que l'ajout de fonctionnalités sera facile.
Pour commencer, il faut configurer les adresses et ports des écouteurs. Pour chaque écouteur, une cible doit également être configurée (adresse et port). Chaque donnée reçue de l'écouteur sera encapsulée dans le corps d'une requête HTTP POST avec l'URL contenant « CLIENT_REQUEST ». Chaque donnée reçue de la cible sera encapsulée dans le corps d'une requête HTTP POST avec l'URL contenant « SERVER_RESPONSE ». Ces requêtes sont envoyées à un serveur d'interception HTTP local.
Il est possible de configurer un proxy HTTP et d'utiliser un outil comme burp suite comme outil d'interception HTTP pour visualiser les messages. Ainsi, il est facile de modifier les messages en utilisant les fonctions « Match and Replace » de Burp, des extensions, ou même manuellement (rappelez-vous, le mécanisme de temporisation du protocole intercepté peut être très court).
Une autre façon de modifier les messages est d'utiliser un script Python que le serveur d'interception HTTP exécutera lorsqu'il recevra des messages.
Le corps des messages envoyés au serveur d'interception HTTP sera affiché dans le terminal. Les messages seront affichés après les modifications si un script de modification est fourni. Après toutes les modifications, le serveur d'interception renverra également le corps de la réponse HTTP.
Pour déchiffrer la communication SSL/TLS, mitm_intercept doit recevoir un certificat et une clé que le client acceptera lors de l'établissement de la liaison avec l'écouteur. Si le serveur cible nécessite un certificat spécifique pour l'établissement de la liaison, il est possible de fournir un certificat et une clé.
Un petit schéma pour illustrer le flux de trafic typique :

mitm_intercept est compatible avec les versions récentes de Python 3 (Python 3.9) et est également compatible avec Windows (socket.MSG_DONTWAIT n'existe pas sous Windows, par exemple). Nous avons conservé l'option d'utiliser « STARTTLS », que nous avons appelée mode « Mixte ». L'utilisation du fichier de journalisation des clés SSL est mise à jour (l'option intégrée pour l'utiliser est nouvelle depuis Python 3.8), et nous avons ajouté l'option de modifier l'en-tête SNI. Désormais, la gestion des communications entrantes et sortantes est effectuée par socketserver, et toutes les données sont envoyées à une sous-classe de ThreadingHTTPServer qui gère la représentation et la modification des données. Ainsi, il est possible de voir les modifications appliquées par le script de modification dans la réponse (pratique pour utiliser Burp). De plus, nous pouvons désormais modifier les chiffrements disponibles utilisés par le script en utilisant le format de liste de chiffrements OpenSSL.
$ python -m pip install requestsusage: mitm_intercept.py [-h] [-m] -l [u|t:]<interface>:<port> [[u|t:]<interface>:<port> ...] -t
[u|t:]<addr>:<port> [[u|t:]<addr>:<port> ...] [-lc <cert_path>]
[-lk <key_path>] [-tc <cert_path>] [-tk <key_path>] [-w <interface>:<port>]
[-p <addr>:<port>] [-s <script_path>] [--sni <server_name>]
[-tv <defualt|tls12|tls11|ssl3|tls1|ssl2>] [-ci <ciphers>]
mitm_intercept version 1.6