Rainbow Crack e Rainbow Tables
Autor: Perícia Forense Computacional do Piauí | Publicado: 2011-06-30T09:09:00-07:00

RainbowCrack é um programa que gera rainbow tables para serem usadas  na quebra de senhas. O RainbowCrack difere dos programas de força bruta  convencionais, pois utiliza tabelas previamente criadas, chamadas  rainbow tables, para reduzir drasticamente o tempo necessário para  quebrar senhas. Um ótimo programa para utilizarmos para quebrar senhas Windows com rainbow tables é o Ophcrack#aptitude install ophcrackOutro programa, que quebra inclusive hashs MD5, SHA1, SHA2 e etc, é o Cain (que roda em Windows).   Para baixar Rainbow Tables:  http://rainbowtables.shmoo.com/     Para entender mais:  http://www.ethicalhacker.net/content/view/94/24/RainbowCrack é uma ferramenta cujo objetivo é quebrar hash de senhas.   O método utilizado pela ferramenta é o brute force. Nesse método,  todas as senhas em texto plano e seus hashs correspondentes são  computados um por um. O hash computado é comparado com o hash alvo. Se  um deles for igual, a senha em texto plano é encontrada. Do contrário, o  processo continua até finalizar todas as senhas possíveis. No  método time-memory, a tarefa de computar hashs é feita através do  armazenamento dos resultados no que chamamos de "rainbow table". Depois  disso, os hashes podem ser acessados a partir das rainbow tables sempre  que necessário. O processo pré-computacional precisa de muito tempo para  criar as chaves que serão posteriormente utilizadas. No entanto, uma  vez que esse processo tenha terminado, a performance da rainbow tables  pode ser de centenas a milhares de vezes maior do que o método de brute  force.  Vamos ver passo a passo como utilizar o software  RainbowCrack. Esse software inclui três ferramentas que devem ser usadas  em sequência para fazer a coisa funcionar:   Passo 1: usar o rtgen para gerar as rainbow tables.    Passo 2: usar o rtsort para organizar as rainbow tables geradas pelo rtgen.     Passo 3: usar o rcrack para buscar o conteúdo das rainbow tables organizadas pelo rtsort. O  processo de buscar o conteúdo no passo final, é equivalente ao processo  de quebra de hash. E todas essas ferramentas são utilizadas através da  linha de comando.O programa rtgen precisa de diversos parâmetros para gerar uma rainbow table, e a sintaxe do comando é: rtgen hash_algorithm charset plaintext_len_min plaintext_len_max table_index chain_len chain_num part_index Explicação dos parâmetros:  hash_algorithmO algoritmo dos hashs (lm, ntlm, md5 e assim por diante) usado na rainbow table.charset   A configuração dos caracteres (charset) do texto plano na rainbow  tables. Todos os charsets possíveis estão definidos no arquivo  charset.txt.plaintext_len_min  plaintext_len_max   Estes dois parâmetros definem o tamanho possível de todo o texto  plano na rainbow tables. Se o charset é numérico, o plaintext_len_min é  1, e o plaintext_len_max é 5, então a string "12345" será incluída na  tabela, mas "123456" não.table_index  chain_len  chain_num  part_index    Estes quatro parâmetros são mais difíceis de explicar em poucas  palavras. Ler e compreender o artigo original de Philippe Oechslin  (criador do RainbowCrack), pode ajudar a entender o significado exato.  O table_index está relacionado ao "reduce function" que é utilizado na rainbow table.   O chain_len é o tamanho de cada "rainbow chain" na rainbow table. Uma  "rainbow chain" configurada como 16 bytes é a menor unidade em uma  rainbow table. Uma rainbow tables contém diversas rainbow chains.  O chains_num é o número de rainbow chains em uma rainbow table.   O parâmetro part_index determina como o "start point" em cada rainbow  chain é gerado. Deve ser um número (ou começar com um número).Os  valores corretos de todos os parâmetros dependem do que vocês precisa, e  selecionar bons parâmetros requer um bom entendimento do algoritmo de  time-memory tradeoff.  Uma configuração que funciona está logo abaixo, como um exemplo:hash_algorithm  lm, ntlm or md5    charset  alpha-numeric = [ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789] ou  loweralpha-numeric = [abcdefghijklmnopqrstuvwxyz0123456789]    plaintext_len_min  1    plaintext_len_max  7     chain_len  3800    chain_num  33554432    key space  36^1 + 36^2 + 36^3 + 36^4 + 36^5 + 36^6 + 36^7 = 80603140212  Key space é o número de possíveis strings em texto plano para o charset, plaintext_len_min e plaintext_len_max selecionados.    table size   3 GB    success rate   0.999   O algoritmo de time-memory tradeoff é um algoritmos probabilístico.  Qualquer que seja os parâmetros selecionados, há sempre probabilidade de  que as strings dentro do charset selecionado e o tamanho das strings  não seja completamente coberto. A taxa de sucesso é de 99.9% com os  parâmetros usados nesse evento.  comandos para gerar as tabelas Os comandos do rtgen usados para gerar as rainbow tables são:rtgen md5 loweralpha-numeric 1 7 0 3800 33554432 0  rtgen md5 loweralpha-numeric 1 7 1 3800 33554432 0  rtgen md5 loweralpha-numeric 1 7 2 3800 33554432 0  rtgen md5 loweralpha-numeric 1 7 3 3800 33554432 0  rtgen md5 loweralpha-numeric 1 7 4 3800 33554432 0  rtgen md5 loweralpha-numeric 1 7 5 3800 33554432 0 Se precisar criar uma tabela de hashes ntlm ou lm, substitua o "md5" nos comandos acima por "ntlm" ou "lm".   Se precisar de uma tabela com o charset alpha-numeric, substitua o  "loweralpha-numeric" nos comandos acima por "alpha-numeric". Se uma  tabela com hashes lm for criada, tenha certeza de que seu charset seja  alpha-numeric ao invés de loweralpha-numeric. O algoritmo lm nunca  utiliza caracteres minúsculos como strings.Agora é hora de criar uma rainbow table. Altere o diretório corrente em seu terminal de comando para o diretório do RainbowCrack, e execute o comando seguinte:# cd /pentest/passwords/rcrack# rtgen md5 loweralpha-numeric 1 7 0 3800 33554432 0 Esse  comando leva 4 horas para ser completado em um computador com um  processador Core2 Duo E7300. É possível parar a execução do mesmo a  qualquer momento pressionando Ctrl+C. Da próxima vez que o comando for  executado com a mesma linha de comando, ele continuará a partir do ponto  em que foi interrompido para continuar com a geração da tabela. Quando  o comando tiver terminado, um arquivo com o nome de  "md5_loweralpha-numeric#1-7_0_3800x33554432_0.rt" e tamanho de 512 MB  será criado. O nome do mesmo é simplesmente a linha de comando utilizada  com os parâmetros interligados, com a extensão "rt". O programa rcrack  que será explicado mais a frente, precisa dessas informações para saber  quais os parâmetros existentes na rainbow table. Portanto, não renomeie o  arquivo.As demais tabelas podem ser geradas da mesma forma, com os comandos: # rtgen md5 loweralpha-numeric 1 7 1 3800 33554432 0# rtgen md5 loweralpha-numeric 1 7 2 3800 33554432 0# rtgen md5 loweralpha-numeric 1 7 3 3800 33554432 0# rtgen md5 loweralpha-numeric 1 7 4 3800 33554432 0# rtgen md5 loweralpha-numeric 1 7 5 3800 33554432 0 Finalmente, esses arquivos são gerados:md5_loweralpha-numeric#1-7_0_3800x33554432_0.rt     512MBmd5_loweralpha-numeric#1-7_1_3800x33554432_0.rt     512MBmd5_loweralpha-numeric#1-7_2_3800x33554432_0.rt     512MBmd5_loweralpha-numeric#1-7_3_3800x33554432_0.rt     512MBmd5_loweralpha-numeric#1-7_4_3800x33554432_0.rt     512MBmd5_loweralpha-numeric#1-7_5_3800x33554432_0.rt     512MB Agora, o processo de criação da rainbow table está completo.As  rainbow tables geradas pelo programa rtgen precisam de um  pós-processamento para tornar sua consulta mais fácil e rápida. O  programa rtsort é utilizado para organizar todas as rainbow chains em  uma rainbow table.  Utilize os seguintes comandos: # rtsort md5_loweralpha-numeric#1-7_0_3800x33554432_0.rt# rtsort md5_loweralpha-numeric#1-7_1_3800x33554432_0.rt# rtsort md5_loweralpha-numeric#1-7_2_3800x33554432_0.rt# rtsort md5_loweralpha-numeric#1-7_3_3800x33554432_0.rt# rtsort md5_loweralpha-numeric#1-7_4_3800x33554432_0.rt# rtsort md5_loweralpha-numeric#1-7_5_3800x33554432_0.rt Cada  comando acima, leva cerca de 1 a 2 minutos para completarem sua  execução. O programa rtsort gravará a rainbow table organizada por sobre  o arquivo orginal. Não interrompa a execução do comando, do contrário o  arquivo original será danificado. Agora o processo de organização das rainbow tables está completo.O programa rcrack é utilizado para acessar as rainbow tables. Ele aceita apenas rainbow tables organizadas. Assumindo  que as rainbow tables organizadas estejam no mesmo diretório do  programa, para quebrar hashes únicos a linha de comando será:  # rcrack *.rt -h aqui_vai_o_hash_para_ser_quebrado O  primeiro parâmetro especifica o caminho para buscar nos arquivos das  rainbow tables. Os caracteres "*" e "?" podem ser usados para  especificar vários arquivos. Normalmente isso leva algumas dezenas  segundos para finalizar, se a string existir dentro do "range" do  charset e tamanho de strings selecionados. Do contrário, leva-se muito  mais tempo para buscar por todas as tabelas, apenas para não encontrar  nada.  Para quebrar múltiplos hashs, coloque todos os hashs em um  arquivo de texto, com um hash por linha. E então especifique o nome do  arquivo na linha de comando do programa rcrack: # rcrack *.rt -l arquivo_com_lista_de_hashes Se  as rainbow tables que gerou usam o algoritmo lm, o programa rcrack  possui um suporte especial para o parâmetro "-f". Um arquivo de dump de  hash no formato pwdump é necessário como input para o programa rcrack. O  conteúdo do arquivo parecerá com o seguinte: Administrator:500:1c3a2b6d939a1021aad3b435b51404ee:e24106942bf38bcf57a6a4b29016eff6:::Guest:501:a296c9e4267e9ba9aad3b435b51404ee:9d978dda95e5185bbeda9b3ae00f84b4::: O arquivo pwdump é a saída de utilitários tais como pwdump2, pwdump3 ou outros. E contém os hashes tanto lm quant ntlm. Para quebrar hashes lm em arquivos pwdump, use o seguinte comando:  # rcrack *.rt -f arquivo_pwdump O  algoritmo de hash lm converte todas as letras minúsculas em strings  maiúsculas; como resultado disso, todas as strings quebradas através do  hashe lm, nunca contém letras minúscula, enquanto que a string original  poed conter letras minúsculas. O programa rcrack tentará corrigir isso  em hashes ntlm armazenados no mesmo arquivo e exibir a string original.