Entschärfung des Trickloaders

Die Entwickler des Trickbots waren über die letzten Jahre weiterhin aktiv und entwickelten ihren Code stets weiter. Der darin verwendete Loader wurde im Zusammenhang mit der Verschleierung für eine Anti-Analyse weiterentwickelt. Der TrickLoader nutzt die „Minilzo“-Kompromittierung, die aus der LZO-Bibliothek stammt und seine Verwendung durch diese Entwickler geht auf den Dyre/Upatre-Zeitrahmen zurück. Ein aktueller Blogbeitrag beschreibt den Loader im Detail und zusätzliche Automatisierungsbemühungen bei der Verarbeitung des Trickloaders.

Im Rahmen der Anwendung von Trickbot gab es in der Vergangenheit eine Loader-Komponente, welche kontinuierlich seit Anbeginn des ersten Releases von Trickbot weiterentwickelt wurde. Dabei wurde der ECS-Schlüssel und das Bot-Binary in der Ressource-Sektion des Loaders gespeichert.

Zeitleiste der TrickLoader-Affäre:

  • 2017 – Begonnene Verschleierung des Namens der Ressourcen-Sektion.
  • 2017 – Benutzerdefinierte Basis64 für Strings.
  • 2018 – Fügt die Umgehung der Benutzerkontensteuerung (UAC), Heaven’s Gate, Funktionsverschleierung und ein weiteres Ausblenden der Konfiguration hinzu.

Über die meisten wurde ausführlich berichtet, mit Ausnahme der Funktionsverschleierung, die zwar erwähnt, aber nicht wirklich detailliert betrachtet wurde. Sicherheitsforscher, die Skripte zum Abrufen von Konfigurationen schreiben, haben damit aufgehört, sie zu veröffentlichen, da Trickbot sich verstärkt darauf konzentriert, die Daten zu verschleiern und zu verstecken.

Die Verwirrung entsteht wie folgt: In einer Tabelle sind die Funktionsverschleierungen gespeichert. Zunächst führt der Loader einen Aufruf über diese Tabelle aus, der die Adresse der Tabelle auf den Stack verschiebt. Dies ist die Grundlage dafür, dass der nächste Codeblock verwendet werden kann.

Der nächste Abschnitt verarbeitet dann die Wortwerte aus der Tabelle der Reihe nach, indem er sie zu einem Wert addiert, der zunächst die Anfangsadresse der Tabelle ist und dann auf den Stack geschoben wird. Die Rekonstruktion dieses Prozesses in Python-Code erlaubt es, die gleiche Tabelle zu erstellen, solange bestimmte Werte aus der Binärdatei wiederhergestellt werden können. Dieser Wiederaufbau erfolgt manuell.

Nachdem die Funktionstabelle neu aufgebaut ist, wird eine der Funktionen aufgerufen, die für die Dekodierung der anderen Funktionen und Data-Blobs verantwortlich ist.

Nachdem alle Objekte dekodiert wurden, kann die Größe jedes einzelnen Objekts überprüft werden.

Die meisten von ihnen sehen normal aus. Dennoch gibt es einige wenige, die größer zu sein scheinen, als man normalerweise bei der Größe einer einzelnen Funktion beobachten würde. Da größere dekodierte Objekte eigentlich komprimierte Daten sind, stellt sich heraus, dass es mindestens drei komprimierte Objekte gibt: ein 32-Bit-Trickbot-Binary, einen großen Blob mit 64-Bit-Bytecode, der das 64-Bit-Trickbot-Binary ist, und eine kleinere 64-Bit-EXE-Datei, die ein Ladeprogramm für den 64-Bit-Bytecode-Blob ist.

Die Komprimierung heißt ‚Minilzo‘, die aus der LZO-Bibliothek stammt. Ihre Verwendung durch diese Entwickler geht auf den Zeitrahmen von Dyre/Upatre zurück. Nach der Dekomprimierung der 32-Bit-Binärdatei und der Korrektur der fehlenden ‚MZ‘ entsteht eine 32-Bit-Trickbot-Binärdatei.

Mit dieser Datei können die Onboard-Konfigurationsdaten entschlüsselt werden, die im Bot versteckt und XOR-kodiert sind. Dazu ist es sinnvoll einen bestehenden Open-Source-Decoder zu nehmen und diesen ein wenig anzupassen.

#Sentinelone