Otimizando Wordlists para Pentests
Tags: security, pentest, hacking, go
Published: 2024-03-02 20:48:12

Olá, espero que este artigo encontre você e seus familiares todos bem e cheios de saúde 🙂.
Hoje vamos falar sobre ataques de força bruta e como otimizar as wordlists utilizadas para conseguir ser mais assertivo em seus testes.
Sem mais delongas, bora lá 💯.


### Responsabilidade
 Antes de mais nada quero deixar bem claro que fiz esta ferramenta pensando em auxiliar pentesters e pessoas que queiram realizar estes testes em seus próprios sistemas.
O que você fizer com ela é responsabilidade única e exclusivamente sua, ok?

### O que é um ataque de força bruta (Brute Force Attack)

Primeiro vamos começar definindo o que é um ataque do tipo brute force e em quais casos ele geralmente é utilizado.

Um ataque de força bruta é um método de tentativa e erro usado para descobrir uma senha o chave criptográfica ao testar todas as combinações possíveis em rápida sucessão. Geralmente, esse tipo de ataque é automatizado através de programas ou scripts que tentam todas as combinações de caracteres, números e símbolos em uma sequência exaustiva até que a senha correta seja encontrada.

Os ataques de força bruta são comumente usados em situações em que um invasor deseja obter acesso não autorizado a sistemas protegidos por autenticação baseada em senha. Alguns casos típicos de uso incluem:

**Quebra de senha**: Tentar descobrir a senha de uma conta de usuário ou administrador em sistemas online, como redes sociais, e-mails, bancos de dados, entre outros.
**Quebra de criptografia:** Tentar quebrar chaves criptográficas ao decifrar mensagens ou arquivos criptografados.
Descoberta de chaves de segurança: Tentar encontrar a chave de segurança de uma rede sem fio protegida por criptografia WEP, WPA ou WPA2.
**Acesso não autorizado a sistemas**: Tentar ganhar acesso não autorizado a sistemas, servidores ou dispositivos protegidos por senha, como roteadores, firewalls, etc.

Em resumo, ataques de força bruta são uma técnica de invasão que explora a vulnerabilidade de senhas fracas ou algoritmos de criptografia ineficientes, visando obter acesso não autorizado a sistemas e informações sensíveis.

## Wordlists e sua importância neste tipo de ataque

As wordlists desempenham um papel crucial nos ataques de força bruta, fornecendo uma lista predefinida de palavras ou combinações de caracteres que são usadas como tentativas durante o processo de tentativa e erro para descobrir uma senha ou chave.

Essas listas podem conter uma ampla variedade de informações, incluindo:

**Palavras comuns**: Palavras frequentemente usadas em senhas, como "password", "123456", "qwerty", entre outras.
Dicionários de idiomas: Palavras de dicionários de diferentes idiomas são frequentemente incluídas, pois muitas pessoas usam palavras do seu próprio idioma como senha.
**Combinações de caracteres**: Sequências de caracteres como números, letras maiúsculas e minúsculas, símbolos, e suas combinações.
**Padrões**: Sequências de caracteres que seguem padrões comuns, como datas de nascimento, nomes próprios, palavras seguidas de números, entre outros.
Ao usar uma wordlist durante um ataque de força bruta, o processo de tentativa e erro é agilizado, pois o atacante não precisa gerar as combinações de caracteres manualmente, aumentando as chances de sucesso.

## O lado ruim...
Bom como sabemos bem, tudo na vida tem um preço 😅.
Neste caso o lado ruim desse tipo de ataque é o tempo!! Existem vários tipos de wordlists por ai e seus tamanhos variam de algumas linhas a milhões de registros. Dependendo do poder de processamento do seu alvo, no caso de um teste de brute force contra algum serviço, ou do poder de processamento de seu computador no caso de ser um brute force local, a conclusão desse teste pode durar horas ou até mesmo dias!! O que por mais que você tenha tempo disponível para isso é meio complicado esperar horas para descobrir que a senha que você procura não está naquela wordlist.  Se por um lado wordlists maiores aumentam a chance de sucesso, por outro elas aumentam também o tempo de execução do teste, e isso algo que definitivamente não queremos.
Então o que podemos fazer ? Bom aí vem uma coisa chamada **OsInt** 🙂 

## Osint

OSINT (Open Source Intelligence),ou inteligência de fontes abertas, refere-se à prática de coletar e analisar informações de fontes disponíveis ao público para obter insights e conhecimentos úteis. Essas fontes podem incluir redes sociais, sites da internet, fóruns online, notícias, registros públicos, e qualquer outra informação acessível ao público em geral, sem a necessidade de técnicas de invasão ou acesso não autorizado.
Ou seja, significa tentar descobrir características que podem ser utilizadas para inferir informações acerca da senha ou dado que você busca. Trazendo isso para um contexto de pentest, imagine que você deseja testar a segurança de um site x, e você vai tentar fazer um brute force para ver como está a segurança das senhas dos usuários.

