Eine Autopsie-Geschichte: Wie wir Hancitor rückgängig gemacht haben



Für diejenigen, die bereits genug mit den Crackme-Rätseln gespielt haben , haben wir einen neuen Trojaner mitgebracht. In freier Wildbahn befindet sich der Hancitor-Downloader immer noch in seinem natürlichen Lebensraum - Spam-Mailings. Derzeit wird es aktiv zum Herunterladen des Panda-Banking-Trojaners verwendet, einer Modifikation des berüchtigten Zeus.

An einem kalten Sommerabend trafen wir ihn von Angesicht zu Angesicht und sahen uns E-Mail-Spam an. Wenn Sie sehen möchten, was die Malware unter der Haube hat, lesen Sie unsere neue umgekehrte Analyse.

Unser schädliches Dokument sieht folgendermaßen aus:



Standardmäßig sind Makros blockiert, daher warnt das System: "Makros wurden deaktiviert." Der Inhalt der Nachricht besagt jedoch, dass Makros enthalten sein sollten. Nun, lass es uns tun. Nach dem Klicken auf die Schaltfläche Inhalt aktivieren ist der Computer infiziert. Nun wollen wir sehen, welche Art von Makro ausgeführt wird und wie genau die Infektion auftritt. Dies kann sofort in Word erfolgen, indem Sie zur Registerkarte Ansicht-> Vacros \ Ansichtsmakros wechseln.



Sie können professioneller arbeiten - verwenden Sie Olevba aus dem Oletools-Paket. Sie können das Paket dort unter dem Link installieren. Geben Sie als Nächstes olevba doc_file –c –decode> source.txt ein und rufen Sie die Makroquelle ab.



Mit dem Code möchte ich sofort sagen, dass der Trojaner zur Klasse der Downloader gehört. Das Drehbuch entleert sich nur von irgendwo nach Malwara. Um dies zu beweisen, dekodieren wir base64-Strings. Es ist für uns bequemer, dies sofort über hiew zu tun, damit wir nicht hundertmal kopieren und einfügen. Dazu verwenden wir ein spezielles Plugin, das hier beschrieben wird. Folgendes ist passiert:



Dies ist ein bösartiges Skript, das in zwei Teile unterteilt und als 1.hta gespeichert ist. Grundsätzlich interessiert uns nicht besonders, wie es funktioniert. Es ist alles ziemlich alltäglich. Der einzige wichtige Punkt ist die Bestimmung der URL, unter der die schädliche Datei heruntergeladen wird. Versuchen wir, ihn zu finden, da diese Informationen für die Sicherheit nützlich sein können . Sie können Netzwerkregeln hinzufügen, um Anforderungen unter solchen URLs zu blockieren, wodurch das Unternehmen vor Infektionen geschützt wird.

Ha! Es gibt keine Links. Aber woher kommt die 6.exe-Datei, die 1.hta startet? Es ist Zeit, sich unsere Dock-Datei noch einmal genauer anzusehen, aber genauer:



Ja, ein Exe-Shnik ist in das Dock-Dokument integriert. Ja und schwer verpackt. Lassen Sie uns erklären, was los ist. Das Makro legt das schädliche 1.hta-Skript im Ordner Temp ab und startet es. 1.hta startet wiederum 6.exe aus seinem Verzeichnis. Es ist klar, dass 6.exe der gleiche gepackte PE-Shnik ist, den wir auf dem Bildschirm sehen. Aber jetzt fragen wir uns, wie 6.exe in% temp% sinkt. Dies geschieht aufgrund einer interessanten Funktion in der Microsoft Office-Suite. Tatsache ist, dass in jedes OLE-Dokument jede andere Datei im Ole10Native-Format eingebettet werden kann.

Wenn dies der Fall ist, legt MS-Office selbst die auf diese Weise erstellte Datei beim Start im Ordner% temp% unter dem im Ole10Native-Strukturheader angegebenen Namen ab. Schauen wir uns dieses Objekt an. Das Plugin zum FAR-Manager - OLE2Viewer - hat uns geholfen . Wir öffnen unser schädliches Dokument im Plugin, gehen in das Verzeichnis ObjectPool \ _1593522492 und sehen Folgendes:



Kopieren Sie diese Datei (Ole10Native) und öffnen Sie sie in der Ansicht.



Hier sehen wir, unter welchem ​​Namen unser OLE-Objekt - 5c.pif in den Ordner% temp% verschoben wird. Nun zurück zu unserem Makro. Seine Aufgabe ist es, einen betrunkenen Exe-Shnik zu starten.



Um genau zu sein, startet das Makro die abgelegte Datei nicht immer über 1.hta, sondern auch wie folgt: Shell "cmd.exe / c ping localhost -n 100 &&" & Environ ("Temp") & "\ 6 .pif ", vbHide



Wie wir sehen, hängt die Startmethode vom Vorhandensein der folgenden Prozesse im System ab: bdagent.exe und PSUAMain.exe. Warum brauchen Sie dann ping localhost -n 100? Und dies ist ein altgriechischer Trick, um für alle Fälle eine künstliche Verzögerung zu erzeugen. Normalerweise werden seine Variationen zur Selbstentfernung verwendet.

Zu diesem Zeitpunkt haben wir den Betrieb eines schädlichen Dokuments untersucht. Uns wurde klar, dass das Dokument selbst nicht zu Malware vom Typ Trojan-Downloader gehört, wie es auf den ersten Blick schien, sondern für den Typ Trojan-Dropper geeignet ist. Folgendes ist beim Start passiert:



Jetzt muss die Nutzlast selbst zerlegt werden. Wir haben bereits festgestellt, dass unser Trojaner gepackt ist, also müssen wir ihn zuerst auspacken. Normalerweise ist dieser Prozess in zwei Phasen unterteilt:
1. Entfernen des entpackten Speicherauszugs + Wiederherstellen der Importtabelle.
2. Analyse und Reinigung globaler Variablen.

Wir brauchen die zweite Stufe, da es viele API-Funktionen gibt, die aufgrund ihrer Arbeit nicht wiederholte Werte an uns zurückgeben. Beispielsweise gibt CreatHeap einen Heap-Deskriptor an uns zurück, der für die Arbeit weiter verwendet wird. Sehr oft gibt es Typprüfungen im Code: Wenn der Heap-Deskriptor == 0 ist, erhalten Sie den Heap-Deskriptor, andernfalls verwenden Sie einen bereits initialisierten . Zum Zeitpunkt des Dumps wurde die Variable, die den angegebenen Deskriptor enthielt, bereits von ihm initialisiert, und zu diesem Zeitpunkt war der Deskriptor gültig. Wenn wir versuchen, den Speicherauszug zu starten, enthält die Variable mit unserem Deskriptor den alten Wert, d. H. Nicht gleich 0, was bedeutet, dass der Test bestanden wird.

Sobald das Programm versucht, diesen Deskriptor zu verwenden, löst das Betriebssystem eine Ausnahme aus und das Programm stürzt mit einem Fehler ab. Um dies zu vermeiden, müssen Sie diese Variablen auf Null setzen. Sie befinden sich normalerweise in einem beschreibbaren Abschnitt der Daten. Wahrscheinlich schlagen Sie vor, diesen Abschnitt im Hex-Editor zu öffnen und alles mit Nullen zu überschreiben? Sie haben teilweise Recht, aber Sie sollten keine vorschnellen Maßnahmen ergreifen. Es gibt Trojaner, die Variablen nicht auf 0, sondern auf einem zufälligen DWORD prüfen. Und je nachdem, ob der Test getestet wird oder nicht, werden verschiedene Maßnahmen ergriffen. Sie müssen für Beispiele nicht weit gehen. Schauen Sie sich nur den Cridex an (vor kurzem ist er irgendwo vom Radar verschwunden, anscheinend wurde er vollständig auf EMOTETA aktualisiert).

Lassen Sie uns also unser Beispiel ausführen (natürlich in einer virtuellen Maschine). Es ist auch wünschenswert, dass der Datenverkehr, der die virtuelle Maschine verlässt, über ein VPN erfolgt.

Wir starten unseren Trojaner und er hängt einfach dabei. Großartig! In der Regel erledigen Trojaner die Dinge schnell und enden dann sofort und zerstören sich selbst. Daher müssen Sie im Code nach Stellen suchen, die für diese Aktionen verantwortlich sind, sie unterbrechen und dann sichern. In unserem Fall können wir es einfach so machen.

