
Decifra la crittografia legacy dei file ZIP con l'attacco a testo in chiaro noto di Biham e Kocher.
Attacca la crittografia legacy dei zip con l'attacco a testo noto di Biham e Kocher.
Un archivio ZIP può contenere molte voci il cui contenuto può essere compresso e/o crittografato. In particolare, le voci possono essere crittografate con un algoritmo di crittografia simmetrica basato su password, chiamato crittografia PKWARE tradizionale, crittografia legacy o ZipCrypto. Questo algoritmo genera un flusso pseudo-casuale di byte (keystream) che viene XORed con il contenuto della voce (testo in chiaro) per produrre dati crittografati (testo cifrato). Lo stato del generatore, composto da tre interi a 32 bit, viene inizializzato usando la password e poi continuamente aggiornato con il testo in chiaro man mano che la crittografia procede. Questo algoritmo di crittografia è vulnerabile agli attacchi a testo noto, come dimostrato da Eli Biham e Paul C. Kocher nell'articolo di ricerca A known plaintext attack on the PKZIP stream cipher. Dati il testo cifrato e 12 o più byte del corrispondente testo in chiaro, è possibile recuperare lo stato interno del generatore di keystream. Questo stato interno è sufficiente per decifrare completamente il testo cifrato, così come altre voci crittografate con la stessa password. Può anche essere usato per forzare la password con una complessità di nl-6 dove n è la dimensione del set di caratteri e l è la lunghezza della password.
bkcrack è uno strumento a riga di comando che implementa questo attacco a testo noto. Le principali funzionalità sono:
Puoi ottenere l'ultima release ufficiale su GitHub.
Sono disponibili per il download pacchetti precompilati per Ubuntu, MacOS e Windows. Estrai l'archivio scaricato dove preferisci.
Su Windows, le librerie di runtime Microsoft sono necessarie per eseguire bkcrack. Se non sono già installate sul sistema, scarica e installa l'ultimo pacchetto Microsoft Visual C++ Redistributable.
In alternativa, puoi compilare il progetto con CMake.
Prima, scarica i file sorgente o clona il repository git.
Quindi, eseguendo i seguenti comandi nell'albero dei sorgenti verrà creata un'installazione nella cartella install.
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=install
cmake --build build --config Release
cmake --build build --config Release --target install
bkcrack è disponibile nei repository di pacchetti elencati di seguito. Questi pacchetti sono forniti da manutentori esterni.
Puoi vedere un elenco di nomi di voci e metadati in un archivio chiamato archive.zip in questo modo:
bkcrack -L archive.zip
Le voci che usano la crittografia ZipCrypto sono vulnerabili a un attacco a testo noto.
L'attacco richiede almeno 12 byte di testo in chiaro noto. Almeno 8 di essi devono essere contigui. Maggiore è il testo in chiaro contiguo noto, più veloce sarà l'attacco.
Avendo un archivio zip encrypted.zip con la voce cipher come testo cifrato e plain.zip con la voce plain come testo in chiaro noto, bkcrack può essere eseguito così:
bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain
Avendo un file cipherfile con il testo cifrato (che inizia con i 12 byte corrispondenti all'intestazione di crittografia) e plainfile con il testo in chiaro noto, bkcrack può essere eseguito così:
bkcrack -c cipherfile -p plainfile
Se il testo in chiaro corrisponde a una parte diversa dall'inizio del testo cifrato, puoi specificare un offset. Può essere negativo se il testo in chiaro include una parte dell'intestazione di crittografia.
bkcrack -c cipherfile -p plainfile -o offset
Se conosci poco testo in chiaro contiguo (tra 8 e 11 byte), ma conosci alcuni byte ad altri offset noti, puoi fornire queste informazioni per raggiungere il requisito di un totale di 12 byte noti.
Per fare ciò, usa il flag -x seguito da un offset e byte in esadecimale.
bkcrack -c cipherfile -p plainfile -x 25 4b4f -x 30 21
Se l'attacco ha successo, i dati decifrati associati al testo cifrato usato per l'attacco possono essere salvati:
bkcrack -c cipherfile -p plainfile -d decipheredfile
Se le chiavi sono note da un attacco precedente, è possibile usare bkcrack per decifrare i dati:
bkcrack -c cipherfile -k 12345678 23456789 34567890 -d decipheredfile
I dati decifrati potrebbero essere compressi a seconda che la compressione sia stata usata o meno quando il file zip è stato creato.
Se è stata usata la compressione deflate, uno script Python 3 fornito nella cartella tools può essere usato per decomprimere i dati.
python3 tools/inflate.py < decipheredfile > decompressedfile
Per ottenere l'accesso a tutte le voci dell'archivio crittografato in un unico passaggio, puoi generare un nuovo archivio con lo stesso contenuto ma senza crittografia. Si presuppone che ogni voce sia stata originariamente crittografata con la stessa password.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -D decrypted.zip
È anche possibile generare un nuovo archivio crittografato con la password che preferisci:
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 -U unlocked.zip new_password
Puoi anche definire la nuova password tramite la sua rappresentazione interna corrispondente.
bkcrack -C encrypted.zip -k 12345678 23456789 34567890 --change-keys unlocked.zip 581da44e 8e40167f 50c009a0
Questi due comandi possono essere usati insieme per modificare i contenuti di un archivio crittografato senza conoscere la password ma conoscendo solo le chiavi interne: puoi fare una copia crittografata con la password che scegli, poi modificare la copia con un gestore di archivi inserendo la password scelta quando richiesto, e infine fare una copia dell'archivio modificato di nuovo con le chiavi di crittografia originali.
Date le chiavi interne, bkcrack può provare a trovare la password originale.
Puoi cercare una password usando caratteri in un determinato set di caratteri:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p
Puoi limitare la ricerca a password di una data lunghezza o a un intervallo di lunghezze:
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 9
bkcrack -k 1ded830c 24454157 7213b8c5 -b ?p -l 8..10
L'opzione -r <length> <charset> è una scorciatoia per -l 0..<length> -b <charset>:
bkcrack -k 1ded830c 24454157 7213b8c5 -r 10 ?p
Se hai qualche conoscenza su come è formata la password, puoi specificare una maschera per restringere lo spazio di ricerca e rendere il recupero molto più veloce. Questo è rilevante per password lunghe (come quelle con 12 o più caratteri) per le quali il brute force diventa molto dispendioso in termini di tempo.
Ad esempio, supponendo di ricordare vagamente che la tua password è composta da 8 lettere minuscole, un trattino e 6 cifre decimali, puoi usare questo comando:
bkcrack -k 1940e266 d3fd3d89 71ce9871 -m ?l?l?l?l?l?l?l?l-?d?d?d?d?d?d
Questo viene eseguito in millisecondi, mentre l'alternativa del brute force richiede ore.
Lo spazio di ricerca sia per il brute force che per il recupero basato su maschera è definito con set di caratteri. Un set di caratteri è una sequenza di caratteri o scorciatoie per set di caratteri esistenti. I set di caratteri predefiniti sono elencati di seguito.
Oltre ai set di caratteri predefiniti, puoi definire set di caratteri personalizzati con l'opzione -s.
I set di caratteri personalizzati possono fare riferimento a set predefiniti o ad altri set personalizzati.
I set di caratteri personalizzati sono particolarmente utili per la specifica precisa dello spazio di ricerca del recupero basato su maschera.
Ad esempio, se sai che la tua password è composta da 10 lettere (maiuscole o minuscole) e 5 cifre binarie, puoi usare questo comando:
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
Un tutorial è fornito nella cartella example.
Per ulteriori informazioni, dai un'occhiata alla documentazione e leggi il codice sorgente.
Non esitare a suggerire miglioramenti o inviare pull request su GitHub.
Se desideri mostrare il tuo supporto al progetto, sei il benvenuto a fare una donazione o sponsorizzare il progetto tramite GitHub Sponsors.
Questo progetto è fornito secondo i termini della licenza zlib/png.
| Scorciatoia | Descrizione | Valore |
|---|
?l | lettere minuscole | abcdefghijklmnopqrstuvwxyz |
?u | lettere maiuscole | ABCDEFGHIJKLMNOPQRSTUVWXYZ |
?d | cifre decimali | 0123456789 |
?s | caratteri speciali | !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ |
?a | caratteri alfanumerici | come ?l?u?d |
?p | caratteri ASCII stampabili | come ?l?u?d?s |
?b | tutti i byte | 0x00 .. 0xff |