Se você pegar uma wordlist genérica de 5 milhões de senhas, você pode acabar demorando demais e consumindo muito recurso de processamento para, no fim, não achar nenhuma senha que batesse para determinado login. Porém, você, como um bom pentester, resolveu ir lá no site e dar uma olhadinha para ver se conseguia descobrir algo sobre a senha daquele site. Você tenta criar uma conta e quando é questionado sobre a senha, insere uma senha qualquer e boom! O site te retorna uma mensagem dizendo que as senhas que ele aceita possuem um formato específico, geralmente algo parecido com isso:

![password rules](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bvpt08neyghx0jgat2r4.png)

Ou seja, sobre esse site x, agora você sabe que não adianta testar senhas como 123, ou teste1234 pois as senhas precisam ter, pelo menos, letras minúsculas, maiúsculas entre outras combinações. 
Com isso você sabe que de alguma maneira precisa limpar a wordlist que vai ser utilizada senão tudo que vai conseguir é perder tempo. E como podemos fazer isso ? 🤔 
Aí vem a uma ferramenta bem bacana, e simples, que fiz pensando nessa situação 🙂.

## Wordlist Optimizer
Pensando nessa situação resolvi aproveitar que estou iniciando meus estudos em Go, que é uma linguagem compilada e por isso gera programas que possuem excelente performance, e criei uma ferramenta bem simples para ajudar nessa tarefa.
Basicamente o wordlist optimizer é uma cli ( programa de linha de comando) que filtra dados de uma worldlist baseado em um filtro que você monta passando algumas flags como por exemplo, -l para letras minúsculas , -c para lestras maiúsculas, entre outras opções. A documentação completa você encontra no repositório da ferramenta no github [WorlistOptimizer](https://github.com/R9n/wordlist-optimizer).
Com ela você pode criar filtros para selecionar apenas linhas que atendam, minimamente, ao que você quer. 
No exemplo a seguir eu filtrei a wordlist teste.txt para recuperar apenas as linhas que tivessem letras maiúsculas, números e tamanho mínimo de 5 caracteres. Senhas como teste123, teste3444 ficariam de fora desse filtro e não seriam gravadas no arquivo de saída teste-optimized.txt.
Essa será nossa wordlist **teste.txt**

![teste.txt wordlist](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jclayuweixiiikwn46h0.png)

Ao terminar de executar a ferramenta exibe as estatísticas do processamento dos dados

![test wordlist result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gz048ltm06lbi4ej8478.png)

Esse é o arquivo gerado com todas dos dados que deram match( minimamente) com o filtro passado.


![optimized result set](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/98hbiifmf0q0af5lrj6r.png)

E esse é o arquivo gerado como complemento do arquivo de match, ou seja, são todos os dados que não deram match.
É importante ter esse arquivo pois quando estamos fazendo pentest real, o as wordlists podem ser muito grandes, na casa de milhões e milhões e as vezes até mais, então é importante ir segmentando seu teste para caso você mude de estratégia já ter esses dados filtrados.

![removed set result](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vzgjwnum0qj48iiv411e.png)

Como vocês podem ver, no arquivo **removed-teste.txt** estão as senhas que não deram match no filtro.
Com essa simples ação você pode tornar seu teste muito mais efetivo, reduzindo o tamanho da sua wordlist e economizando processamento de seu alvo de testes 😃.

E uma última dica é, sempre que for realizar um pentest e precisar utilizar utilizar um brute force, tome cuidado para não sobrecarregar o sistema de seu cliente, pois como ataques de forças bruta operam através de tentativa e erro, é normal que ele erre muito (mas muuuuuuito) antes de acertar, não é atoa que as wordlists possuem facilmente milhões e milhões de dados. Se conduzido de forma errada o seu teste pode ser mais prejudicial do que um ataque legítimo 😅. 

Além disso, deixo aqui uma sugestão para os programadores e arquitetos de software: sempre considerem a implementação de um RATE LIMIT em suas aplicações. Em um cenário de ataque mal-intencionado, é esse rate limit que cuidará para que sua aplicação não seja comprometida. Embora não exista uma solução única em segurança e haja métodos para burlar o rate limit, ter um rate limit configurado em sua aplicação ou WAF ([Web Application Firewal](https://www.cloudflare.com/pt-br/learning/ddos/glossary/web-application-firewall-waf/))  é uma prática recomendada.

Bom por hoje é isso, espero que essa dica e essa ferramenta possam tornar seus testes mais efetivos 🚀. Segue aí para mais dicas 🙂. 

Fiquem bem, estudem bastante e descansem a cuca também porque a vida é para ser aproveitada 💯.

Obrigado por chegar até aqui e até a próxima 🚀

## Referências
[OsInt (Owasp)](https://owasp.org/www-chapter-ghana/assets/slides/OWASP_OSINT_Presentation.pdf)

[BruteForce (owasp)](https://owasp.org/www-community/attacks/Brute_force_attack)

[Exemplos de wordlists (github)](https://github.com/topics/bruteforce-wordlist)

[Web Application Firewall (cloudflare)](https://www.cloudflare.com/pt-br/learning/ddos/glossary/web-application-firewall-waf/)