
Mais um prego no caixão do JKS - Quebrando senhas de entradas de chave privada em um arquivo JKS
O Java Key Store (JKS) é a forma Java de armazenar uma ou várias chaves privadas e públicas criptográficas para criptografia assimétrica em um arquivo. Embora existam vários formatos de key store, Java e Android ainda usam como padrão o formato de arquivo JKS. JKS é um dos formatos de arquivo para key stores Java, mas JKS é usado de forma confusa como acrônimo para a API geral de key store Java também. Este projeto inclui informações sobre os mecanismos de segurança do formato de arquivo JKS e como a proteção por senha da chave privada pode ser quebrada. Devido ao design incomum do JKS, a implementação desenvolvida pode ignorar a senha do key store e quebrar diretamente a senha da chave privada. Por ignorar a senha do key store, esta implementação pode atacar toda configuração JKS, o que não é o caso da maioria das outras ferramentas. Ao explorar uma fraqueza do esquema de Criptografia Baseada em Senha (Password Based Encryption) para a chave privada no JKS, as senhas podem ser quebradas de forma muito eficiente. Até agora, nenhuma ferramenta pública estava disponível explorando esta fraqueza. Esta técnica foi implementada no hashcat para amplificar a eficiência do algoritmo com velocidades de cracking mais altas em GPUs.
Para obter a parte teórica, consulte o artigo POC||GTFO "15:12 Nail in the Java Key Store Coffin" no número 0x15 incluído neste repositório (pocorgtfo15.pdf) ou disponível em vários espelhos como este lindo: https://unpack.debug.su/pocorgtfo/
Antes que você pergunte: JCEKS ou BKS ou qualquer outro formato de Key Store não é suportado (ainda).
A resposta é construir seu próprio hardware de cracking para isso ;) . Mas vamos ser um pouco mais práticos, então a resposta é usar sua GPU:``` : _____________ : v3.6.0 ____________ _\ |_ /___ \ |____ _ / ______ | _ | __ \ / _ | /_ __ |/ | | | \ ___ / | | \ / \ | | || |__/ / /| |/: | |_:-aTZ!/_/ |: /__:
Tudo o que você precisa fazer é executar o seguinte comando:```
java -jar JksPrivkPrepare.jar your_JKS_file.jks > hash.txt
Se o seu hash.txt ficar vazio, significa que não há chave privada no arquivo JKS ou você especificou um arquivo que não é JKS.
Em seguida, alimente o arquivo hash.txt para o hashcat (versão 3.6.0 ou superior, mas se quiser ficar seguro e também garantir que pode quebrar senhas muito longas, use pelo menos a versão 4 do hashcat!), por exemplo assim:
hashcat -m 15500 -a 3 --potfile-disable ?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l?l hash.txt
$ ./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
So from this repository you basically only need the JksPrivkPrepare.jar to run a cracking session.
## Do formato John The Ripper para o formato hashcat