DEFCON-Konferenz 17. Lachen Sie über Ihre Viren! Teil 1

Michael: Ich begrüße alle, ich bin Michael Lai, das ist Matthew Richard, du kannst ihn Matt oder Richard nennen, weil er zwei Namen hat, aber das spielt keine Rolle.

Matt: Das Thema unseres heutigen Gesprächs ist die Lächerlichkeit von Malware, und genau das versuchen wir zu tun.



Also, nicht jeder, der den Code schreibt, macht es gut, die Leute machen viele Fehler. Und nicht jeder, der den Virus verwendet, macht es richtig. Es gibt auch Menschen, die in beiden Fällen versagen. Setzen Sie sich also bequemer hin, entspannen Sie sich und hören Sie zu. Vielleicht sind diese Informationen für Sie hilfreich.

Nur für den Fall, wir haben sachliches technisches Material in die Präsentation aufgenommen, damit Sie zumindest etwas lernen, wenn Ihnen das Gespräch nicht lustig erscheint. Ich stelle fest, dass dies nur unsere Meinung ist, die möglicherweise nicht mit der Meinung unserer Arbeitgeber übereinstimmt.

Michael: Die erste Geschichte heißt "Schatz, ich habe die Entropie reduziert!" Sie spricht darüber, wie der Autor von Silent Banker, einem sehr komplexen Verschlüsselungsalgorithmus, vergessen hat, mit PRNG - einem Pseudozufallszahlengenerator - Entropie zu erzeugen. Auf der Folie sehen Sie ein Zeus-Code-Snippet vom September 2007, in dem PRNG verwendet wird, um eine Hash-basierte Erkennung zu verhindern. Die Generierung besteht darin, diese globale Variable mit dem Namen ddTickCount zu initiieren: Zunächst wird sie im EAX-Register abgelegt, von wo aus die Funktion zum ersten Mal aufgerufen wird. Dann wird geprüft, ob der Wert der Funktion gleich Null ist, und wenn nicht gleich, wird TickCount aufgerufen, um SEED zu erzeugen, dh eine Pseudozufallszahl mit dem Befehl GetTickCount zu initiieren.



Wir waren nicht überrascht, als wir die Ähnlichkeiten mit diesem Code in der Silent Banker-Binärdatei vom Februar 2008 sahen. Es verwendet PRNG, um temporäre Dateinamen zu generieren. Auch hier gibt es dieselbe globale Variable ddTickCount, die prüft, ob es eine Null gibt, und wenn dies der Fall ist, wird mit GetTickCount eine Pseudozufallszahl initiiert. Bevor ich msvsrt rand sah, den Pseudozufallszahlengenerator, der von der rand () - Funktion der Microsoft C Runtime Windows-Bibliothek verwendet wird, dachte ich zunächst, dass es eine Verbindung zwischen dem Zeus-Autor und dem Silent Banker-Autor gibt, die nur auf HEX-Zahlen basiert, die in einer Binärdatei fest codiert sind . Tatsächlich waren beide nur statisch mit msvsrt verbunden.

Jetzt kommen wir zum Rezept für eine Katastrophe. Dies ist ein Codeausschnitt aus der Silent Banker-Version vom Juli 2008, die einige Monate nach der Februar-Version veröffentlicht wurde.



Sie haben ihren Code aktualisiert und eine neue Version von Silent Banker veröffentlicht, die sich erheblich von der vorherigen Version unterschied. In diesem Programm wird PRNG verwendet, um einen Verschlüsselungsschlüssel zu generieren. Hier sehen Sie nicht mehr, dass eine globale Variable namens CurrentSeed auf Gleichheit mit Null geprüft wird und abhängig davon eine Pseudozufallszahl generiert wird. Sie wird einfach in diesem Code verwendet.



Es ist möglich, dass irgendwo in der Binärdatei, noch vor diesem Ort, der Wert dieser globalen Variablen in Form einer Art von Zahl generiert wird. Also zerlege ich diesen Code und überprüfe, ob der CurrentSeed-Wert an anderer Stelle im Programm verwendet wird, bevor er in dieser rand () -Funktion verwendet wird. Sie sehen, dass dd anfangs von vorne beginnt, und wir werden die Querverweise auf diese Variable überprüfen.



In Spalte T bedeutet der Wert w, dass es für diese globale Variable in der gesamten Binärdatei nur eine gültige Operation gibt - dies ist die Rand-Funktion selbst. Ich werde diese Dinge fließend durchgehen, da sie bereits auf der DefCon im letzten Jahr erwähnt wurden. Auf der Folie "Rezept für eine Katastrophe" wird die Zeile "PRNG-Seed" oder "Initiierung eines Pseudozufallszahlengenerators" grau angezeigt, um anzuzeigen, dass der Autor von Silent Banker diese Initiierung nicht durchgeführt hat.



Der nächste Schritt besteht darin, dass sie einen 16-Byte-Schlüssel generieren und 1000 Systemaufrufe an die MyRand () - Funktion senden. Dann generieren sie aus einem 16-Byte-Schlüssel eine 8-Byte-Zahl - den Schlüssel unter Verwendung einer bestimmten Formel.

Danach generieren sie eine weitere 8-Byte-Nummer, um aus der ersten 8-Byte-Nummer einen Sekundärschlüssel zu erstellen, fügen einen beliebigen Wert aus der INI-Konfigurationsdatei hinzu und erhalten einen Tertiärschlüssel, der ebenfalls eine 8-Byte-Nummer ist. Schließlich verwenden sie eine mathematische Funktion mit beliebiger Genauigkeit, um einen 8-Byte-Schlüssel in einen 32-Byte-Schlüssel umzuwandeln.

Danach verschlüsseln sie die gestohlenen Daten wie das Kennwort des Benutzers mit dem ursprünglichen 16-Byte-Schlüssel. Sie geben diese 16-Byte-Nummer jedoch nicht mit den gestohlenen Daten an "ihren" Angreifer weiter, da das Senden des Schlüssels zusammen mit der verschlüsselten Nachricht keine gute Idee ist. Stattdessen fügt der Autor von Silent Banker eine 32-Byte-Nummer in die gestohlenen Daten ein und sendet sie an den Empfänger, der über ein Programm verfügen sollte, das diese Nummer zurück in den 16-Byte-Originalschlüssel konvertiert. Dieses Programm haben wir jedoch nicht!

Die nächste Folie zeigt ein Rezept, wie Sie diese Katastrophe mit Nummer 1 - dem Fehlen eines PRNG-Generators - zu Ihrem Vorteil nutzen können.



Zunächst setzen wir den Wert von PRNG mit Null gleich. Wir können die nächsten vier Schritte mithilfe eines Python-Skripts für den Debugger automatisieren, da wir eine Formel haben, die einen 16-Byte-Schlüssel, einen 8-Byte-Schlüssel, den nächsten 8-Byte-Schlüssel und einen 32-Byte-Schlüssel berechnet. Diese Formel ist nicht im C-Code enthalten, aber wir haben sie, weil wir eine Kopie der Silent Banker-Binärdatei haben, in der sie vorhanden ist.

Ich werde Ihnen eine Demo zeigen, wie dieses Python-Skript funktioniert. Wir haben ein gutes Szenario: Hier habe ich Silent Banker und einen unabhängigen Debugger, an den ich angeschlossen bin, sowie den Internet Explorer, in dem Silent Banker ausgeführt wird. Ich habe vier Funktionen festgestellt, die Verschlüsselungsschlüssel generieren. Ich füge dieses Python-Skript hinzu, das in der vorherigen Folie gezeigt wurde und das ich mit dem Befehl bang keygen aufrufe. Sie können sehen, dass der Debugger diese wenigen Funktionen, die ich für diese Demo ausführen möchte, einfach fünfmal „verliert“. Im wirklichen Leben haben wir diese Aktion 5.000 Mal ausgeführt, um einen größeren Schlüsselsatz zu erhalten.

Im Protokollfenster können Sie sehen, dass für jede Iteration der Schleife ein primärer 16-Byte-Schlüssel ausgegeben wird, der dann einem 32-Byte-Schlüssel zugeordnet wird. Während das Skript Informationen im Protokoll druckt, wird auch eine Textdatei auf der Festplatte erstellt, die Paare von Schlüsseln mit 16 und 32 Byte enthält. Es ist nur eine hexadezimale HEX-Datei, daher können wir unser Python-Skript verwenden, um diese Datei zu verarbeiten. Wir haben auch ein Protokollverzeichnis, das wir vom gestohlenen Befehls- und Steuerknoten wiederhergestellt haben.



