Crypt, XOR, Hacken von unverschlüsseltem ZIP und PRSP. Problemlösung mit r0ot-mi Crypto. Teil 2

Bild

In diesem Artikel lernen wir die Crypt-Funktion kennen, wie man Passwörter für ein ZIP-Archiv mit unverschlüsselten Dateinamen auswählt, sich mit dem Dienstprogramm xortool vertraut macht und auch mit einem Pseudozufallszahlengenerator umgeht. Vorherige Artikel zu diesem Thema:

Teil 1 - Kodierungen, Shift-Chiffre, Brute-Hashes und Bilderzeugung mit PIL-Python.

Organisatorische Informationen
Speziell für diejenigen, die etwas Neues lernen und sich in einem der Bereiche Informations- und Computersicherheit weiterentwickeln möchten, werde ich folgende Kategorien beschreiben und besprechen:

  • PWN;
  • Kryptographie (Crypto);
  • Netzwerktechnologien (Netzwerk);
  • Reverse (Reverse Engineering);
  • Steganographie (Stegano);
  • Suche und Ausnutzung von WEB-Schwachstellen.

Darüber hinaus werde ich meine Erfahrungen in den Bereichen Computerforensik, Analyse von Malware und Firmware, Angriffe auf drahtlose Netzwerke und lokale Netzwerke, Durchführung von Pentests und Schreiben von Exploits teilen.

Damit Sie sich über neue Artikel, Software und andere Informationen informieren können, habe ich in Telegram einen Channel und eine Gruppe erstellt, um alle Fragen im Bereich ICD zu diskutieren . Auch ich werde Ihre persönlichen Wünsche, Fragen, Anregungen und Empfehlungen persönlich berücksichtigen und auf alle antworten .

Alle Informationen werden nur zu Bildungszwecken bereitgestellt. Der Autor dieses Dokuments übernimmt keine Verantwortung für Schäden, die jemandem durch die Verwendung von Kenntnissen und Methoden entstehen, die er durch das Studium dieses Dokuments erlangt hat.


ELF64 - PID-Verschlüsselung


Bild

Wir schauen uns den Quellcode an. Das Programm nimmt einen String als Argument und vergleicht ihn mit dem, was die cryt-Funktion von der PID des Programms und dem String "$ 1 $ awesome" zurückgibt.

Die cryt-Funktion ist eine Bibliotheksfunktion, mit der der Passwort-Hash berechnet wird. Die Ausgabe der Funktion ist nicht nur ein Hash, sondern eine Textzeile, die auch Salt, den verwendeten Hash-Algorithmus und die Parameter enthält, mit denen der Hash empfangen wurde, z. B. die Anzahl der Runden und andere Optionen.

Bild

Diese Funktion ist in den Programmiersprachen Perl, PHP, Pike, Python und Ruby enthalten. Daher müssen Sie die PID erraten, mit der das Programm gestartet wird. Nachdem wir uns über SSH verbunden haben, sehen wir, dass sie uns ein Programm, seine Quelle und eine Datei mit einem Passwort geben.

Bild

Unter Linux erhält jede neu ausgeführte Anwendung den ungefähren inkrementellen freien PID-Wert. Führen Sie beispielsweise ps mehrmals hintereinander aus. Die PID wird jedes Mal erhöht.

Bild

Sie können also den Hash aus jeder freien PID berechnen und mit diesem Wert als Argument das Programm endlos ausführen. Nehmen wir die PID, zum Beispiel 30000, und führen Sie die Verschlüsselungsfunktion aus. Ich werde es in Python tun.

Bild

Führen Sie nun eine Endlosschleife der Programmausführung aus.

Bild

Und eine Minute später erhalten wir eine Shell, von der wir das Passwort lesen.

Bild

Datei - PKZIP


Bild

Laden Sie die Datei herunter, die sie uns geben. Dies ist ein passwortgeschütztes ZIP-Archiv. Lass uns das Passwort durchgehen. Da die Dateinamen nicht verschlüsselt sind, machen wir es zum Dienstprogramm fcrackzip und nehmen rockyou.txt als Wörterbuch.

Bild

Nach dem Entpacken erhalten wir eine Textdatei, in der steht, dass die Antwort das Passwort aus dem Archiv ist.

Bild

Bekannter Klartext - XOR


