
Knacken der Legacy-Zip-Verschlüsselung mit dem Known-Plaintext-Angriff von Biham und Kocher.
Cracke ältere Zip-Verschlüsselung mit dem Known-Plaintext-Angriff von Biham und Kocher.
Ein ZIP-Archiv kann viele Einträge enthalten, deren Inhalt komprimiert und/oder verschlüsselt sein kann. Insbesondere können Einträge mit einem passwortbasierten symmetrischen Verschlüsselungsalgorithmus verschlüsselt sein, der als traditionelle PKWARE-Verschlüsselung, Legacy-Verschlüsselung oder ZipCrypto bezeichnet wird. Dieser Algorithmus erzeugt einen pseudozufälligen Bytestrom (Keystream), der mit dem Inhalt des Eintrags (Klartext) XOR-verknüpft wird, um verschlüsselte Daten (Chiffretext) zu erzeugen. Der Zustand des Generators, bestehend aus drei 32-Bit-Integern, wird mit dem Passwort initialisiert und dann während der Verschlüsselung kontinuierlich mit Klartext aktualisiert. Dieser Verschlüsselungsalgorithmus ist anfällig für Known-Plaintext-Angriffe, wie von Eli Biham und Paul C. Kocher in der Forschungsarbeit A known plaintext attack on the PKZIP stream cipher gezeigt wurde. Mit gegebenem Chiffretext und 12 oder mehr Bytes des entsprechenden Klartextes kann der interne Zustand des Keystream-Generators wiederhergestellt werden. Dieser interne Zustand reicht aus, um den Chiffretext vollständig zu entschlüsseln sowie andere Einträge, die mit demselben Passwort verschlüsselt wurden. Er kann auch verwendet werden, um das Passwort mit einer Komplexität von nl-6 zu bruteforcen, wobei n die Größe des Zeichensatzes und l die Länge des Passworts ist.
bkcrack ist ein Kommandozeilenwerkzeug, das diesen Known-Plaintext-Angriff implementiert. Die Hauptfunktionen sind:
Die neueste offizielle Version erhalten Sie auf GitHub.
Vorkompilierte Pakete für Ubuntu, MacOS und Windows stehen zum Download bereit. Extrahieren Sie das heruntergeladene Archiv an einen beliebigen Ort.
Unter Windows werden Microsoft-Laufzeitbibliotheken benötigt, damit bkcrack ausgeführt werden kann. Falls sie nicht bereits auf Ihrem System installiert sind, laden Sie das neueste Microsoft Visual C++ Redistributable-Paket herunter und installieren Sie es.
Alternativ können Sie das Projekt mit CMake kompilieren.
Laden Sie zunächst die Quelldateien herunter oder klonen Sie das Git-Repository.
Dann wird durch Ausführen der folgenden Befehle im Quellbaum eine Installation im Ordner install erstellt.
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install
bkcrack ist in den unten aufgeführten Paket-Repositorien verfügbar. Diese Pakete werden von externen Betreuern bereitgestellt.
Sie können eine Liste der Eintragsnamen und Metadaten in einem Archiv namens archive.zip wie folgt anzeigen:
bkcrack -L archive.zip
Einträge, die ZipCrypto-Verschlüsselung verwenden, sind anfällig für einen Known-Plaintext-Angriff.
Der Angriff erfordert mindestens 12 Bytes bekannten Klartext. Mindestens 8 davon müssen zusammenhängend sein. Je größer der zusammenhängende bekannte Klartext, desto schneller der Angriff.
Mit einem Zip-Archiv encrypted.zip, dessen Eintrag cipher der Chiffretext ist, und plain.zip mit dem Eintrag plain als bekanntem Klartext, kann bkcrack wie folgt ausgeführt werden:
bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain
Mit einer Datei cipherfile, die den Chiffretext enthält (beginnend mit den 12 Bytes, die dem Verschlüsselungs-Header entsprechen), und plainfile mit dem bekannten Klartext, kann bkcrack wie folgt ausgeführt werden:
bkcrack -c cipherfile -p plainfile
Wenn der Klartext einem anderen Teil als dem Anfang des Chiffretextes entspricht, können Sie einen Offset angeben. Er kann negativ sein, wenn der Klartext einen Teil des Verschlüsselungs-Headers enthält.
bkcrack -c cipherfile -p plainfile -o offset
Wenn Sie nur wenig zusammenhängenden Klartext kennen (zwischen 8 und 11 Bytes), aber einige Bytes an anderen bekannten Offsets kennen, können Sie diese Informationen angeben, um die Anforderung von insgesamt 12 bekannten Bytes zu erfüllen.
Verwenden Sie dazu das Flag -x gefolgt von einem Offset und Bytes in hexadezimaler Darstellung.
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21
Wenn der Angriff erfolgreich ist, können die entschlüsselten Daten, die dem für den Angriff verwendeten Chiffretext zugeordnet sind, gespeichert werden:
bkcrack -c cipherfile -p plainfile -d decipheredfile
Wenn die Schlüssel aus einem vorherigen Angriff bekannt sind, ist es möglich, bkcrack zum Entschlüsseln von Daten zu verwenden:
bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile
Die entschlüsselten Daten könnten komprimiert sein, je nachdem, ob beim Erstellen der Zip-Datei eine Komprimierung verwendet wurde oder nicht.
Wenn die Deflate-Komprimierung verwendet wurde, kann ein im Ordner tools bereitgestelltes Python-3-Skript verwendet werden, um die Daten zu dekomprimieren.
python3 tools/inflate.py < decipheredfile > decompressedfile
Um in einem Schritt Zugriff auf alle Einträge des verschlüsselten Archivs zu erhalten, können Sie ein neues Archiv mit demselben Inhalt, aber ohne Verschlüsselung erzeugen. Es wird davon ausgegangen, dass alle Einträge ursprünglich mit demselben Passwort verschlüsselt wurden.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -D decrypted.zip
Es ist auch möglich, ein neues verschlüsseltes Archiv mit Ihrem gewünschten Passwort zu erzeugen:
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip new_password
Sie können das neue Passwort auch durch seine entsprechende interne Darstellung definieren.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 --change-keys unlocked.zip 581da44e 8e40167f 50c009a0
Diese beiden Befehle können zusammen verwendet werden, um den Inhalt eines verschlüsselten Archivs zu ändern, ohne das Passwort zu kennen, aber mit Kenntnis der internen Schlüssel: Sie können eine Kopie mit dem von Ihnen gewählten Passwort verschlüsseln, dann die Kopie mit einem Archiv-Manager bearbeiten, wobei Sie bei Aufforderung das gewählte Passwort eingeben, und schließlich eine Kopie des modifizierten Archivs mit den ursprünglichen Verschlüsselungsschlüsseln zurückerstellen.
Mit den internen Schlüsseln kann bkcrack versuchen, das ursprüngliche Passwort zu finden.
Sie können nach einem Passwort suchen, indem Sie Zeichen in einem bestimmten Zeichensatz verwenden:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p
Sie können die Suche auf Passwörter einer bestimmten Länge oder einen Längenbereich einschränken:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 9
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 8..10
Die Option -r <Länge> <Zeichensatz> ist eine Abkürzung für -l 0..<Länge> -b <Zeichensatz>:
bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p
Wenn Sie einige Kenntnisse darüber haben, wie das Passwort aufgebaut ist, können Sie eine Maske angeben, um den Suchraum einzuschränken und die Wiederherstellung viel schneller zu machen. Dies ist relevant für lange Passwörter (wie solche mit 12 oder mehr Zeichen), bei denen Brute-Force sehr zeitaufwändig wird.
Angenommen, Sie erinnern sich vage, dass Ihr Passwort aus 8 Kleinbuchstaben, einem Bindestrich und 6 Dezimalziffern besteht, können Sie diesen Befehl verwenden:
bkcrack -k 1940e266 d3fd3d89 71ce9871 -m ?l?l?l?l?l?l?l?l-?d?d?d?d?d?d
Dies läuft in Millisekunden, während die Brute-Force-Alternative Stunden dauert.
Der Suchraum für sowohl Brute-Force als auch maskenbasierte Passwort-Wiederherstellung wird mit Zeichensätzen definiert. Ein Zeichensatz ist eine Folge von Zeichen oder Abkürzungen für vorhandene Zeichensätze. Vordefinierte Zeichensätze sind unten aufgeführt.
Zusätzlich zu den vordefinierten Zeichensätzen können Sie mit der Option -s benutzerdefinierte Zeichensätze definieren.
Benutzerdefinierte Zeichensätze können auf vordefinierte Zeichensätze oder andere benutzerdefinierte Zeichensätze verweisen.
Benutzerdefinierte Zeichensätze sind besonders nützlich für die präzise Angabe des Suchraums der maskenbasierten Wiederherstellung.
Wenn Sie zum Beispiel wissen, dass Ihr Passwort aus 10 Buchstaben (Groß- oder Kleinbuchstaben) und 5 Binärziffern besteht, können Sie diesen Befehl verwenden:
bkcrack -k b8c377a6 f603160f 1832a78b -m ?x?x?x?x?x?x?x?x?x?x?y?y?y?y?y -s x ?u?l -s y 01
Ein Tutorial wird im Ordner example bereitgestellt.
Für weitere Informationen werfen Sie einen Blick in die Dokumentation und lesen Sie den Quellcode.
Zögern Sie nicht, Verbesserungen vorzuschlagen oder Pull-Requests auf GitHub einzureichen.
Wenn Sie Ihre Unterstützung für das Projekt zeigen möchten, können Sie gerne eine Spende tätigen oder das Projekt über GitHub Sponsors sponsern.
Dieses Projekt wird unter den Bedingungen der zlib/png-Lizenz bereitgestellt.
| Shortcut | Beschreibung | Wert |
|---|
?l | Kleinbuchstaben | abcdefghijklmnopqrstuvwxyz |
?u | Großbuchstaben | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
?d | Dezimalziffern | 0123456789 |
?s | Sonderzeichen | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
?a | Alphanumerische Zeichen | wie ?l?u?d |
?p | Druckbare ASCII-Zeichen | wie ?l?u?d?s |
?b | Alle Bytes | 0x00 .. 0xff |