Oben sehen Sie mehrere Zertifikate verschlüsselter privater Schlüssel. Darunter befinden sich mehrere Textdateien, die verschlüsselte Daten enthalten. Wir können das Programm einfach ausführen und in diesen Textdateien suchen, indem wir diesen 32-Byte-Schlüssel und den damit verbundenen 16-Byte-Originalschlüssel extrahieren.

Sobald das Programm einen 16-Byte-Schlüssel findet, entschlüsselt es die darin enthaltenen Informationen und präsentiert sie in Form einer Textdatei. Sie sehen diese Datei auf dem Bildschirm und können sie nicht lesen.



Aber dann haben wir eine Reihe lesbarer temporärer .tmp-Dateien, von denen wir diese Informationen erhalten und an die "rechtmäßigen" Eigentümer zurückgeben können. Die ganze harte Arbeit zum Schutz von Informationen wurde von Silent Banker vergebens geleistet, weil sie vergessen hatten, einen Pseudozufallszahlengenerator zu initiieren.



Jetzt werde ich den besten Teil des oben genannten zeigen - dies ist die Silent Banker-Funktion, die ich Why_Not_Use_This genannt habe (Warum nicht verwenden?).



Tatsächlich haben sie in ihrem eigenen Programm die Funktion GetCursorPos (Bestimmen der Cursorposition) zum Erzeugen von Entropie, mit der PRNG initiiert werden kann, und wir können im Programm nach Querverweisen auf diese Funktion suchen.



Wir sehen, dass es an 10-15 anderen Stellen im Code verwendet wird. Es stellt sich also heraus, dass die Autoren von Silent Banker nicht vergessen haben, einen Pseudozufallszahlengenerator in das Programm einzufügen, sondern einfach vergessen haben, diese Funktion im Verschlüsselungsprozess mit dem Aufrufoperator auszuführen.



Die nächste Folie heißt "Das ist weggerutscht ..." und zeigt, wie dieses Programm funktionieren würde, wenn der Autor nichts vergessen hätte.



Die nächste Geschichte mit dem Titel "DES oder nicht DES" handelt von einem Malware-Autor, der nicht einmal weiß, wie man die Windows-Programmierschnittstelle richtig verwendet, oder nicht weiß, wie groß der maximale DES-Schlüssel ist. Aufgrund der ungültigen Größe dieses Schlüssels wird sein Trojaner daher standardmäßig mit dem logischen Operator xor verwendet.

Für die CryptDeriveKey-Programmschnittstellenfunktion bestimmen die beiden niedrigen Bytes des Parameters dwFlags, Flags, die festlegen, wie die resultierende URL aussehen soll, die Größe Ihres Verschlüsselungsschlüssels.



Wenn die niedrigen Bytes also 0080 sind, ist der von uns angeforderte Verschlüsselungsschlüssel ein 128-Bit-RC4-Schlüssel. Es ist dasselbe, als würde man sich in den Fuß schießen, und ich werde Ihnen zeigen, warum.



Auf der Folie sehen Sie eine Zeile mit der falschen Größe des 128-Bit-Schlüssels dwFlags - 800000 und eine Zeile mit dem falschen MSCryptoAPI-Wert. Ich werde Ihnen die Demontage dieses Dings zeigen. Sie sehen eine Funktion namens "Initialisieren des Verschlüsselungssubsystems": Der Trojaner ruft den verschlüsselten Kontext auf und erstellt dann einen Container für den MD5-Hash, erstellt dann einen MD5-Hash des fest codierten Kennworts in der Binärdatei und versucht, die Ausgabe dieser Hash-Funktion zum Erstellen eines 128-Bit-DES-Schlüssels zu verwenden. In diesem Fall wird jedoch kein Schlüssel erstellt, da es keinen 128-Bit-DES-Schlüssel gibt.



Wenn eine dieser API-Funktionen fehlschlägt, springt sie zu dieser Stelle, die ich gelb markiert habe, und zeigt eine Meldung an, dass der Schlüssel nicht empfangen werden kann. Und dieser Ort ist genau hier, wo er den Wert, der in ebp ist und zu diesem Zeitpunkt 0 ist, also direkt in diesen booleschen Wert bUseMSCryptoAPI verschiebt.