Bild

Wir erhalten ein mit XOR BMP verschlüsseltes Bild. Da wir XOR verwendet haben (ich nehme an, mit einem kurzen Schlüssel) und einen großen Chiffretext haben, können Sie xortool verwenden.

Bild

Xortool glaubt daher, dass die wahrscheinlichste Schlüssellänge 6 ist. Lassen Sie uns ihn bitten, den Schlüssel zu bestimmen.

Bild

Großartig. Der Schlüssel ist definiert, aber xortool selbst hat die Datei entschlüsselt und im Verzeichnis xortool_out gespeichert.

Bild

Code - Pseudozufallszahlengenerator


Bild

Wir erhalten ein Programm, mit dem die Datei verschlüsselt wird, sowie die Datei selbst. Darüber hinaus heißt es, dass die Verschlüsselung im Dezember 2012 stattgefunden hat. Bereinigen wir den Code.

Zu Beginn des Programms wird die aktuelle Uhrzeit gespeichert (genauer gesagt die seit dem 1. Januar 1970 verstrichene Uhrzeit). Als nächstes wird das Vorhandensein des Programmparameters überprüft - der Pfad zur Datei.

Bild

Bild

Dann wird diese Datei zum Lesen geöffnet und eine neue Datei zum Schreiben erstellt. Die Deskriptoren beider Dateien werden an die Funktion crypt_file übergeben.

Bild

In crypt_file invertiert die Funktion genere_key () den 32-Byte-Schlüssel, der zum XOR-Verschlüsseln der Datei verwendet wird. Das Verschlüsselungsergebnis wird in die neu erstellte Datei geschrieben.

Bild

Der Schlüssel wird pseudozufällig kompiliert. Aus dem angezeigten Alphabet wird bei jedem Schritt ein Wert ausgewählt, der von dem Holdrand-Wert abhängt, der sich auch bei jedem Schritt ändert, und der ganz am Anfang der aktuellen Zeit entspricht.

Bild

Daher müssen wir mögliche Schlüssel generieren. Der Python-Quellcode sieht so aus.
keys = [] charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789" l = len(charset) holdrand = None def Rand(): global holdrand holdrand = holdrand * 214013 + 2531011 return ((holdrand >> 16) & 0x7fff) def genere_key(): key = "".join( [ charset[Rand()%l] for _ in range(32) ] ) keys.append(key) start = ? fin = ? for ts in range(start, fin): holdrand = ts genere_key() 


Jetzt beschäftigen wir uns mit den Grenzen der Zeit. Da die Verschlüsselung im Dezember 2012 durchgeführt wurde, müssen alle möglichen Werte vom 1. bis 31. Dezember sortiert werden.

Bild

 start = 1354320000 fin = 1356998400 


Wir haben uns für die Grenzen entschieden, aber es wird noch viele Schlüssel geben. Zum Glück hat die Datei ihre Endung - das ist bz2.

Bild

Das heißt, die ersten drei Bytes der Datei müssen "BZh" sein, das vierte muss eines der Zeichen von "1" bis "9" sein und die nächsten sechs Bytes müssen 0x314159265359 sein. Fügen wir einen Filter für die Schlüssel hinzu. Dazu benötigen wir die ersten Bytes des Chiffretexts.

Bild

 def key_filter(key): ctext = "\x23\x17\x5d\x70\x5a\x11\x6d\x67\x37\x08" BZh = "BZh" sign = "".join( [ chr(ord(ctext[i])^ord(BZh[i])) for i in range(3) ] ) byte4 = "".join( [ chr(ord(ctext[3])^ord(i)) for i in "123456789" ] ) bytePI = chr(ord(ctext[4])^0x31) if sign in key[:3] and key[3] in byte4 and key[4] in bytePI: print(key) 


Und wir bekommen nur einen Schlüssel.

Bild

Mit demselben Xortool können Sie die Datei mit dem Schlüssel als Proxy speichern.

Bild

Damit haben Sie das Archiv entschlüsselt.

Sie können sich uns per Telegramm anschließen . Bauen wir eine Community auf, in der es Menschen geben wird, die sich in vielen Bereichen der IT auskennen. Dann können wir uns gegenseitig in allen Fragen der IT- und Informationssicherheit helfen.

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


All Articles