Durch Zufall stolpere ich über „icmpsh“ auf Github. Der letzte Upload ist schon zwei Jahre her. Programmcode liegt in C und Perl vor.
Was macht man damit jetzt?
Kurz zusammengefasst, man umgeht damit eine Firewall und kann fremde Rechner steuern. Das schlimme ist, dass das auch heute noch geht …
Pings werden als Werkzeug dazu eingesetzt, um vor allem Fehler in Verbindungen zu erkennen. Aktive Sicherheitseinstellungen, die Pings unterbinden, gibt es meist nicht und Pings nach aussen sind gelebte Praxis. Das Resultat ist ein attraktives Angriffsziel.
Hast du mehr Informationen?
Die Technik selber ist nicht neu und wurde bereits vor Jahrzehnten angewendet. Es gibt aber aktuelle Ransomware, die diese Technik wieder einsetzt. Dieser Artikel beschreibt die Funktionsweise der Ransomware Pingback. Die Ransomware nutzt die Möglichkeit Nutzdaten über einen Ping zu transportieren. Damit wird der kompromittierte Client ferngesteuert, Daten abgesaugt, Daten verschlüsselt und weitere Opfer infiziert. Diese Art des Tunnelns als Angriffsvektor wird bei MITRE | ATT&CK hier beschrieben.
Wie funktioniert das jetzt?
Ein Ping, eigentlich ein ICMP Echo Request, wird verwendet, um eine Reverse Shell aufzubauen und Nutzdaten für die Steuerung des (Zombie-)Clients zu transportieren. Diese Nutzdaten müssen nichts mit dem Protocol Ping zu tun haben.
Was ist ein Ping, ICMP Echo Request?
ICMP steht für die Abkürzung Internet Control Message Protocol. Die Protokollspezifikation ist in der RFC 792 beschrieben. Das Protocol sieht eine Möglichkeit vor, dass Fehlermeldungen (vgl.: soft and hard errors) mitgesendet werden. Die Anforderungen dazu sind in der RFC 1122 niedergeschrieben. Kurz gesagt, diese Empfehlung ist sehr frei gehalten, die Feldlänge der Fehlermeldung ist nicht beschrieben, geschweige denn beschränkt.
Ethernet Header | IP Header | ICMP Header | User Data | Ethernet CRC |
Was macht das Tunneln?
Dabei werden Nutzdaten in einen Ping eingebettet. Das Feld User Data ist wie oben beschreiben nicht beschränkt. Ein Angreifer kann auch die Kopfdatei, Protokollvorsatz, verändern/ erweitern, um zusätzliche Informationen zu transportieren. Die Typdefinition des ICMP Headers sieht entweder einen Wert von 8, oder 0 vor. 8 steht für einen Echo Request und 0 für eine Echo Reply.
Wie mache ich das?
Dazu brauchst du einen Client mit aktuellem Windows 10 und Windows Defender. Auf der anderen Seite einen Command und Control (vgl.: C2) Server irgendwo im Internet. Auf dem Client wird icmpsh als C Programm ausgeführt. C, weil da keine externen Abhängigkeiten erfüllt sein müssen, im Gegensatz zu Perl. Der aktuelle Windows Defender erkennt das nicht als Schadcode, wenn das Programm, als Slave ausgeführt wird. Am C2 Server im Internet läuft ebenfalls icmpsh, aber als Master.
Was kann ich jetzt machen?
Zumindest die Anzahl der ICMP Pakete pro internen Sender beschränken, oder den ICMP Verkehr gänzlich verbieten. Ein Intrusion Detection System (vgl.: IDS) kann hier eingesetzt werden, um solche Abweichungen schnell zu erkennen. Maschinen neu starten, zeitlich gesteuert abschalte ist zwar auch möglich, aber keine nachhaltige Alternative. Irgendwann sind dann doch alle Teile auf einen Client gelangt. Die Wirkung von Gegenmaßnahmen hängt vor allem von der Reaktionszeit ab. Beobachtet habe ich eine Übertragungsdauer von etwa 32 Stunden für eine Ransomware via icmpsh. Wenn man den Netzwerkverkehr mitschneidet, dann hilft wieder einmal Wireshark. Filtern kann man nach dem Protokoll ICMP allgemein. Einschränken und Verfeinern nach ICMP.Type hilft, ob mehr als die Standardwerte (0,8) verwendet werden. Der Kreativität ist nur durch die eigene kognitive Kapazität eine Grenze gesetzt.
Hier ist mal nach ICMP und ICMP.TYPE 0 und 8 gefiltert.
Es fällt auf, dass die Länge von zwei Paketen größer ist, als bei allen anderen Pakten. Ein ICMP Echo Request hat hier eine Länge von 42B und ein ICMP Echo Reply hat hier eine Länge von 60B.
Jetzt sehen wir aber oben zwei ICMP Echo Requests mit 106B Länge. Im 106B großen Pakte sehen wir, dass es 64B an Daten enthält.
Dekodiert ist es hier nur der Pfad, wo die ausführbare Datei abgelegt ist. Aber so eine Abfrage sollte ja über einen Ping eigentlich nicht möglich sein. Von einer Abfrage zu einer Ausführung einer Datei ist dann kein großer Schritt mehr und einer Erkundung des internen Netzwerks steht nichts mehr im Weg.