Mal sehen, welchen Effekt dies während der Programmausführung hat. Wir werden diesem Element der Codestruktur folgen, um zu sehen, wo es sonst im Programm verwendet wird und wie unterschiedlich sich dieses Trojaner-Exponat verhält, wenn die Funktion wahr ist und wenn die Wunde falsch ist.



Wir sehen, dass der logische Wert in der Funktion überprüft wird, die ich Daten verschlüsseln nannte, "Datenverschlüsselung", und wenn es wahr ist, kommt es zu diesem Block, in dem DES-Verschlüsselung und CryptEncrypt MSAPI verwendet werden.



Wenn dieser Wert jedoch 0 ist und es bekanntlich immer früh Null ist, geht die Funktion zu diesem Block, der standardmäßig xor ist.



Ich war gespannt, zu welchem ​​Zeitpunkt der Autor des Schadprogramms beschlossen hat, all dies zu sichern. Vielleicht drängten ihn die Leute von oben, so dass er gezwungen war, Malware loszuwerden, aber in letzter Minute stellte er fest, dass sein DES nicht funktionierte, und benutzte xor für die Backup-Aufzeichnung. Alles in allem war es ziemlich lustig, also ist die Moral dieser Geschichte, immer Backups zu machen!

Die folgende Geschichte heißt "Was hast du mit was gemacht?". Ich habe versucht, einen Begriff zu finden, der beschreibt, wie die Verschlüsselung des Coreflood-Trojaners funktioniert, und habe beschlossen, ihn als "standortabhängige Verschlüsselung" zu bezeichnen. Kurz gesagt, die Autoren dieses Trojaners haben eine neue Verschlüsselungsmethode erfunden. Ich dachte, vielleicht hat schon jemand einen Artikel darüber geschrieben und es sollte "google" sein? Google gab mir einen Link zu einer US-Patentseite, auf der jemand ein Patent für "ortsabhängige Verschlüsselung" angemeldet hat. Dieses Schema ist ziemlich verwirrend, daher wird es viel Zeit in Anspruch nehmen, es zu studieren. So funktioniert es: Ich sende Ihnen eine verschlüsselte Nachricht. Um sie zu entschlüsseln und zu lesen, müssen Sie ein GPS-Gerät nehmen und zu einem Punkt mit dem von mir angegebenen Breiten- und Längengrad gehen. In der Regel ist die Verschlüsselung ein Kompromiss zwischen Sicherheit und Benutzerfreundlichkeit, bei dieser Methode gibt es jedoch weder die eine noch die andere.



Dies ist definitiv nicht sicher und erfordert, dass Sie dorthin gehen, wo der Absender zeigt, um die Nachricht zu lesen. Matt scherzte, wenn Sie online per E-Mail kämpfen und wirklich jemanden loswerden möchten, senden Sie ihm eine verschlüsselte Nachricht, die er irgendwo im Irak lesen kann, und Sie werden keine Probleme mehr mit ihm haben.

Wie wird diese Methode im Coreflood-Trojaner verwendet? Die Folie zeigt ein Codefragment, aus dem folgt, dass der Trojaner, nachdem er Benutzerinformationen gestohlen hat, diese verschlüsselt und auf die Festplatte schreibt, damit der Trojaner diese Informationen später empfangen und Befehl und Kontrolle auf seine Website hochladen kann.

Diese Funktion heißt SetFilePointer (setzt den Dateizeiger) und ihr Rückgabewert ist dWord. Dies gibt den Versatz in der Datei an, auf den der Zeiger gesetzt wurde, wenn er überschritten wurde. Als nächstes nimmt die Funktion die Anzahl der Bytes, um nNumberOfBitesToWrite zu verschlüsseln, und verschiebt sie in das ecx-Register. Sie nimmt dann den Datenzeiger zur Verschlüsselung und verschiebt ihn in das edx-Register.



Danach wird der xor-Operator verwendet, der jedes Byte in den al- und ah-Puffer legt. Dies bedeutet, dass von SetFilePointer zurückgegebene Bytes auf niedriger und hoher Ebene zurückgegeben werden. Somit ist der Verschlüsselungsschlüssel in diesem Schema der Offset in der Datei, in der die Daten vorhanden sind. Das ist einfach unglaublich!