Für den Dump verwenden wir das wunderbare Dienstprogramm Process Dump, das hier zu finden ist . Dieses Dienstprogramm findet nicht nur alle versteckten ausführbaren Module und gibt sie aus, sondern stellt auch die Importtabelle selbst wieder her. Das Dienstprogramm muss folgendermaßen als Administrator ausgeführt werden: pd / pid xxxx, wobei xxxx die ID des Trojanerprozesses ist. Danach speichert das Dienstprogramm alle Prozessmodule. Wir haben die zusätzlichen entfernt und dies ist, was bleibt:



Der Name der ausführbaren Datei des Trojaner-Prozesses lautet 1.exe. Es stellt sich heraus, dass sich der entpackte Trojaner bei 0x2C0000 befand. Öffnen Sie es in hiew:



Nur ein Auge glücklich! Jetzt ist die Datei entpackt, sie ist deutlich sichtbar. Die Importtabelle wurde ebenfalls erkannt. Öffnen wir es in IDA-PRO.



Wir haben bereits einige Funktionen umbenannt, während wir das Beispiel sortiert haben. Der Trojaner beginnt zunächst mit der Ermittlung der Ladeadresse seines Moduls. Und wirklich: Woher wusste er, an welcher Adresse sein Stummel ausgepackt war? Dies geschieht mit einer alten, bewährten Technik - das Umblättern einer Speicherseite bei 0x1000 relativ zur aktuellen Adresse, bis wir auf die "MZ" -Bytes stoßen. Dies funktioniert, weil ausführbare Module das Betriebssystem immer an einer Adresse laden, die ein Vielfaches von 0x1000 ist. Überzeugen Sie sich selbst. In unserem Fall ist eine Grenze von 100 Abisolieren festgelegt.



Wenn jemand nicht versteht, wo es ein Zurückdrehen gibt, dann ist hier:
Ergebnis + = 0xFFFFF000 entspricht Ergebnis - = 0x1000.

Nach Erhalt der Download-Adresse seines Moduls erhält der entpackte Trojaner die Adressen der für seinen Betrieb erforderlichen Funktionen. Zunächst werden die Adressen zweier Funktionen durchsucht - LoadLibraryA und GetProcAddress. Wenn Sie die Adressen dieser Funktionen kennen, können Sie sie verwenden, um den Rest abzurufen. Diese Funktionen befinden sich in der Kernel32-Bibliothek. Seine Adresse wird durch Lesen des ersten Elements (null - ntdll, erste Kernelbasis usw.) der Ringliste erhalten, das alle Module beschreibt, die in der Initialisierungsreihenfolge mit der Struktur _LDR_DATA_TABLE_ENTRY geladen wurden. Der Zeiger auf die Liste wird aus dem PEB gezogen.



Nachdem der Trojaner die Adresse kernel32.dll (beginnend mit Windows 7 - kernelBase.dll) erhalten hat, kann er seine Exporttabelle manuell analysieren und die erforderlichen zwei Funktionen finden, die vorhersehbar in der Subroutine sub_EF1E60 ausgeführt werden.



Schauen Sie sich nun die Funktion an, die wir getHeap genannt haben.



Hier beobachten wir nur die oben beschriebene Situation. Zum Zeitpunkt des Dumps enthielt die Variable hHeap einen Wert von 600000h. Daher wird GetProcessHeap nicht aufgerufen. Stattdessen wechselt das Programm zum Label loc_EF11DD, wo HeapAlloc mit einem ungültigen Handle aufgerufen wird, was zu einem Fehler führt. Deshalb nehmen wir den Hex-Editor und setzen diese Zahl auf Null. Wir haben sechs ähnliche Orte gezählt.

Als nächstes beginnt der Spaß. Der Trojaner generiert eine eindeutige Client-ID basierend auf der Seriennummer der Festplatte und der MAC-Adresse. Hier erhaltene Informationen:



Wir erhalten auch Folgendes: IP-Adresse, Betriebssystemversion, Netzwerkname und Benutzername. Basierend auf all dem wird eine HTTP-Anfrage an das Admin-Panel generiert, deren Adresse wir noch nicht kennen. Es ist nicht in den Zeilen (auch in der ausgepackten Form). Aber es ist nicht da, weil es in der Konfiguration verschlüsselt ist. Die Adresse kann dem Code entnommen werden:



Die Konfiguration wiegt 0x2008 Bytes und hat das folgende Format: Die ersten 8 Bytes sind der RC4-Schlüssel, 0x2000 Bytes sind verschlüsselte Daten.



