Melhoria # 1 - Loops
Sua estrutura de loop parece completamente desnecessária se você usar expansões de chaves, pode ser condensado da seguinte forma:
$ more pass.bash
#!/bin/bash
for str in $(echo {a..z}{a..z}{a..z}); do
pass=$(openssl passwd -salt $1 $str)
if [[ "$pass" == "$2" ]]; then
echo "Password: $str"
exit;
fi
done
# vim: set nolist ts=2 :
Estou exibindo 4 caracteres apenas para torná-lo mais rápido, basta adicionar mais chaves {a..z}
para caracteres adicionais para o tamanho da senha.
Exemplo é executado
4 caracteres$ openssl passwd -salt ab hhhh
abBYJnOuV8dUA
$ time ./pass.bash ab abBYJnOuV8dUA
Password: hhhh
real 18m3.304s
user 6m58.204s
sys 9m34.468s
Por isso, completou em 18 minutos.
5 caracteres$ openssl passwd -salt ab ccccc
abZwsITAI6uwM
$ time ./pass.bash ab abZwsITAI6uwM
Password: ccccc
real 426m37.234s
user 16m34.444s
sys 398m20.399s
Isso levou ~ 426 minutos. Eu na verdade Ctrl + C isso, então não tinha terminado, mas eu não queria esperar mais do que isso!
OBSERVAÇÃO: Essas duas execuções estavam nessa CPU:
brand = "Intel(R) Core(TM) i5 CPU M 560 @ 2.67GHz
Melhoria # 2 - Usando bom?
A próxima etapa lógica seria nice
das execuções acima, para que elas consumam mais recursos.
$ nice -n -20 ./pass.bash ab hhhhh
Mas isso só vai te levar tão longe. Uma das "falhas" em sua abordagem é a chamada de openssl
repetidamente. Com {a..z}^5
, você está chamando openssl
26 ^ 5 = 11881376 vezes.
Uma melhoria importante seria gerar os padrões de {a..z}....
e salvá-los em um arquivo e, em seguida, passar isso como um único item para openssl
uma vez. Felizmente, openssl
tem dois recursos principais que podemos explorar para conseguir o que queremos.
Melhoria # 3 - nossa estrutura de chamadas para o openssl
A ferramenta de linha de comando openssl
fornece as opções -stdin
e -table
, que podemos usar aqui para ter uma única chamada de openssl
, independentemente de quantas senhas queremos passar para ela. Esta é uma única modificação que removerá toda a sobrecarga de ter que invocar openssl
, fazer o trabalho e, em seguida, sair dela, em vez disso, manteremos uma única instância aberta indefinidamente, alimentando-a quantas senhas quisermos.
A opção -table
também é crucial, pois informa openssl
para incluir a senha original ao lado da versão das cifras, para que possamos fazer um trabalho bastante rápido de procurar a correspondência.
Veja um exemplo usando apenas três caracteres para mostrar o que estamos mudando:
$ openssl passwd -salt ab abc
abFZSxKKdq5s6
$ printf "%s\n" {a..z}{a..z}{a..z} | \
openssl passwd -stdin -table -crypt -salt ab | grep -m1 abFZSxKKdq5s6
abc abFZSxKKdq5s6
Agora, podemos realmente reformular nosso script pass.bash
original da seguinte forma:
$ cat pass2.bash
#!/bin/bash
pass=$(printf "%s\n" {a..z}{a..z}{a..z}{a..z}{a..z} | \
openssl passwd -stdin -table -crypt -salt $1 | grep -m1 $2)
if [[ "$pass" =~ "$2" ]]; then
echo "Password: $pass"
fi
# vim: set nolist ts=2 :
Agora, quando executamos:
$ time ./pass2.bash ab aboznNh9QV/Q2
Password: hhhhh aboznNh9QV/Q2
real 1m11.194s
user 1m13.515s
sys 0m7.786s
Esta é uma melhoria massiva! Essa mesma pesquisa que estava demorando mais de 426 minutos agora é feita em ~ 1 minuto! Se pesquisarmos para dizer "nnnnn", mais ou menos no meio do espaço do conjunto de caracteres {a..z}^5
. {a..n}
tem 14 caracteres e estamos usando 5 deles.
$ echo "14^5" | bc
537824
$ openssl passwd -salt ab nnnnn
abRRCp5N3WN32
$ time ./pass2.bash ab abRRCp5N3WN32
Password: nnnnn abRRCp5N3WN32
real 1m10.865s
user 1m12.842s
sys 0m8.530s
Esta pesquisa demorou ~ 1,1 minutos. OBSERVAÇÃO: Podemos pesquisar o espaço inteiro de senhas de 5 caracteres em ~ 1 minuto também.
$ time ./pass2.bash ab abBQdT5EcUvYA
Password: zzzzz abBQdT5EcUvYA
real 1m10.783s
user 1m13.556s
sys 0m8.251s
Conclusões
Então, com uma reestruturação, estamos correndo muito mais rápido. Essa abordagem também é muito melhor à medida que adicionamos um caractere 6º, 7º etc. à duração total da senha.
Esteja avisado que estamos usando um pequeno conjunto de caracteres, principalmente apenas os caracteres alfabéticos minúsculos. Se você misturar todo o número, os dois casos e os caracteres especiais, normalmente poderá obter ~ 96 caracteres por posição. Isso pode não parecer grande coisa, mas isso aumenta tremendamente seu pool:
$ echo 26^5 | bc
11881376
$ echo 96^5 | bc
8153726976
Adicionando todos esses caracteres aumentou em 2 ordens de magnitude nosso espaço de busca. Se chegarmos a 10-12 caracteres de comprimento para a senha, isso realmente coloca uma metodologia de hacking de força bruta fora de alcance.
Usar um NONCE de sal e outro adicional em toda a construção de uma senha com hash pode adicionar ainda mais obstáculos.
O que mais?
Você mencionou o uso de John (John the Ripper) ou de outras ferramentas inovadoras. Provavelmente, o estado da arte atualmente seria HashCat .
Onde o John é uma versão mais enxuta da abordagem que você está tentando usar, o HashCat leva isso para outro nível ao incluir o uso de GPUs (até 128) para realmente fazer suas tentativas de hackers voar.
Você pode até usar o CloudCrack , que é uma versão hospedada, e por apenas US $ 17 você pode pagar para ter um tentativa de quebra de senha.