Die nächste Folie heißt "So setzen Sie einen Core-Dump zurück". Es zeigt das dumpCore-Programm, das ich gerade geschrieben habe und das gerade herausgekommen ist. Sie können es herunterladen, es gibt den gesamten Quellcode. Dieses Programm hilft Ihnen, wenn der Computer mit dem Coreflood-Virus infiziert ist, der aus irgendeinem Grund nicht zum Befehls- und Kontrollserver gelangen konnte, um die gestohlenen Daten herunterzuladen. So können Sie diese Dateien, die er auf der Festplatte gespeichert hat, abrufen und mit meinem Programm entschlüsseln, um herauszufinden, was Ihnen gestohlen wurde, beispielsweise wenn Sie den Client darüber informieren müssen.

Die Protokolle der gestohlenen Daten sind auf der Folie rot eingekreist.



Was in Coreflood immer noch interessant ist: Obwohl es einen ziemlich schwachen Verschlüsselungsalgorithmus hat, versucht es immer noch, alle gestohlenen Informationen über die Computerkonfiguration des Opfers, alle Zielinformationen von Banken und Kreditgenossenschaften usw. zu übertragen. Eine andere Möglichkeit, einen Core-Dump zu entfernen, heißt "So entfernen Sie einen Core-Dump mit Wireshark". Wireshark ist ein Programm, das den Ethernet-Netzwerkverkehr oder den TCP-Datenfluss analysiert.



Die folgende Folie zeigt, wie Coreflood funktioniert. Dies sind DLLs, die in Explorer und Internet Explorer eingegeben werden. Sie ändern die Registrierung, erfordern einen Neustart der Anwendung, erfordern jedoch keinen Neustart des Systems. Es gibt verschiedene Möglichkeiten, diese DLLs in einen Prozess einzufügen.



Wichtig für Hacker, die unbemerkt in den Virus eindringen möchten, ist, wie der Virus auf den Computer des Benutzers gelangt: Erfordert ein Neustart des Systems, damit die Malware Auswirkungen hat, oder reicht es aus, dass der Benutzer die Anwendung einfach neu startet, in diesem Fall den Explorer.

Und jetzt ist es ruhig, so dass niemand hören kann!



Dies ist der Code, den wir mithilfe des Reverse Engineering rekonstruiert haben. Dies zeigt, wie Coreflood den Explorer manuell herunterfährt, damit die Änderungen sofort wirksam werden. Sie wissen wahrscheinlich, was passiert, wenn der Explorer auf dem Computer ausfällt - die Taskleiste verschwindet, die Fenster aller geöffneten Anwendungen, alle Symbole auf dem Desktop verschwinden und nacheinander kehren sie an ihren Platz zurück.

Die Autoren von Coreflood wussten offensichtlich davon und platzierten an dieser Stelle einen Systemaufruf, um den "richtigen" Fehlermodus des Dirigenten unmittelbar vor dem OpenProcess-Aufruf einzustellen.

Was macht die SetErrorMode-Funktion? Es verhindert einen bestimmten Fehler von an das System gesendeten Benachrichtigungen, die ein kleines Popup-Fenster erstellen und eine Fehlermeldung senden, die zum Beenden der Anwendung führte. Mit dieser Fehlermeldung wurde lediglich verhindert, dass dem Benutzer ein Popup-Fenster angezeigt wird, bevor der Explorer fehlschlug. Sagen Sie mir, was für den Benutzer verdächtiger aussieht: ein kleines Popup-Fenster, das vom Verschwinden von allem begleitet wird, was auf dem Bildschirm angezeigt wird und dann wieder angezeigt wird, oder das Verschwinden und Erscheinen von allem ohne Fehlermeldung? Ich habe gehört, Sie sagten: "Beide Ereignisse."

Die nächste Folie rief ich "Mit Armen und Beinen, aber ohne Kopf." Wenn Coreflood als DLL geladen wird, wird es nicht in der Liste der geladenen Module angezeigt. Er ordnet dem Haufen ein wenig Speicher zu und kopiert sich an diesen Haufenplatz - ich habe ihn in einen roten Rahmen gesetzt.



