Shell Script Para Ataques Brute Force

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