Introdução
Pelo que vimos no post de como gerar permutações, podemos criar facilmente um programa que permuta caracteres a fim de gerar senhas que podem ser usadas em ataques brute force[1]. Sabendo disso criei um shell script para essa finalidade.
O Conceito
O algoritmo utilizado pelo script pode ser visto aqui:
https://daemoniolabs.wordpress.com/2011/02/11/gerando-permutacoes-r-com-repeticao-em-c/
O Código
#!/bin/bash # Autor: Daemonio (Marcos Paulo Ferreira) # Contato: undefinido gmail com # daemoniolabs.wordpress.com # # [brutus.sh] # Script que permuta caracteres. Esse # script pode ser usado como um passo # inicial de um ataque brute force. # # Wed Jul 27 22:14:52 BRT 2011 # # Vetor que representa o numero na # base R. VETORNUM= # O R padrao eh 5 mas esse valor pode # ser mudado pela opcao -r. R=5 # Contera o alfabeto utilizado # para gerar as permutacoes. ALFABETO= # Alfabetos padroes. A1='abcdefghijklmnopqrstuvwxyz' A2='ABCDEFGHIJKLMNOPQRSTUVWXYZ' A3='0123456789' function helpme { echo 'brutus.sh : by Daemonio' echo echo '[uso] ./brutus.sh [opcoes]' echo 'As opcoes sao:' echo '-h Essa ajuda.' echo '-a Alfabeto: [a-z].' echo '-A Alfabeto: [A-Z].' echo '-d Alfabeto: [0-9].' echo '-c <alfabeto> Alfabeto customizado.' echo '-r <length> Tamanho da saida (padrao: '$R').' exit 1 } # Comando sem opcoes. [ "$1" ] || helpme # Tratando as opcoes da # linha de comando. while getopts 'haAdc:r:' OPT do case $OPT in "h") helpme; exit ;; "a") ALFABETO=${ALFABETO}${A1} ;; "A") ALFABETO=${ALFABETO}${A2} ;; "d") ALFABETO=${ALFABETO}${A3} ;; "c") ALFABETO=${ALFABETO}${OPTARG} ;; "r") R=${OPTARG} ;; "?") echo 'Opcao invalida ou faltando argumento: '$OPT; echo 'Digite '$0' -h para mais ajuda.' ; exit 1 ;; esac done # Sai se nao foi fornecido nenhum # alfabeto. [ -z "$ALFABETO" ] && echo 'Sem alfabeto.' && exit 1 # N eh o tamanho de elementos # do alfabeto. N=${#ALFABETO} while [ -z ${VETORNUM[R]} ] do # O loop abaixo gera uma permutacao # e a grava na variavel SAIDA. SAIDA= for (( i=0; i < R; i++ )) do index=${VETORNUM[i]} SAIDA=${ALFABETO:index:1}${SAIDA} done # Mostra a saida. echo $SAIDA # Incrementa a primeira posicao. let VETORNUM[0]++ # Trata as carrys. for (( i=0; i < R; i++ )) do if [ "${VETORNUM[i]}" = "$N" ] then VETORNUM[i]=0 ; let VETORNUM[i+1]++ ; fi done done
Salve o código como brutus.sh.
Como utilizar
Digite o nome do script para obter ajuda. As opções do script são mostradas abaixo:
-A : O alfabeto do script é todos os caracteres minúsculos.
$ ./brutus.sh -a -r 3 | head -n 10 aaa aab aac aad aae aaf aag aah aai aaj
OBS: A opção -r indica qual será o tamanho da senha (se nada é indicado, o padrão é 5).
-A : O alfabeto do script é todos os caracteres maiúsculos.
$ ./brutus.sh -A -r 12 | head -n 10 AAAAAAAAAAAA AAAAAAAAAAAB AAAAAAAAAAAC AAAAAAAAAAAD AAAAAAAAAAAE AAAAAAAAAAAF AAAAAAAAAAAG AAAAAAAAAAAH AAAAAAAAAAAI AAAAAAAAAAAJ
-d : O alfabeto do script é todos os dígitos.
$ ./brutus.sh -d -r 7 | head -n 10 0000000 0000001 0000002 0000003 0000004 0000005 0000006 0000007 0000008 0000009
-c : Permite um alfabeto customizado.
$ ./brutus.sh -c '!@#$' | head -n 10 !!!!! !!!!@ !!!!# !!!!$ !!!@! !!!@@ !!!@# !!!@$ !!!#! !!!#@
Exemplos de execução
1) Gerar senhas alfanuméricas de tamanho 8.
$ ./brutus.sh -r 8 -aAd | head -n 10 aaaaaaaa aaaaaaab aaaaaaac aaaaaaad aaaaaaae aaaaaaaf aaaaaaag aaaaaaah
OBS2: O head -n 10 limita a saída para dez linhas, por isso você não vê nenhum caractere maiúsculo e nem dígito, mas eles aparecem na saída completa.
2) Gerar senhas numéricas de tamanho 3.
$ ./brutus.sh -d -r 3 | head -n 10 000 001 002 003 004 005 006 007 008 009
3) Gerar senhas de tamanho 5 usando números e os caracteres xyz.
$ ./brutus.sh -d -c 'xyz' | head -n 10 00000 00001 00002 00003 00004 00005 00006 00007 00008 00009
Observação
A ordem das opções irá alterar a ordem da saída.
Executando “-a -d”, temos:
$ ./brutus.sh -a -d | head -n 10 aaaaa aaaab aaaac aaaad aaaae aaaaf aaaag aaaah aaaai aaaaj
Agora “-d -a”, temos:
$ ./brutus.sh -d -a | head -n 10 00000 00001 00002 00003 00004 00005 00006 00007 00008 00009
Mas no final as saídas geradas serão as mesmas, somente com ordem diferente.
Conclusão
Embora um shell script não seja a maneira mais eficiente de se gerar um dicionário de senhas, o método que vimos para gerar permutações é muito simples e pode ser usado em praticamente toda linguagem de programação.
Referências
[1] Brute-force attack (Acessado em: Julho/2011)
http://en.wikipedia.org/wiki/Brute-force_attack