Die Tatsache, dass der RC4-Verschlüsselungsalgorithmus verwendet wird, wird aus der folgenden Auflistung deutlich:



Bitte beachten Sie, dass die ersten 8 Bytes allein nicht der Schlüssel zu RC4 sind. Der Schlüssel ist der SHA1-Hash dieser Bytes. Sie müssen auch das Flag 0x280011 für die Funktion CryptDeriveKey beachten. MSDN hat einen Haftungsausschluss zu diesem Flag:



Daraus wird klar, dass die hohen 16 Bits dieses Flags die Schlüsselgröße in Bits festlegen. Das heißt, in Bytes ist die Schlüsselgröße: (0x280011 >> 16) / 8 = 5. Daher sind die Schlüssel die ersten fünf Bytes aus dem Hash aus den ersten acht Bytes der Konfiguration. Lassen Sie uns die Konfiguration sichern und ein Python-Skript schreiben, das sie für uns entschlüsselt. Das Skript sieht folgendermaßen aus:



Das Ergebnis seiner Arbeit war die Datei config.rc4. Öffnen Sie es in hiew:



Wir sehen eine entschlüsselte Liste von Admin-Bereichen. Das erste Wort ist "19nep07" - Build-Nummer. Dafür sind 16 Bytes zugeordnet. Als nächstes folgt eine Liste von Administrator-URLs, die durch "|" getrennt sind.

Der erste Aufruf des Admin-Panels hat also das folgende Format:
GUID = 3068075364164635648 & BUILD = 19nep07 & INFO = WIN-56G04BL06SL @ WIN -56G04BL06SL \ Reverse & IP = 35.0.127.52 & TYPE = 1 & WIN = 6.1 (x32



Anschließend wird die generierte Anforderung zuerst in der Admin-Panel-Liste gesendet.



Als nächstes wird die Antwort des Administrators natürlich gelesen, wenn sie noch aktiv ist. Die Antwort sollte base64-codiert sein. Ist dies nicht der Fall, wird der nächste Administrator aus der Liste genommen. Manchmal geben lebende Administratoren eine seltsame Antwort zurück:



Es ist bekannt, nicht wahr? Ja, das sind die gleichen Zahlen ! Tatsächlich weiß ein Autor, warum der Administrator beginnt, sie zurückzugeben! In normaler Form gibt der Befehl zurück. Leider ist es unmöglich, mit absoluter Sicherheit zu sagen, wie das Antwortformat aussehen wird, da kein Datenverkehr vorhanden ist und alle Administratoren tot sind. Die dekodierte Datei wird zusätzlich zu 0x7A dekodiert:



Die Antwort sollte einen Befehl enthalten. Ist dies nicht der Fall, wird das nächste Admin-Panel angerufen. Der Befehlscode wird als "x:" codiert, wobei x der Buchstabe ist, der einen bestimmten Befehl codiert. Es gibt 7 von ihnen: 'r', 'l', 'e', ​​'b', 'd', 'c', 'n'. Betrachten Sie die Befehle "b" und "r".

Die Handler dieser Befehle haben dieselbe Funktion. Wir haben es wie GetExe genannt. So sieht es aus:



Ich denke hier ist alles klar. Der Trojaner stellt eine http-Anfrage und die ausführbare Datei wird als Antwort in komprimierter Form zurückgegeben, die dann dekomprimiert wird. Dann sind Variationen möglich. Im Fall des Befehls "b" werden die folgenden drei Aktionen ausgeführt:

1. Erstellung des Svchost-Prozesses in gefrorener Form



2. Injektion in den Adressraum des heruntergeladenen Modulprozesses



3. Kontrollieren Sie die Übertragung zum injizierten Modul



Im Fall des Befehls r werden die folgenden drei Aktionen ausgeführt:
1. Laden Sie die ausführbare Datei herunter, indem Sie die GetExe-Funktion aufrufen.
2. Speichern Sie die heruntergeladene Datei in einem temporären Ordner unter einem zufälligen Namen.
3. Starten Sie eine abgelegte Datei.



Fertig

PS Das nächste Mal können wir entweder den Panda oder einen Kryptor analysieren. Schreiben Sie in die Kommentare, an welcher Malware Sie am meisten interessiert sind (natürlich zu Forschungszwecken).

Source: https://habr.com/ru/post/de418185/


All Articles