Dateiextraktion mittels ICMP-Ping: Ein Überblick
In unseren Audits und Penetrationstests betonen wir stets die Wichtigkeit einer strikten und restriktiven Netzwerksegmentierung. Dennoch gibt es ein Protokoll, das Kunden oft explizit von diesen Regeln ausnehmen: das Internet Control Message Protocol (ICMP). Dieses wird häufig für diagnostische Tools wie den bekannten Ping-Befehl verwendet. Doch ICMP ist weit mehr als nur ein harmloses Diagnosewerkzeug. In meinem heutigen Blog zeige ich Ihnen, wie einfach es möglich ist, vollständige Dateien über das ICMP-Protokoll, das auch die Grundlage für Ping bildet, zu übertragen. Doch zunächst ein Blick auf die Grundlagen.
Im Gegensatz zu Protokollen wie TCP und UDP, die direkt von Anwendungen genutzt werden, arbeitet ICMP eher im Hintergrund. Seine Hauptaufgabe besteht darin, Statusinformationen zu übermitteln, beispielsweise bei Netzwerkanfragen. Eine bekannte Ausnahme ist jedoch der Ping-Befehl oder auch traceroute. Ping nutzt ICMP-Echoanfragen, um zu überprüfen, ob ein bestimmter Rechner online und erreichbar ist.
Aufbau von ICMP-Paketen
Werfen wir zunächst einen Blick auf eine typische Ping-Anfrage. Hierfür nutzen wir exemplarisch den DNS-Server von Cloudflare:
Die standardmässige Grösse unserer Anfrage und auch die Antwort des Zielrechners beträgt 32 Bytes. Bei Linux-Rechnern wären es 64 Bytes. Diese 32 Bytes, die wir sehen, beziehen sich jedoch nur auf die ICMP-Datenlast (Payload). Das eigentliche ICMP-Paket ist grösser. Das können wir erkennen, wenn wir uns das gesendete Paket in Wireshark ansehen.
Anstatt der 32 Bytes, senden wir insgesamt 74 Bytes. Aber wie kommt diese Diskrepanz zustande? Wie schon gesagt, beziehen sich die 32 Bytes nur auf die gesendeten Daten. Das ICMP-Paket beinhaltet jedoch noch mehr Teile als nur die Nutzdaten. Weitere Teile sind:
-
ICMP-Header (8 Bytes)
-
IP-Header (20 Bytes)
-
Ethernet-Header (14 Bytes)
-
ICMP-Data (32 Bytes) – Die Grösse ist variabel. Unter Windows sind es 32 Bytes und unter Linux 64 Bytes.
Addieren wir also alles zusammen, kommen wir auf genau 74 Bytes. Das ICMP-Protokoll erlaubt Paketgrössen bis zu 65535 Bytes. Wenn wir davon den ICMP- und IP-Header abziehen, bleiben 65507 Bytes übrig, welche wir für die Nutzdaten verwenden können. Der Ethernet-Header wird nicht mit einberechnet, da dieser zur Ethernet-Schicht (Layer 2 des OSI-Modells) gehört und ausserhalb des IP-Pakets liegt, das die Transportschicht (Layer 3) betrifft.
Eventuell fragen Sie sich an dieser Stelle, warum die Nutzdaten unter Windows eine Standardgrösse von 32 Bytes haben und was genau darin enthalten ist. ICMP-Daten enthalten bei einem Ping-Kommando oft Fülldaten. Windows sendet hier standardmässig eine Abfolge von Buchstaben mit. Das zeigt sich auch bei einer Analyse des Pakets in Wireshark.
Bevor wir dazu kommen, wie genau wir nun Dateien über dieses Protokoll versenden, ist es noch wichtig zu wissen, dass die eben angesprochene Maximalgrösse von 65507 Bytes die theoretische Obergrenze des IPv4-Protokolls ist. Die praktische Grösse wird durch die MTU (Maximale Übertragungseinheit) der Netzwerkschnittstelle begrenzt, die oft viel kleiner ist (typischerweise 1500 Bytes für Ethernet).
Wie wir sehen, kann eine Ping-Anfrage mit einer angepassten Payload von 1472 Bytes noch gesendet werden. Dies entspricht einer Gesamtgrösse von genau 1500 Bytes. (1472 + ICMP-Header + IP-Header)
Eine Anfrage von 1473 Bytes wäre somit zu gross. Addieren wir ICMP- und IP-Header, wären es insgesamt bereits 1501 Bytes.
1472 Bytes entsprechen übrigens 0.001472 Megabyte. Um z.B. eine 3 MB grosse PDF Datei über das ICMP-Protokoll zu senden, würde es ganze 2038 Pakete, also 34 Minuten dauern, wenn wir davon ausgehen, dass pro Sekunde nur ein ICMP-Paket gesendet wird. Das Intervall könnte unter Windows mit entsprechenden Skripten angepasst werden. Standardmässig über Powershell ist dies nicht möglich.
Die MTU in einem Netzwerk kann variieren. Sie ist abhängig von der eingesetzten Netzwerktechnologie, der Netzwerkinfrastruktur und den Anwendungsanforderungen. Gerade in Server-Netzwerken und falls nur intern Daten übertragen werden, kann sie signifikant höher liegen. In meiner, für diesen Blog frisch aufgesetzten, Testumgebung mit einem Windows Server 2022 und einem Linux Rechner, kann ich 65500 Bytes als Payload verwenden. Warum nicht die vollen 65507 Bytes wie oben beschrieben? Microsoft beschränkt in Windows die maximale Grösse der Payload in Ping auf 65500 Bytes. Auch wenn die theoretische maximale Grösse 65507 Bytes wäre.
Dateien über ICMP übertragen
Kommen wir nun zum spannenden Teil: Wie werden eigentlich ganze Dateien über ICMP übertragen? Sie ahnen es vielleicht schon: Da das ICMP-Paket eine maximale Grösse aufweist, müssen wir die Datei zunächst in kleinere Blöcke oder Pakete zerlegen. Jeder dieser Blöcke enthält einen Teil der Dateidaten, den wir in das ICMP-Payload-Feld einbetten und an ein entferntes Gerät senden. Dieses Gerät kann entweder im eigenen Netzwerk liegen, etwa in einem anderen Netzwerksegment oder sich im Internet befinden. Die ICMP-Nachricht fungiert dabei als eine Art Träger, der unsere Dateidaten transportiert. Man könnte fast sagen, wir verstecken die Datei in kleinen Fragmenten innerhalb der ICMP-Nachricht.
Sind alle ICMP-Nachrichten bei unserem Empfänger angekommen, muss dieser nichts weiter tun, als die Datei wieder zusammenzusetzen. Um dies zu demonstrieren, habe ich eine Testumgebung und ein Skript vorbereitet. Wir benötigen einen Sender (in unserem Fall ein Windows Server) und einen entfernten Linux Rechner, welcher als Empfänger dient. Beide Rechner befinden sich in einem anderen Netzwerksegment. Die Firewall gestattet lediglich ICMP-Verkehr zwischen diesen VLANs. Als Testdatei verwenden wir ein PDF. (dummy.pdf)
Zuerst sagen wir unserem Empfänger, dass er für ankommende ICMP-Pakete bereit sein soll.
Auf dem Sender führen wir nun lediglich unser Skript aus, welches das dummy.pdf in kleinere Teile zerlegt, in ICMP-Pakete verpackt und zum Empfänger schickt. Damit ich gleich nicht zu lange warten muss, gebe ich eine Payloadgrösse von 1472 Bytes an, wie wir weiter oben bereits diskutiert haben. Dies entspricht der Standard-MTU.
Unser Empfänger hat alle ICMP-Pakete erhalten und die Datei wieder zusammengesetzt.
Das dummy.pdf kann nun wieder ganz normal geöffnet und verwendet werden.
Fazit
Wie schon beschrieben, funktioniert diese Technik nicht nur innerhalb eingeschränkter Netzwerke, sondern kann auch zur Dateiextraktion ins Internet verwendet werden. Doch was bedeutet das nun für Unternehmen und welche Massnahmen sollten ergriffen werden, um diese Technik zu unterbinden?
-
In Hochsicherheitsnetzwerken macht es Sinn, auch das ICMP-Protokoll zu deaktivieren. Damit verlieren Netzwerkadministratoren zwar ein Werkzeug, um die Erreichbarkeit eines Servers zu überprüfen, aber auch Angreifer verlieren Angriffsfläche. Attacken wie ICMP-Flooding, Netzwerkscanning, aber auch die eben vorgestellte Taktik wird dadurch unbrauchbar.
-
Deep Packet Inspection (DPI): Nutzen Sie DPI, um den Inhalt von ICMP-Paketen zu überprüfen und verdächtigen Traffic zu blockieren.
-
In normalen Unternehmensnetzwerken kann es ausreichend sein, den ICMP-Datenverkehr zu überwachen. Dies kann z.B. mittels eines Intrusion Detection Systeme (IDS) erfolgen. Diese ermöglichen es, ungewöhnliche ICMP-Aktivitäten zu erkennen, insbesondere solche, die auf verdeckte Kanäle oder Datenexfiltration hindeuten könnten.
-
Da Sie bereits wissen, dass ICMP-Pakete unterschiedlich gross sind und für normale Ping-Anfragen die Standardgrösse 32 Bytes beträgt, kann es Sinn machen ICMP-Nachrichten zu blockieren, die ungewöhnlich grosse Datenlasten enthalten.
Dieser Blogbeitrag zeigt, dass vermeintlich harmlose Standardwerkzeuge und Protokolle durchaus zweckentfremdet werden können. Das bedeutet jedoch nicht, dass Sie jeglichen ICMP-Datenverkehr in Ihrem Netzwerk generell einschränken müssen. Viel wichtiger ist, sich der damit verbundenen Risiken bewusst zu sein und bei entsprechenden Auffälligkeiten angemessen zu reagieren.
Informationen zum Autor: Jan Freymuth
Während meines Studiums und meiner Tätigkeit als IT Consultant für einen weltweit operativen Anbieter für Werkzeugmaschinen war für mich klar, dass meine berufliche Zukunft im Bereich der IT-Sicherheit sein wird. Im Frühjahr 2022 ist es mir gelungen, die goSecurity AG von meinen Fähigkeiten zu überzeugen. Seither erweitere ich mein Wissen im Bereich der IT-Sicherheit täglich und es bereitet mir Freude, dieses aktiv für die Steigerung des IT-Sicherheitsniveaus unserer Kunden einzusetzen.