![]() |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Hi Marcu, Du sagst es gibt keinen Weg, das Passwort zu erraten, das wuerde ich so als falsch hinstellen. Es gibt im Moment keinen Weg das Passwort einfach zu berechnen. Raten hingegen ist wie Lotto spielen, der eine hat es beim ersten Mal, der andere zahlt sein ganzes Leben ein und kriegt nix. Hoffentlich gibt es weniger Opfer als Lottospieler.
Diese 3. temporaere Datei in einem Toolkit wiederherzustellen empfinde ich durchaus nicht als sinnlos. Da wohl eben viele Privatanwender betroffen sind, ohne direktes Backup. Eine Zusammenstellung von einem Toolkit welches diese Datei wiederherstellt und in ein leserliches Format bringt, kann zumindestens helfen einen Katalog der verschwundenen Daten zusammenzustellen. Und diese dann z.B. aus dem Freundeskreis oder auf alten Sticks/CDs oder was auch immer wiederzufinden (hoffentlich). Oder eben auch beim Sortieren nach wichtig und unwichtig helfen. Ahja, noch etwas. Habe mal testweise diese Meldung mit dem Word abschiessen muessen. (Rechtsklick, Schliessen, Warten, bestaetigen) Das hat den ganzen Prozess gekillt inklusive der CC-Serverkommunikation. Allerdings der Autostart und die Deaktivierung von regedit und taskmgr blieben. Aber immerhin keine Verschluesselung. Wer also an diesem Punkt noch aussteigen will, hat gute Chancen solange er nicht in das System bootet ohne vorher den Ransom mit einer Bootdisc etc. unschaedlich zu machen. Leider braucht es fuer die Meisten erst das Fensterchen mit der Geldforderung um zu bemerken, dass da was im Argen ist. |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Bin via
![]() Falls Bedarf besteht, könnte ich ein Sample einer kompletten Email incl. Anhang buchung.zip mit darin enthaltener FlirtFever....exe zur Verfügung stellen. Ein Bekannte hat diese Email am 31.5.12 erhalten und _natürlich_ versucht, den Anhang zu öffnen. Ergebnis: Die meisten Dateinamen lauten nun ANjjladUrQnLpDxxuOqye usw., die Inhalte scheinen verschlüsselt. Wir konnten zu 16 verschlüsselten Dateien das unverschlüsselte Original ausfindig machen. Versuche mit den auf ![]() Grüsse |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
@CAG83
Zitat:
Wenn man einem Programmierer davon erzählt was der Autor des Trojaners sich ausgedacht hat, glaubt er es zunächst mal nicht. Da sollen also eine handvoll Server, die ständig auf der Flucht sein müssen, durch hin und her schicken von Passwörtern über das Internet, die Brauchbarkeit der Dateien von vielen Computern steuern. Und das Ganze noch ohne jegliches Fallback für den Fall das etwas dabei nicht klappt. Ich denke ein verantwortungsvoller Programmierer würde sich vermutlich bei einem solchen Szenario mit dem Zeigefinger an die Stirn tippen und sich abwenden, weil er sieht, dass so etwas nicht robust ist. Das Risiko für die Daten und der Aufwand ist viel zu hoch. Einige werden bezahlen und dann bemerken dass ihre Daten nicht entschlüsselt werden, weil das baufällige Verfahren der Erpresser nicht funktioniert. Den Erpressern ist es egal. Die haben das Geld. Ein Notfallverfahren haben die Erpresser nun doch vorgesehen, fällt mir gerade ein. Man soll eine E-Mail schicken. Diesmal schon mit Bitcoins im Wert von 200€. Wenn man das tut, haben die Erpresser weitere 200€, aber da die ja die ComputerId nicht haben, können die auch nicht das dazugehörige Passwort zurückschicken. Das ist also nur ein Trick um noch mehr Geld herauszuholen. :-( @bombinho Zitat:
Das gesuchte Passwort wird mit folgender Funktion erstellt:
Delphi-Quellcode:
function GetRandomString(s: pchar; len: DWORD): Boolean;
const L: array[0..75] of Char = ( 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'p', 'l', 'f', 'y', 'r', 'n', 'y', 'd', 's', 'j', 's', 'd', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', 'P', 'L', 'F', 'Y', 'R', 'N', 'Y', 'D', 'S', 'J', 'S', 'D' ); var i, r: dword; begin i := 0; while i <> len do begin // GetRandomNumber entspricht der Funktion GetCpuTimeCode aus Beitrag #33 r := GetRandomNumber and $3E; // $3e=62 (s + i)^ := l[r]; inc(i); end; end; . . len := (GetRandomNumber and $1F) + 30; // 30<= Passwortlänge len <=30+$1f=61 GetRandomString(CatalogPassword, len); . . Das gesuchte Passwort hat zwischen 30 und 61 Buchstaben. Der Virus wählt dabei Buchstaben aus einem Pool von 63 Zeichen aus. Wenn man das nach unten abschätzt und davon ausgeht, dass das eigene Passwort nur 30 Buchstaben lang ist, dann gibt es 63^30 mögliche Passwörter. Das entspricht einer Zahl mit 53 Nullen (63^30 = 9,5 × 10^53). Angenommen wir hätten eine Testfunktion die uns in einer Millisekunde sagt, ob man das richtige Passwort hat oder nicht, dann müsste man 10^53/(1000*3600*24*365) = 10^42 Jahre warten bis alle Passwörter durchprobiert sind. Ich glaube man schätzt die verbleibende Lebensdauer des Universums auf ungefähr 10^14 Jahre. Auch mit dem Bau schnellerer Computer oder dem Parallelschalten von vielen Computern ist da nichts erreicht. Du hast aber völlig recht, bombinho - es ist möglich das Passwort auf Anhieb zu erraten. Falls mir das gelänge, kämen bestimmt - wie auf einem Jahrmarkt - einige Statistiker zu mir, um den größten Glückspilz aller Zeiten zu bestaunen. Neben mir würde dann ein Lottogewinn wie völlig bedeutungsloser Alltag aussehen. Für die Entschlüsselung der Dateien gilt genau das gleiche. Das für jede verschlüsselte Datei generierte Passwort wird mit dem gleichen Funtkionsaufruf erstellt. Zitat:
Tatsächlich installiert der Virus sich in dieser Zeit in das System32 Verzeichnis (und in das Anwendungsverzeichnis - für Benutzer ohne Adminrechte) und tut eine Menge mehr. Unter anderem setzt der Trojaner sogar einen Restore Point. Dann wird das Duplikat gestartet, welches der Trojaner gerade von sich selbst angefertigt hat und das angeklickte Programm beendet sich nachdem die in einem Thread gestartete Meldung vom Benutzer bestätigt worden ist. Der Start des Verschlüsselungsvorgang ist zeitlich vor allem an die erfolgreiche Übertragung des Katalogpassworts geknüpft. Erst wenn das Katalogpasswort erfolgreich übertragen ist wird der Katalog erstellt, alle Dateien im Katalog verschlüsselt, der Katalog verschlüsselt abgespeichert und dann das Katalogpasswort aus dem Speicher genullt. Wann die Übertragung des Katalogpassworts gelingt, ist wegen unzuverlässiger C&C-Server unvorhersehbar. Es wird aber nach dem Start des Trojaners regelmäßig versucht, bis es gelingt. vg Marcu PS: der Trojanerprogrammierer hat keine deutsche Tastatur benutzt. Unsere Polizisten müssen wahrscheinlich über Ländergrenzen hinaus ermitteln. Oje .. :-( |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Falls die Zahlen im Code da oben und die Tabelle stimmen, ist der Keyspace um einiges kleiner. Wenn da wirklich nur auf die ersten 62 Werte zugegriffen wird, haben wir da nur die Kleinbuchstaben a-z und die Großbuchstaben QWERTYUIOPASDFGHJKLYXCVB - also nicht 63^30 minimal sondern "nur" 50^30 (denn es ist ja egal, ob das erste oder zweite Vorkommen des Buchstaben "gewürfelt" wird, der Buchstabe selber ist relevant). Wenn man sich jetzt noch anschaut, welcher Zufallszahlengenerator verwendet wurde und welche Ungleichverteilung der bei großen Mengen Zufallszahlen zeigt, lässt sich der Keyspace sicherlich noch um einiges eindampen. Man könnte dann eine Art Gewichtung erstellen, welche Sequenzen wahrscheinlicher sind als andere und damit evtl. schneller den einen oder anderen Treffer landen.
Da fällt mir ein: Hast Du irgendwo Code gefunden, der den RNG initialisiert der da benutzt wird? |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Zitat:
Zitat:
Code:
Schau mal bitte hier, OldGrumpy:
unsigned int GetCpuTimeCode()
{ unsigned __int64 tick; tick = RDTSC(); // Assembler für GetTickCount; return (16807 * (HIDWORD(tick) ^ tick) % 0x1F31D - 2836 * (HIDWORD(tick) ^ tick) / 0x1F31D) % 0x186A0; } ![]() Update: Der RNG sieht in Delphi so aus: (Danke an Yvonne fürs schreiben und recherchieren :-) )
Delphi-Quellcode:
function GetRandomNumber: DWORD;
// http://www.cems.uwe.ac.uk/~irjohnso/coursenotes/ufeen8-15-m/p1192-parkmiller.pdf // Seite 1195 (function Random Integer Version 2) function RDTSC: DWORD; begin asm dw $310F // = rdtsc end; end; const a = 16807; q = 127773; r = 2836; var t, hi, lo, seed: DWORD; begin t := RDTSC; seed:= t and $0000FFFF; //= (t and $FFFF0000) xor t; hi := seed div q; lo := seed mod q; Result := (a * lo - r * hi) mod 10000; end; |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
@OldGrumpy
Um ein bisschen genauer zu sein:
Delphi-Quellcode:
@Marcu
// Count: 59
// neue Tabelle ("-" Elemente werden nicht verwendet) L: Array[0..75] of AnsiChar = ( 'q', 'w', 'e', '-', 't', 'y', 'u', '-', 'o', '-', 'a', '-', 'd', '-', 'g', '-', 'j', 'k', 'l', 'z', 'x', 'c', 'v', 'b', 'n', 'm', 'p', 'l', 'f', 'y', 'r', '-', 'y', '-', 's', '-', 's', 'd', 'Q', '-', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', 'A', 'S', 'D', '-', 'G', '-', 'J', '-', 'L', 'Z', 'X', '-', 'V', 'B', 'N', '-', 'P', 'L', 'F', '-', 'R', 'N', 'Y', '-', 'S', 'J', 'S', 'D' ); Du meintest, man könnte das Passwort leider nicht (clientseitig) zurückberechnen. Ich habe jetzt leider nicht mehr alles in Erinnerung: Ich gehe davon aus, das ein Teil des Passworts vom CC Server generiert wird ( ![]() Man müsste zuerst klarstellen, ob die Generierung zufällig geschieht oder abhängig von Parametern ist (SendViaInternetToC&C-Server(HarddriveSerialnumber+Computername,CatalogP assword)). Falls das Zweitere der Fall ist, so könnte man ja evt versuchen, mit den Parametern rumzuspielen und selber mit dem Server zu kommunizieren und schauen, was man da so als Ergebnis erhält. Daraus könnte man ja weitere Rückschlüsse ziehen und somit evt. den Algorithmus reversen. Edit Ähm, also bei #158 sehe ich nur, dass ein Passwort erstellt wird, dem CC Server mit ner Pseudo ID mitgeteilt und dann schön verschlüsselt wird. Mit der PW Generierung hat der Server eig. nichts zu tun; der hat halt nur das PW gespeichert, was später auf den betroffenen PCs nicht mehr auffindbar ist. Ich meine aber gelesen zu haben, dass der Server etwas damit zu tun hat (ein Teil davon wird vom Server produziert) /Edit Ich sehe nur noch mehr den Weg zur Lösung; oder eben den Server zu "hacken" (es gibt doch so viele Kiddies, die etliche Seiten defacen; sollte also nicht allzuschwer sein (kenne mich mit Webhacking eher weniger aus :P)) |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Hallo Aphton
Zitat:
Zitat:
vg Marcu |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Naja die Sache mit dem Lottogewinn ist ja auch Alltag. Wer wuerde schon Lotto spielen, wenn es nicht jede Woche Gewinner gaebe? Hast du die asm Variante vom verwendeten Zufallsgenerator? Ist das der Standard VB-Generator (Hat VB6 eigentlich noch einen eigenen?), der zum Einsatz kommt? Oder ein Eigenbau?
Oder WinAPI? Immerhin sind genau diese PseudoZufallsgeneratoren oft genug das Einfallstor gewesen. Deswegen haben Firmen mit Hardwaregeneratoren frueher Geld verdient. Ich meine, mittlerweilen sollen einige Prozessoren rauschbasierte Generatoren bieten. |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
Hallo Marcu,
ich war in Kryptologie nie gut. Ich habe im Thread leider auch nicht gefunden, ob schon erwähnt wurde, wie der Tronjaner definitiv verschlüsselt. Wenn es sich um eine mehrstufige Blockchiffre handelt, ist es wohl nicht möglich den Schlüssel auf einfach Art und Weise zurückzurechnen. Sollte es sich um relative einfache Verschlüsselungsmechanismen handeln, könnten wir doch anhand des möglichen Alphabets rückrechnen. Geklärt sind m. A. auch noch nicht die Punkte, ob wirklich für jede Datei andere Passwörter ermittelt werden. (Oder habe ich das auch überlesen?) Auch andere Fragen aus dem Thread sind noch ungeklärt. Viele Grüße |
AW: Verschlüsselungs-Trojaner, Hilfe benötigt
@Aphton
Ich habe nochmal im Virencode nachgeschaut um sicher zu gehen, sogar den Opcode habe ich nachgeschaut - da steht tatsächlich "AND $3E". Sehr merkwürdig. Ist wohl ein Fehler des Programmierers. Schade das der nicht größere Auswirkungen hat. @bombinho Zitat:
![]() Der ASM-Code sieht so aus: (Suche im Virencode nach "rdtsc" . Dann stehst du direkt in der GetRandomNumber- Funktion)
Code:
proc GetRandomNumber
TMP = dword local push ebp mov ebp, esp sub esp, 4 mov [ebp+TMP], 0 push edx push ecx mov eax, [ebp+TMP] or eax, eax jnz short LABEL ; springt nie rdtsc xor eax, edx mov [ebp+TMP], eax LABEL: xor edx, edx mov ecx, 1F31Dh ; q=127773 div ecx mov ecx, eax mov eax, 41A7h ; a=16807 mul edx mov edx, ecx mov ecx, eax mov eax, 0B14h ; r=2836 mul edx sub ecx, eax xor edx, edx mov eax, ecx mov [ebp+TMP], ecx mov ecx, 186A0h ; =10000 div ecx mov eax, edx pop ecx pop edx leave retn end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz