Artigo original: How to Crack Passwords

Uma observação breve – este artigo é sobre a teoria de como quebrar senhas. Entender como os criminosos cibernéticos executam ataques é extremamente importante para entender como proteger sistemas contra esses tipos de ataques.

A tentativa de invadir um sistema que você não possui é provavelmente ilegal em sua jurisdição (além disso, invadir seus próprios sistemas pode violar – e, muitas vezes, viola – qualquer garantia para aquele produto).

Vamos começar com o básico. O que é um ataque de força bruta?

Este tipo de ataque envolve tentativas repetidas de entrar como usuário, tentando cada combinação possível de letras, números e caracteres (usando ferramentas automatizadas).

Isto pode ser feito tanto on-line (assim, em tempo real, tentando continuamente diferentes combinações de nome de usuário/senha em contas como redes sociais ou sites bancários) ou off-line (por exemplo, se você obteve um conjunto de senhas hashed e está tentando decifrá-las off-line).

A abordagem off-line nem sempre é possível (pode ser difícil obter um conjunto de senhas hashed), mas é muito menos barulhento. Isto porque uma equipe de segurança provavelmente notará o excesso de tentativas de acesso fracassadas na mesma conta, mas, se você conseguir quebrar a senha off-line, não terá um registro de tentativas de acesso fracassadas.

Isto é relativamente fácil com uma senha curta. Torna-se exponencialmente mais difícil com uma senha mais longa, devido ao grande número de possibilidades.

Por exemplo, se você souber que alguém está usando uma senha de 5 caracteres, composta apenas de letras minúsculas, o número total de senhas possíveis é 26^5 (26 possíveis escolhas para a primeira letra, 26 possíveis escolhas para a segunda letra etc.) ou 11.881.376 combinações possíveis.

Porém, se alguém estiver usando uma senha de 11 caracteres, apenas de letras minúsculas, o número total de senhas possíveis é 26 ^11, ou 3.670.344.486.987.776 de possíveis senhas.

Quando você adiciona letras maiúsculas, caracteres especiais e números, isto se torna ainda mais difícil e consome muito mais tempo para descobrir. Quanto mais senhas possíveis houver, mais difícil é para alguém conseguir entrar com sucesso com um ataque de força bruta.

Como se proteger

Este tipo de ataque pode ser evitado de duas maneiras diferentes. Primeiro, você pode usar senhas suficientemente longas e complexas (pelo menos 15 caracteres). Você também pode usar senhas únicas para cada conta (use um gerenciador de senhas!) para reduzir o perigo de violação de dados.

Uma equipe de segurança pode bloquear uma conta após um certo número de tentativas de acesso fracassadas. Eles também podem forçar um método secundário de verificação, como o Captcha, ou usar autenticação em 2 fatores (2FA), que requer um segundo código (por SMS ou e-mail, com base em aplicativos ou chaves de hardware).

Aqui está um artigo (em inglês) sobre como executar um ataque com força bruta.

Como você pode decifrar senhas mais rapidamente?

Um ataque de dicionário envolve a tentativa de entrar repetidamente, tentando várias combinações incluídas em um "dicionário" predefinido, ou lista de combinações.

Isto geralmente é mais rápido que um ataque de força bruta porque as combinações de letras e números já foram computadorizadas, economizando tempo e poder de processamento.

Porém, se a senha for suficientemente complexa (por exemplo, 1098324ukjbfnsdfsnej) e não aparecer no "dicionário" (a lista predefinida de combinações com as quais você está trabalhando), o ataque não vai funcionar.

É frequentemente bem-sucedido porque, muitas vezes, quando as pessoas escolhem senhas, elas escolhem palavras comuns ou variações dessas palavras (por exemplo, "password" ou "p@SSword").

Um hacker também pode usar este tipo de ataque quando sabe ou adivinha uma parte da senha (por exemplo, o nome de um cão, os aniversários de crianças, ou um aniversário - informações que um hacker pode encontrar em páginas de redes sociais ou outros recursos de código aberto).

Medidas de proteção similares às descritas acima contra ataques por força bruta podem impedir que estes tipos de ataques sejam bem sucedidos.

O que você pode fazer se já tiver uma lista de senhas hashed?

As senhas são armazenadas no arquivo /etc/shadow para Linux e C:\Windows\System32\config para Windows (que não estão disponíveis enquanto o sistema operacional é inicializado).

Se você conseguiu obter este arquivo, ou se obteve um hash de senha de uma maneira diferente, com sniffing do tráfego da rede, pode tentar quebrar a senha "off-line".

Enquanto os ataques acima requerem tentativas repetidas de acesso, se você tiver uma lista de senhas hashed, pode tentar quebrá-las em sua máquina, sem desencadear alertas gerados por repetidas tentativas de acesso fracassadas. Então, você só tentará fazer o acesso uma vez, depois de ter quebrado a senha com sucesso (e, portanto, não haverá nenhuma tentativa de acesso fracassada).

Você pode usar ataques de força bruta ou ataques de dicionário contra os arquivos de hash, podendo ter sucesso dependendo da força do hash.

Espere aí – o que é hashing?

