
Chiodo nella bara JKS - Craccare le password delle voci di chiave privata in un file JKS
Il Java Key Store (JKS) è il modo Java di archiviare una o più chiavi crittografiche private e pubbliche per la crittografia asimmetrica in un file. Sebbene esistano vari formati di key store, Java e Android utilizzano ancora il formato file JKS come predefinito. JKS è uno dei formati di file per i key store Java, ma JKS è usato in modo confuso anche come acronimo per l'API generale dei key store Java. Questo progetto include informazioni sui meccanismi di sicurezza del formato file JKS e su come la protezione tramite password della chiave privata possa essere craccata. A causa dell'insolita progettazione di JKS, l'implementazione sviluppata può ignorare la password del key store e craccare direttamente la password della chiave privata. Poiché ignora la password del key store, questa implementazione può attaccare qualsiasi configurazione JKS, cosa che non accade con la maggior parte degli altri strumenti. Sfruttando una debolezza dello schema di cifratura basata su password per la chiave privata in JKS, le password possono essere craccate molto efficientemente. Fino ad ora, nessuno strumento pubblico sfruttava questa debolezza. Questa tecnica è stata implementata in hashcat per amplificare l'efficienza dell'algoritmo con velocità di cracking più elevate sulle GPU.
Per la parte teorica, si prega di fare riferimento all'articolo POC||GTFO "15:12 Nail in the Java Key Store Coffin" nel numero 0x15 incluso in questo repository (pocorgtfo15.pdf) o disponibile su vari mirror come questo bellissimo: https://unpack.debug.su/pocorgtfo/
Prima che lo chiediate: JCEKS, BKS o qualsiasi altro formato di Key Store non è supportato (ancora).
La risposta è costruire il proprio hardware per il cracking ;) . Ma cerchiamo di essere un po' più pratici, quindi la risposta è usare la tua GPU:``` : _____________ : v3.6.0 ____________ _\ |_ /___ \ |____ _ / ______ | _ | __ \ / _ | /_ __ |/ | | | \ ___ / | | \ / \ | | || |__/ / /| |/: | |_:-aTZ!/_/ |: /__:
Tutto ciò che devi fare è eseguire il seguente comando:```
java -jar JksPrivkPrepare.jar your_JKS_file.jks > hash.txt
Se il tuo hash.txt risulta vuoto, significa che non c'è una chiave privata nel file JKS o hai specificato un file non JKS.
Quindi fornisci il file hash.txt a hashcat (versione 3.6.0 e successive, ma se vuoi essere sicuro e anche assicurarti di poter decifrare password molto lunghe, usa almeno la versione 4 di hashcat!), ad esempio in questo modo:``` $ ./hashcat -m 15500 -a 3 -1 '?u|' -w 3 hash.txt ?1?1?1?1?1?1?1?1?1 hashcat (v3.6.0) starting...
Hashes: 1 digests; 1 unique digests, 1 unique salts Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Applicable optimizers:
Watchdog: Temperature abort trigger set to 90c Watchdog: Temperature retain trigger set to 75c
$jksprivk$D1BC102EF5FE5F1A7ED6A63431767DD4E1569670...8test:POC||GTFO
Session..........: hashcat Status...........: Cracked Hash.Type........: JKS Java Key Store Private Keys (SHA1) Hash.Target......: $jksprivk$D1BC102EF5FE5F1A7ED6A63431767DD4E1569670...8test Time.Started.....: Tue May 30 17:41:58 2017 (8 mins, 25 secs) Time.Estimated...: Tue May 30 17:50:23 2017 (0 secs) Guess.Mask.......: ?1?1?1?1?1?1?1?1?1 [9] Guess.Charset....: -1 ?u|, -2 Undefined, -3 Undefined, -4 Undefined Guess.Queue......: 1/1 (100.00%) Speed.Dev.#1.....: 7946.6 MH/s (39.48ms) Recovered........: 1/1 (100.00%) Digests, 1/1 (100.00%) Salts Progress.........: 4014116700160/7625597484987 (52.64%) Rejected.........: 0/4014116700160 (0.00%) Restore.Point....: 5505024000/10460353203 (52.63%) Candidates.#1....: NNVGFSRFO -> Z|ZFVDUFO HWMon.Dev.#1.....: Temp: 75c Fan: 89% Util:100% Core:1936MHz Mem:4513MHz Bus:1
Started: Tue May 30 17:41:56 2017 Stopped: Tue May 30 17:50:24 2017
Quindi da questo repository ti serve essenzialmente solo il file JksPrivkPrepare.jar per eseguire una sessione di cracking.
# Dal formato di John The Ripper al formato di hashcat