Wie Malware mit Visual Basic Sandboxen ausweicht

Jeden Tag begegnen wir bei JSOC CERT Ereignissen aus verschiedenen Sandboxen, die als Teil der AntiAPT-Lösungen unserer Kunden fungieren, und lassen Tausende von Dateien aus dem Web- und E-Mail-Verkehr durch sie hindurch. Es ist erwähnenswert, dass moderne Sandbox-Systeme in ihrer Entwicklung viel weiter gegangen sind, als nur Systemaufrufe im Kernel-Modus und API-Funktionen im Benutzermodus abzufangen. Zunehmend verwenden sie ihren eigenen Hypervisor, ein System zur Emulation von Benutzeraktivitäten, zur dynamischen Instrumentierung, zum Hashing und Clustering über Codeabschnitte, zur Analyse der Codeabdeckung usw. Eine solche Vielfalt von Technologien erzeugt die Illusion, dass wenn eine Datei nicht in der Sandbox funktioniert und ihr „wahres Gesicht“ nicht zeigt, dies wahrscheinlich APT oder eine innovative Technologie zur Erkennung einer virtuellen Umgebung ist, die der IB-Community noch nicht bekannt ist. Aber ...


Da wir die internen Merkmale der Arbeit von kommerziellen Sandkästen nicht kennen, führen wir in einigen Fällen eine doppelte Überprüfung durch - analysieren Sie manuell die Proben, die den Test bestanden haben. In letzter Zeit haben wir mehrmals festgestellt, dass einige kommerzielle Sandboxen (aus objektiven Gründen können wir nicht sagen, welche) bestimmte schädliche Dateien während der dynamischen Analyse nicht erkannt haben. Wenn der statische Analysator ebenfalls stumm war, wurde die Datei insgesamt übersprungen.

Mit dem Sandbox-Scan konnten bekannte Malware-Familien wie Pony, Loki und Hawkeye umgangen werden. Nur eines vereinte sie - sie wurden von einem in Visual Basic geschriebenen Packer abgedeckt.

Angesichts der Tatsache, dass diese HPE-Familien seit langem nichts Neues sind, ist das „positive“ Sandbox-Urteil sehr deprimierend. Aus diesem Grund haben wir uns entschlossen, das allgemeine Funktionsprinzip dieses Packers und die von uns im Laufe der Zeit gemachten Beobachtungen zu beschreiben.
Das allgemeine Arbeitsschema des Packers ist bedingt in vier Stufen unterteilt und in der folgenden Abbildung dargestellt.



Der Einstiegspunkt einer schädlichen Datei sieht typisch für Visual Basic-Anwendungen aus:



Wir haben verschiedene Optionen für diesen Packer gefunden, und der VB Wrapper-Code wurde häufig geändert, aber die ausgeführte Aufgabe blieb dieselbe: Übertragung der Steuerung auf den Code der Stufe 1. In früheren Beispielen wurde die Steuerung mithilfe der API-Funktionen der Enum * -Klasse (z. B. EnumWindows, EnumCalendarInfo usw.) übertragen. e) für die die Adresse Stufe 1 des Codes als Parameter angegeben wurde. Kürzlich haben wir beobachtet, dass die Kontrolle direkt übertragen wird.

Stufe 1


Das Management erhält den Code Stufe 1. Dieser Code ist nicht verschlüsselt, sondern verschleiert. Die Verschleierungsmethoden variieren von Probe zu Probe, aber der allgemeine Operationsalgorithmus ändert sich nicht:

  1. Ein Zyklus mit vielen (einschließlich Müll-) Anweisungen, der den Schlüssel generiert, der zum Decodieren des Stage 2-Codes erforderlich ist. Die Besonderheit dieses Codeteils ist, dass es keine Sleep-Funktionen gibt, aber aufgrund der großen Anzahl von Iterationen dauert seine Ausführung durchschnittlich 1-2 Minuten.
  2. Entschlüsselung (reguläres XOR) und Übertragung der Kontrolle auf Code der Stufe 2.

Der folgende Screenshot zeigt Beispiele für verwendete Verschleierungsmethoden:



2 Stufe


Die Hauptaufgabe des Codes in Stufe 2 besteht darin, die Umgebung zu überprüfen und Anti-Debugging-Methoden zu implementieren. Einige Abschnitte des Codes werden verschlüsselt (vor der Ausführung entschlüsselt und danach mit demselben XOR-Algorithmus wieder verschlüsselt), um die Erkennung durch Signaturen zu erschweren. Nach der Entschlüsselung sind die charakteristischen Merkmale sichtbar, nach denen der Code der Stufe 2 durch manuelle Analyse erkannt werden kann.



Die Liste der Überprüfungen ist ziemlich umfangreich und unterscheidet sich in verschiedenen Versionen des Packers. Daher werden wir einige Methoden angeben, die in allen Versionen mit Screenshots gefunden wurden, und am Ende die gesamte Liste in der Tabelle auflisten.

1) GetTickCount + Sleep


Der aktuelle Zeitstempel wird genommen, der Ruhezustand wird für 2 Sekunden aufgerufen, danach wird sofort ein weiterer Zeitstempel genommen.

Danach wird der Unterschied zwischen den Markierungen überprüft (ob tatsächlich 2 Sekunden vergangen sind).



