Cyril François

Auspacken von ICEDID

Ein umfassendes Tutorial mit den Open-Source-Tools der Elastic Security Labs

14 Minuten LesezeitTools
Auspacken von ICEDID

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.

SkriptBeschreibungKompatibilität
decrypt_file.pyEntschlüsseln Sie die ICEDID-verschlüsselte DateiWindows und andere (nicht getestet)
gzip_variant/extract_gzip.pyExtrahieren Sie Nutzlasten aus der gefälschten GZip-Datei ICEDIDWindows und andere (nicht getestet)
gzip_variant/extract_payload_from_core.pyExtrahieren und Entschlüsseln von Nutzlasten aus der neu erstellten ICEDID-KernbinärdateiWindows und andere (nicht getestet)
gzip_variant/load_core.pyLaden und Ausführen der benutzerdefinierten PE-Binärdatei des KernsNur Windows
gzip_variant/read_configuration.pyLesen Sie die ICEDID-Konfigurationsdatei, die im gefälschten GZip enthalten istWindows und andere (nicht getestet)
rebuild_pe.pyErstellen einer PE aus einer benutzerdefinierten ICEDID-PE-DateiWindows 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: