Präambel
ICEDID ist eine Malware-Familie, die 2017 von IBM X-Force-Forschern entdecktwurde und mit dem Diebstahl von Anmeldedaten, Bankinformationen und anderen persönlichen Informationen in Verbindung gebracht wird. ICEDID war schon immer eine vorherrschende Familie, hat aber seit der vorübergehenden Unterbrechung von EMOTET Anfang 2021 noch mehr Wachstum erzielt. ICEDID wurde mit der Verbreitung mehrerer unterschiedlicher Malware-Familien in Verbindung gebracht, darunter DarkVNC und COBALT STRIKE. Regelmäßige Berichterstattung aus der Branche, einschließlich Forschungspublikationen wie dieser, tragen dazu bei, diese Bedrohung zu mindern.
ICEDID ist dafür bekannt, seine Nutzlasten mit benutzerdefinierten Dateiformaten und einem benutzerdefinierten Verschlüsselungsschema zu verpacken. Im Anschluss an unsere neueste ICEDID-Forschung , die die Ausführungskette der GZip-Variante abdeckt.
In diesem Tutorial stellen wir diese Tools vor, indem wir ein aktuelles ICEDID-Beispiel entpacken, beginnend mit dem Herunterladen einer Kopie der gefälschten GZip-Binärdatei:
Die Analyse von Malware kann für Systeme gefährlich sein und sollte nur von erfahrenen Fachleuten in einer kontrollierten Umgebung wie einer isolierten virtuellen Maschine oder einer Analyse-Sandbox durchgeführt werden. Malware kann so konzipiert sein, dass sie sich der Erkennung entzieht und andere Systeme infiziert, daher ist es wichtig, alle notwendigen Vorsichtsmaßnahmen zu treffen und spezielle Tools zu verwenden, um sich und Ihre Systeme zu schützen.
54d064799115f302a66220b3d0920c1158608a5ba76277666c4ac532b53e855f
Einrichtung der Umgebung
Für dieses Tutorial verwenden wir Windows 10 und Python 3.10.
Elastic Security Labs veröffentlicht eine Reihe von Tools, um den Entpackprozess zu automatisieren und Analysten und der Community dabei zu helfen, auf ICEDID zu reagieren.
Skript | Beschreibung | Kompatibilität |
---|---|---|
decrypt_file.py | Entschlüsseln Sie die ICEDID-verschlüsselte Datei | Windows und andere (nicht getestet) |
gzip_variant/extract_gzip.py | Extrahieren Sie Nutzlasten aus der gefälschten GZip-Datei ICEDID | Windows und andere (nicht getestet) |
gzip_variant/extract_payload_from_core.py | Extrahieren und Entschlüsseln von Nutzlasten aus der neu erstellten ICEDID-Kernbinärdatei | Windows und andere (nicht getestet) |
gzip_variant/load_core.py | Laden und Ausführen der benutzerdefinierten PE-Binärdatei des Kerns | Nur Windows |
gzip_variant/read_configuration.py | Lesen Sie die ICEDID-Konfigurationsdatei, die im gefälschten GZip enthalten ist | Windows und andere (nicht getestet) |
rebuild_pe.py | Erstellen einer PE aus einer benutzerdefinierten ICEDID-PE-Datei | Windows und andere (nicht getestet) |
Um die Tools verwenden zu können, klonen Sie das Elastic Security Lab-Release-Repository und installieren Sie das nightMare-Modul.
git clone https://github.com/elastic/labs-releases
cd labs-release
pip install .\nightMARE\
Alle Tools in diesem Tutorial verwenden das nightMare-Modul , diese Bibliothek implementiert verschiedene Algorithmen, die wir zum Entpacken der verschiedenen Nutzlasten benötigen, die in ICEDID eingebettet sind. Wir veröffentlichen nightMare, weil es für diese ICEDID-Analyse erforderlich ist, aber bleiben Sie dran - mehr wird kommen, wenn wir dieses Framework weiterentwickeln und reifen lassen.
Entpacken des gefälschten GZip
Das gefälschte ICEDID-GZip ist eine Datei, die sich als gültige GZip-Datei tarnt und formatiert ist, indem die echten Daten mit einer GZip-Kopf- und -Fußzeile gekapselt werden.
GZip Magic Bytes werden rot angezeigt.
Der GZip-Header wird grün dargestellt.
Der Wert des Dummy-Dateinamens ist blau.
Nach dem GZip-Header folgt die wahre Datenstruktur, die wir im Folgenden beschreiben.
Wir werden das Skript labs-releases\tools\icedid\gzip-variant\extract_gzip.py verwenden, um dieses betrügerische GZip zu entpacken.
usage: extract_gzip.py [--help] input output
positional arguments:
input Input file
output Output directory
options:
-h, --help show this help message and exit
Wir verwenden extract_gzip.py für das oben verlinkte ICEDID-Beispiel und speichern den Inhalt in einem von uns erstellten Ordner mit dem Namen " extract " (Sie können einen beliebigen vorhandenen Ausgabeordner verwenden).
python extract_gzip.py 54d064799115f302a66220b3d0920c1158608a5ba76277666c4ac532b53e855f extract
============================================================
Fake Gzip
============================================================
is_dll: True
core: UponBetter/license.dat (354282 bytes)
stage_2: lake_x32.tmp (292352 bytes)
extract\configuration.bin
extract\license.dat
extract\lake_x32.tmp
Dieses Skript gibt drei einzelne Dateien zurück, die aus folgenden Elementen bestehen:
- Die verschlüsselte Konfigurationsdatei: configuration.bin
- Die verschlüsselte Kernbinärdatei: license.dat
- Der Persistenzlader: lake_x32.tmp
Entschlüsseln der Kernbinär- und Konfigurationsdateien
Die Konfiguration und die Kernbinärdatei, die wir extrahiert haben, werden mit dem benutzerdefinierten Verschlüsselungsschema von ICEDID verschlüsselt. Wir können sie mit dem Skript labs-releases\tools\icedid\decrypt_file.py entschlüsseln .
usage: decompress_file.py [--help] input output
positional arguments:
input Input file
output Output file
options:
-h, --help show this help message and exit
Wie hier dargestellt (beachten Sie, dass entschlüsselte Dateien an jedes gültige Ziel geschrieben werden können):
python .\decrypt_file.py .\extract\license.dat .\extract\license.dat.decrypted
python .\decrypt_file.py .\extract\configuration.bin .\extract\configuration.bin.decrypted
Die Kernbinärdatei und die Konfiguration können nun von weiteren Tools verarbeitet werden. Sehen Sie sich die Daten aus der entschlüsselten Konfiguration an, die im folgenden Screenshot dargestellt sind:
Auslesen der Konfiguration
Das Format der Konfigurationsdatei ist unten dargestellt.
Die Konfiguration kann mit dem Skript labs-releases\tools\icedid\gzip-variant\read_configuration.py ausgelesen werden.
usage: read_configuration.py [--help] input
positional arguments:
input Input file
options:
-h, --help show this help message and exit
Wir verwenden das Skript read_configuration.py , um die Datei configuration.bin.decrypted zu lesen, die wir im vorherigen Schritt gesammelt haben.
python .\gzip-variant\read_configuration.py .\extract\configuration.bin.decrypted
============================================================
Configuration
============================================================
botnet_id: 0x3B7D6BA4
auth_var: 0x00000038
uri: /news/
domains:
alishaskainz.com
villageskaier.com
Diese Konfiguration enthält zwei C2-Domänen:
- alishaskainz[.]com
- villageskaier[.]com
Für dieses Beispiel lautet der Beaconing-URI, den ICEDID verwendet, " /news/ ".
Neuaufbau der Kernbinärdatei für die statische Analyse
ICEDID verwendet ein benutzerdefiniertes PE-Format, um seine Nutzlasten zu verschleiern und damit statische oder dynamische Analysetools zu umgehen, die erwarten, dass es sich um eine normale ausführbare Windows-Datei handelt. Das benutzerdefinierte PE-Dateiformat wird im Folgenden beschrieben.
Wenn wir die Kern-Binärdatei analysieren möchten, z. B. mit IDA Pro, müssen wir sie in eine gültige PE umbauen. Wir verwenden das Skript labs-releases\tools\icedid\rebuild_pe.py .
usage: rebuild_pe.py [--help] [-o OFFSET] input output
positional arguments:
input Input file
output Output reconstructed PE
options:
-h, --help show this help message and exit
-o OFFSET, --offset OFFSET
Offset to real data, skip possible garbage
Beim Versuch, rebuild_pe.py für die entschlüsselte Core-Binärdatei license.dat.decrypted zu verwenden, erhalten wir jedoch die folgende Fehlermeldung:
python .\rebuild_pe.py .\extract\license.dat.decrypted .\extract\core.bin
Traceback (most recent call last):
File "rebuild_pe.py", line 32, in <module>
main()
File "rebuild_pe.py", line 28, in main
custom_pe.CustomPE(data).to_pe().write(args.output)
File "nightmare\malware\icedid\custom_pe.py", line 86, in __init__
raise RuntimeError("Failed to parse custom pe")
RuntimeError: Failed to parse custom pe
Die Feinheit dabei ist, dass die benutzerdefinierten PE-Daten nicht immer am Anfang der Datei beginnen. In diesem Fall können wir beispielsweise, wenn wir die Datei in einem hexadezimalen Editor wie HxD öffnen, eine bestimmte Anzahl von Müllbytes vor den eigentlichen Daten beobachten.
Wir wissen aus unseren Recherchen, dass die Größe des Mülls 129 Bytes beträgt.
In diesem Sinne können wir die Garbage-Bytes überspringen und die Kernbinärdatei mit dem rebuild_pe.py-Skript und dem Parameter "-o 129" neu erstellen. Diesmal erhalten wir glücklicherweise keine Fehlermeldung. core.bin wird in das Ausgabeverzeichnis gespeichert, in unserem Beispiel extrahieren .
python .\rebuild_pe.py .\extract\license.dat.decrypted .\extract\core.bin -o 129
Das neu erstellte PE-Objekt ist nicht direkt ausführbar, aber Sie können es mit dem Disassembler Ihrer Wahl statisch analysieren.
Wir haben den neu erstellten Binärabschnitten benutzerdefinierte Namen zugewiesen ( .mare{0,1,2,...} ).
Wir möchten uns bei Hasherezade für die Arbeit bedanken, von der wir uns bei der Entwicklung dieses Tools inspirieren ließen.
Ausführen der Kern-Binärdatei (nur Windows)
Die Kernbinärdatei kann nicht ohne einen benutzerdefinierten Loader ausgeführt werden, der das benutzerdefinierte PE-Format von ICEDID sowie den Prototyp der Einstiegspunktfunktion versteht.
Aus unserer Forschung wissen wir, dass der Einstiegspunkt eine Struktur erwartet, die wir als Kontextstruktur bezeichnen und die ICEDID-Kern- und Persistenz-Loader-Pfade mit ihrer verschlüsselten Konfiguration enthält. Die Kontextstruktur wird im Folgenden beschrieben.
Um die Kernbinärdatei nativ auszuführen, verwenden wir das Skript labs-releases\tools\icedid\gzip-variant\load_core.py , aber bevor wir es verwenden, müssen wir die context.json Datei erstellen, die alle Informationen enthält, die dieses Skript benötigt, um diese Struktur zu erstellen.
Für dieses Beispiel kopieren wir die Informationen, die in der gefälschten gzip enthalten sind, und verwenden den Pfad zur verschlüsselten Konfigurationsdatei. Wir haben ein Beispiel unter gzip_variant/context.json.example eingefügt.
Bitte beachten Sie, dass beim Umkehren der Probe die Werte "field_0" und "stage_2_export" gefunden werden müssen.
Hier verwenden wir Werte aus unserer früheren Forschung als Platzhalter, aber wir haben keine Garantie, dass die Stichprobe zu 100% funktioniert. In diesem Beispiel wissen wir z. B. nicht, ob der Ordinalexport #1 der tatsächliche Einstiegspunkt des Persistenzladeprogramms ist.
Wir reproduzieren auch das Verhalten der ersten Phase, indem wir das UponBetter-Verzeichnis erstellen und die license.dat Datei dorthin verschieben.
Wir führen das Skript labs-releases\tools\icedid\gzip_variant\load_core.py mit der entschlüsselten Kernbinärdatei aus: license.dat.decrypted , der context.json Datei.
WARNUNG: Die Binärdatei wird von diesem Skript nativ geladen/ausgeführt, Elastic Security Labs übernimmt keine Verantwortung für Schäden an Ihrem System. Bitte führen Sie die Ausführung nur in einer sicheren Umgebung aus.
usage: load_core.py [--help] [-o OFFSET] core_path ctx_path
positional arguments:
core_path Core custom PE
ctx_path Path to json file defining core's context
options:
-h, --help show this help message and exit
-o OFFSET, --offset OFFSET
Offset to real data, skip possible garbage
Da wir das gleiche Problem mit Garbage Bytes haben wie im vorherigen Abschnitt, verwenden wir den Parameter "-o 129", um die Garbage Bytes zu überspringen.
python .\gzip-variant\load_core.py .\extract\license.dat.decrypted .\gzip-variant\context.example.json -o 129
============================================================
Core Loader
============================================================
Base address: 0x180000000
Entrypoint: 0x180001390
Press a key to call entrypoint...
Beim Starten wartet das Skript auf Benutzereingaben, bevor es den Einstiegspunkt aufruft. Wir können ganz einfach einen Debugger an den Python-Prozess anhängen und einen Haltepunkt für den ICEDID-Kerneinstiegspunkt festlegen (in diesem Beispiel 0x180001390 ).
Sobald der Schlüssel gedrückt ist, erreichen wir den Einstiegspunkt.
Wenn wir die Binärdatei ausführen lassen, sehen wir, wie ICEDID-Threads erstellt werden (siehe folgenden Screenshot).
Entpacken und Neuerstellen von Nutzlasten aus der neu erstellten Kernbinärdatei
Zum Extrahieren von Nutzlasten, die in die Kernbinärdatei eingebettet sind, verwenden wir das Skript labs-releases\tools\icedid\gzip-variant\extract_payloads_from_core.py
usage: extract_payloads_from_core.py [--help] input output
positional arguments:
input Input file
output Output directory
options:
-h, --help show this help message and exit
Wir verwenden dieses Skript für die neu erstellte Kernbinärdatei.
python .\gzip-variant\extract_payloads_from_core.py .\extract\core.bin core_extract
core_extract\browser_hook_payload_0.cpe
core_extract\browser_hook_payload_1.cpe
Von hier aus geben wir zwei Binärdateien aus, die den Nutzlasten von ICEDID für Webbrowser-Hooking-Funktionen entsprechen, sie liegen jedoch immer noch in ihrem benutzerdefinierten PE-Format vor.
Basierend auf unseren Recherchen wissen wir, dass browser_hook_payload_0.cpe die x64-Version der Browser-Hook-Payload und browser_hook_payload_1.cpe die x86-Version ist.
Um sie neu zu erstellen, verwenden wir wieder das rebuild_pe.py-Skript , diesmal gibt es keine Garbage Bytes, die übersprungen werden müssen.
python .\rebuild_pe.py .\core_extract\browser_hook_payload_0.cpe .\core_extract\browser_hook_payload_0.bin
python .\rebuild_pe.py .\core_extract\browser_hook_payload_1.cpe .\core_extract\browser_hook_payload_1.bin
Jetzt haben wir zwei PE-Binärdateien ( browser_hook_payload_0.bin und browser_hook_payload_1.bin ), die wir weiter analysieren können.
Aufmerksame Leser werden vielleicht feststellen, dass wir das Entpacken des VNC-Servers aus der Core-Binärdatei übersprungen haben, eine Entscheidung, die wir absichtlich getroffen haben. Wir werden es zusammen mit anderen Tools in der kommenden Forschung veröffentlichen, also bleibt dran!
Fazit
In diesem Tutorial haben wir das Entpacken der ICEDID GZip-Variante behandelt, beginnend mit der Extraktion der gefälschten GZip-Binärdatei, gefolgt von der Rekonstruktion der Kernbinärdatei und dem Entpacken ihrer Nutzlasten.
ICEDID entwickelt sich ständig weiter, und wir werden weiterhin wichtige Änderungen beobachten und unsere Tools zusammen mit unserer Forschung aktualisieren. Fühlen Sie sich frei, ein Problem zu öffnen oder uns eine Nachricht zu senden , wenn etwas kaputt ist oder nicht wie erwartet funktioniert.
Elastic Security Labs ist ein Team von engagierten Forschern und Sicherheitsingenieuren, die sich darauf konzentrieren, Angreifer durch die Veröffentlichung detaillierter Erkennungslogik, Schutzmaßnahmen und angewandter Bedrohungsforschung zu stören.
Folgen Sie uns auf @elasticseclabs und besuchen Sie unser Forschungsportal ,um weitere Ressourcen und Forschungsergebnisse zu erhalten.
Referenzen
In der obigen Studie wurde auf Folgendes Bezug genommen:
- https://www.elastic.co/pdf/elastic-security-labs-thawing-the-permafrost-of-icedid.pdf
- https://securityintelligence.com/new-banking-trojan-icedid-discovered-by-ibm-x-force-research/
- https://www.justice.gov/opa/pr/emotet-botnet-disrupted-international-cyber-operation
- https://malpedia.caad.fkie.fraunhofer.de/details/win.darkvnc
- https://www.cybereason.com/blog/threat-analysis-report-all-paths-lead-to-cobalt-strike-icedid-emotet-and-qbot
- https://github.com/elastic/labs-releases
- https://github.com/hasherezade/funky_malware_formats/blob/f1cacba4ee347601dceacda04e4de8c699971d29/iced_id_parser/iceid_to_pe.cpp
- https://mh-nexus.de/en/hxd/
- https://hex-rays.com/IDA-pro/