2) SetErrorMode


Überprüft den korrekten Betrieb des SetErrorMode-API-Aufrufs. Die Funktion wird zweimal hintereinander mit den Parametern 0x800 und 0x0 aufgerufen. Danach wird das Ergebnis des zweiten Aufrufs überprüft: Es muss gleich 0x800 sein.



3) SetLastError


Zunächst wird ein SetLastError mit dem Parameter 0x5 aufgerufen. Anschließend wird überprüft, ob der letzte Fehlercodewert im TEB korrekt eingestellt ist (dh 0x5 ist).



4) Überprüfen der Cursorbewegung


Der Code tritt in eine Endlosschleife ein und wartet darauf, dass sich die Maus bewegt.



5) DbgBreakPoint und DbgUiRemoteBreakin


Diese Funktionen werden geändert, um zu verhindern, dass der Debugger eine Verbindung zum Prozess herstellt.


Technik


Kommentar


GetTickCount + Sleep


Überprüfen von Zeitstempeln


SetErrorMode


Überprüfen Sie, ob die Funktion ordnungsgemäß funktioniert


SetLastError


Überprüfen Sie, ob die Funktion ordnungsgemäß funktioniert


GetCursorPos


Überprüfen Sie die Cursorbewegung


Dbgbreakpoint


Funktionsänderung, um das Anhängen von Debuggern zu verhindern


DbgUiRemoteBreakin


Funktionsänderung, um das Anhängen von Debuggern zu verhindern


Hook-Löschung


Die ersten 5 Bytes von Funktionen werden in ntdll.dll wiederhergestellt, falls Hooks vorhanden sind


NtSetInformationThread


Parameter 0x11 (ThreadHideFromDebugger)


GetThreadContext + DR prüfen


Die Debug-Register DR0-DR3, DR6, DR7 werden überprüft.


Überprüfen Sie die Haltepunkte


Die Anweisungen INT3 (0xCC), int 3 (0xCD 0x03) und ud2 (0x0F 0x0B) zu Beginn einiger Funktionen werden überprüft


cpuid (EAX = 0x0)


Die Register EAX, ECX, EDX werden geprüft


cpuid (EAX = 0x40000000)


Die Register EAX, ECX, EDX werden geprüft


cpuid (EAX = 0x1)


31. ECX-Bit geprüft


PEB (BeingDebugged)


Überprüft den Wert 0x1


PEB (NtGlobalFlag)


Überprüfter Wert 0x70


NtQueryInformationProcess


Wird mit den Flags ProcessDebugPort (0x7), ProcessDebugFlags (0x1F), ProcessDebugObjectHandle (0x1E) aufgerufen.


Prozessnamenprüfung


Die Zeichenfolgen "Beispiel", "Sandbox", "Virus", "Malware", "Selbst" werden überprüft



Wenn alle Techniken der Stufe 2 abgeschlossen sind, wird die Befehlszeile auf Übereinstimmung mit dem speziellen Format überprüft. Wenn die Prüfung fehlschlägt, werden die folgenden Aktionen ausgeführt:

1) Die CreateProcess-Funktion wird mit dem CREATE_SUSPENDED-Flag aufgerufen, um den aktuellen Prozess neu zu starten. In diesem Fall hat die Befehlszeile das erforderliche Format.
2) Mit den Funktionen GetContextThread und SetContextThread wird der Einstiegspunkt in einen neuen geändert, der sich im Code der Stufe 1 befindet.
3) Wiederholen Sie die Schritte 1 und 2 (einschließlich eines langen Zyklus und aller Überprüfungen). Diesmal ist die Befehlszeilenprüfung erfolgreich und der Prozess fährt mit dem nächsten Schritt fort.

3 Stufe


In diesem Stadium wird der Körper des Hauptvirus entschlüsselt und die Prozessaushöhlungstechnik wird für den aktuellen Prozess durchgeführt, wonach die Kontrolle auf den Eintrittspunkt des Hauptvirus übertragen wird.

Lektion gelernt


Wir können nicht genau sagen, was diese oder jene Sandbox in diesem Fall verursacht, aber ich möchte glauben, dass die Möglichkeit, die im Artikel beschriebenen Techniken durch Malware zu verwenden, von Anbietern seit langem vorgesehen ist und das Problem nur in der langen Zeitverzögerung in der ersten Phase der Arbeit des Packers liegt .

Trotz der Tatsache, dass moderne Sandkästen größtenteils als Teil von Schutzsystemen gegen APT-Angriffe positioniert sind, deuten unsere Beobachtungen darauf hin, dass selbst böswillige Familien, die der Community bekannt sind, mit beneidenswerter Beständigkeit in die Infrastruktur eindringen. Da es keine Garantie dafür gibt, dass die Probe, die die Sandbox umgangen hat, nicht über einige Antiviren-Bypass-Techniken verfügt, können Sie sich nicht auf diese Reihe von Schutzlösungen verlassen. In solchen Fällen kann ein ordnungsgemäß erstellter Überwachungsprozess, einschließlich Informationssicherheitsereignissen von Endhosts, eine zeitnahe Reaktion sicherstellen und potenzielle Schäden minimieren.

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


All Articles