Dann löscht er seinen PE-Header. Wenn Sie also auf einen mit diesem Trojaner infizierten Computer stoßen, sagen Sie: "Mein nächster Schritt sollte darin bestehen, diese ausführbare Datei zu sichern und zur Analyse auf die IDA hochzuladen." Es ist jedoch sehr schwierig, die ausführbare Datei zu sichern. Wenn es keinen PE-Header gibt. Wenn Coreflood die virtuelle Zuweisung aufruft, definiert es das Mem-Flag von oben nach unten, wodurch das System die höchste und nicht die niedrigste verfügbare Adresse zurückgibt. Dadurch kann der Trojaner das Öffnen / Schließen von Anführungszeichen in einem höheren Speicherbereich des Benutzermodus unter anderen System-DLLs verbergen. Daher rief ich in der nächsten Demo "Wie man alles, was verborgen ist, unbrauchbar macht".



Wenn Sie auf etwas wie Coreflood stoßen, das Stealth verwendet, und es keine vorgefertigten Tools für die Arbeit mit solchen Viren gibt, müssen Sie Ihre eigenen erstellen.
Wenn Sie mit dem Entpacken vertraut sind, ist die Verwendung eines Debuggers für Sie üblich. Besonders wenn es keinen automatischen Entpacker gibt, da dies kein gängiger Algorithmus ist. In diesem Fall können Sie den Debugger verwenden, um zum ursprünglichen Einstiegspunkt zu gelangen und dann den Dump des Trojaners mit ProcDump oder einem anderen Dienstprogramm zu entfernen. PE Import Reconstructor, , , .

, . . Volatility, Internet Explorer . , Coreflood, , . , 7FF81000.



, HEX , Coreflood. , , . .

, , Coreflood, Volatility . , ID Internet Explorer. , , PID 1732. Malfind, , , , . VAD , , . , .



, , 7FF81000. , Fix IAT, PID 1732 Internet Explorer , Coreflood.

dll, Internet Explorer, , RBA , , .

Anschließend zerlegt er alle Informationen, beginnend im Speicherbereich bei 7FF81000, und sucht nach Systemaufrufen, die zu einer dieser exportierten Funktionen führen. Somit wird die Tabelle der importierten Adressen auch ohne PE-Header neu erstellt. Sie sehen, dass das von ihm ausgegebene Ergebnis dem Ergebnis von Import Reconstructor ähnelt: Es gibt ein Modul, die erste Funktion und jede aus den Modulen importierte Funktion. Die Ausgabe dieses Fix IAT-Skripts ist nicht ausführbar. Sie können es also im PE-Änderungs-Viewer öffnen und dann feststellen, dass die Importtabelle erfolgreich wiederhergestellt wurde.



21:15

DEFCON-Konferenz 17. Lachen Sie über Ihre Viren! Teil 2


Vielen Dank für Ihren Aufenthalt bei uns. Gefällt dir unser Artikel? Möchten Sie weitere interessante Materialien sehen? Unterstützen Sie uns, indem Sie eine Bestellung aufgeben oder Ihren Freunden empfehlen, einen Rabatt von 30% für Habr-Benutzer auf ein einzigartiges Analogon von Einstiegsservern, das wir für Sie erfunden haben: Die ganze Wahrheit über VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s von $ 20 oder wie teilt man den Server? (Optionen sind mit RAID1 und RAID10, bis zu 24 Kernen und bis zu 40 GB DDR4 verfügbar).

VPS (KVM) E5-2650 v4 (6 Kerne) 10 GB DDR4 240 GB SSD 1 Gbit / s bis Dezember kostenlos, wenn Sie für einen Zeitraum von sechs Monaten bezahlen, können Sie hier bestellen.

Dell R730xd 2 mal günstiger? Nur wir haben 2 x Intel Dodeca-Core Xeon E5-2650v4 128 GB DDR4 6 x 480 GB SSD 1 Gbit / s 100 TV von 249 US-Dollar in den Niederlanden und den USA! Lesen Sie mehr über den Aufbau eines Infrastrukturgebäudes. Klasse mit Dell R730xd E5-2650 v4 Servern für 9.000 Euro für einen Cent?

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


All Articles