35D4FFEF6EF231D998C6046764BB935D

Reconhece essa mensagem? Ela diz: "Hi my name is megan"

7DBDA24A2D10DAF98F23B95CFAF1D3AB

Este é o primeiro parágrafo deste artigo. Sim, parece um absurdo, mas na verdade é um hash.

Uma função hash permite que um computador insira uma string (alguma combinação de letras, números e símbolos), pegue essa string, misture-a e produza uma string de comprimento fixo. É por isso que ambas as strings acima são do mesmo tamanho, mesmo que as entradas das strings fossem de tamanhos muito diferentes.

Os hashes podem ser criados a partir de praticamente qualquer conteúdo digital. Basicamente, todo o conteúdo digital pode ser reduzido a binário, ou a uma série de 0s e 1s. Portanto, todo o conteúdo digital (imagens, documentos etc.) pode ser transformado em hashes.

Há muitas funções de hashing diferentes, algumas mais seguras do que outras. Os hashes acima foram gerados em MD5 (MD significa "Message Digest"). Diferentes funções também diferem no tamanho do hash que produzem.

O mesmo conteúdo na mesma função de hash produzirá sempre o mesmo hash. Entretanto, mesmo uma pequena mudança alterará completamente o hash. Por exemplo, o hash:

2FF5E24F6735B7564CAE7020B41C80F1

É o hash para "Hi my name is Megan". Colocar o M em Megan em letra maiúscula mudou completamente o hash acima.

Os hashes também são funções unidirecionais (o que significa que não podem ser revertidos). Isto significa que os hashes (únicos e unidirecionais) podem ser usados como um tipo de impressão digital para o conteúdo.

Qual o exemplo de como os hashes são usados?

Hashes podem ser usados como verificação de que uma mensagem que não tenha sido alterada.

Quando você envia um e-mail, por exemplo, você poderá fazer um hash de todo o e-mail e enviá-lo. Então, o destinatário pode executar a mensagem recebida através da mesma função de hash para verificar se a mensagem foi alterada durante o envio. Se os dois hashes corresponderem, a mensagem não foi alterada. Se não corresponderem, a mensagem foi alterada.

Além disso, as senhas geralmente são utilizadas em hash quando são armazenadas. Quando um usuário digita sua senha, o computador calcula o valor do hash e o compara com o valor do hash armazenado. Desse modo, o computador não armazena as senhas em texto claro (assim, alguns hackers bisbilhoteiros não podem roubá-las).

Se alguém é capaz de roubar o arquivo de senha, os dados são inúteis porque a função não pode ser revertida (embora existam maneiras, como tabelas arco-íris, de descobrir que o texto simples cria um hash conhecido).

Qual é o problema dos hashes?

Se um hash pode obter dados de qualquer comprimento ou conteúdo, há possibilidades ilimitadas de dados que podem ser tratados com hash.

Como um hash converte o texto em um conteúdo de comprimento fixo (por exemplo, 32 caracteres), há um número finito de combinações de um hash. Trata-se de um número muito grande de possibilidades, mas não infinito.

Eventualmente, dois conjuntos diferentes de dados produzirão o mesmo valor de hash. Isto é chamado de colisão.

Se você tiver um hash e estiver tentando passar por cada um dos valores possíveis de texto sem formatação para encontrar o texto sem formatação que corresponda ao seu hash, será um processo muito longo, muito difícil.

É possível que você não se importe que dois hashes colidam

Isto é chamado de "paradoxo do aniversário" em matemática. Em uma turma de 23 alunos, a probabilidade de alguém ter um aniversário em um dia específico é de cerca de 7%, mas a probabilidade de duas pessoas compartilharem o mesmo aniversário é de cerca de 50%.

O mesmo tipo de análise pode ser aplicado às funções de hash para encontrar quaisquer dois hashes que combinem (ao invés de um hash específico que combine com o outro).

Para evitar isto, você pode usar funções de hash mais longas, como a SHA3, onde a possibilidade de colisões é menor.

Você pode tentar gerar suas próprias funções de hash para SHA3 aqui e para MD5 aqui.

Você pode tentar fazer hashes de força bruta, mas isso leva muito tempo. A maneira mais rápida de se fazer isso é usando tabelas arco-íris (texto em inglês) – elas são semelhantes a ataques de dicionário.

Parece realmente fácil de ser invadido. Devo ficar preocupado?

O mais importante a lembrar sobre o hacking é que ninguém quer fazer mais trabalho do que aquilo que tem que fazer. Por exemplo, os hashes de força bruta podem ser extremamente demorados e difíceis. Se houver uma maneira mais fácil de obter sua senha, provavelmente é isso que uma pessoa mal-intencionada tentará primeiro.

Isso significa que possibilitar as melhores práticas básicas de segurança cibernética é provavelmente a maneira mais fácil de evitar ser invadido. De fato, a Microsoft relatou recentemente (texto em inglês) que apenas habilitar o 2FA acabará bloqueando 99,9% dos ataques automatizados.

Screen-Shot-2019-08-27-at-1.18.47-PM
https://xkcd.com/538/

Leitura adicional (em inglês):

10 most popular password cracking tools