oppsec's blog

oppsec's blog

28 Mar 2024

Automatizando o escaneamento por secrets em arquivos JavaScript com ferramentas da ProjectDiscovery - Simple Techniques #1 (🇧🇷)

Introdução

Olá pessoal, espero que todos estejam bem. Me chamo Daniel (mais conhecido como oppsec), sou um pentester em uma empresa brasileira e bug hunter nos meus tempos livres. Gostaria de compartilhar com vocês uma automação que eu faço através das ferramentas da ProjectDiscovery.

Para vocês que talvez não saibam, ProjectDiscovery é a equipe responsável pelo desenvolvimento de diversas ferramentas como Nuclei, Httpx, Katana, DnsX, entre outras. Gosto bastante de todo o projeto, e a intenção de facilitar e automatizar alguns processos de pentest é realmente útil. Utilizo o Nuclei, Httpx e outros projetos deles há bastante tempo, e tudo sempre funcionou bem.

Basicamente, vou demonstrar como você pode combinar algumas ferramentas da ProjectDiscovery para automatizar a captura e o escaneamento de JavaScripts em busca de segredos (chaves de API, senhas e afins), combinando o Subfinder, Httpx, Katana e Nuclei (nuclei-templates).


Preparando o ambiente

Para começar, você precisa instalar todas as ferramentas que iremos utilizar. Considerando que você já tem o Go instalado em sua máquina, com uma versão superior a 1.21, aqui está a lista de comandos para instalar as ferramentas:

  • Nuclei
go install -v github.com/projectdiscovery/nuclei/v3/cmd/nuclei@latest
  • Subfinder
go install -v github.com/projectdiscovery/subfinder/v2/cmd/subfinder@latest
  • Httpx
go install -v github.com/projectdiscovery/httpx/cmd/httpx@latest
  • Katana
go install -v github.com/projectdiscovery/katana/cmd/katana@latest

Certifique-se de que a variável de ambiente GOPATH está definida corretamente para que você possa executar as ferramentas diretamente pelo seu terminal.

Para instalar o nuclei-templates, é necessário executar a ferramenta nuclei pelo menos uma vez.


O início

Após instalar todas as ferramentas, podemos começar a utilizá-las para fazer um pouco de magia. Assim, precisamos enumerar os subdomínios do nosso alvo para depois capturar todos os endpoints. Estarei utilizando o Subfinder para isso. Recomendo que vocês configurem algumas chaves de API que o Subfinder suporta; isso vai ajudar a encontrar mais subdomínios.

O comando que iremos utilizar é subfinder -all -d target.domain -o domains.txt. Podemos esperar um resultado parecido com isso: subfinder

Após enumerar todos os subdomínios e salvar a saída do comando em um arquivo de texto, precisamos verificar quais estão ativos ou não. Você pode utilizar esse comando: httpx -l domains.txt -o domains.httpx

Dica: Você pode especificar portas diferentes como 8080, 8081, 81 e outras para encontrar outros serviços que rodam sobre o mesmo ativo.

Esse é um dos principais processos que utilizaremos para capturar os arquivos JavaScript. Vamos usar o Katana para capturar todos os endpoints dos subdomínios encontrados, utilizando o atributo -jc. Eu usarei esse comando, mas você pode aprimorá-lo com o grep e outros binários: cat domains.httpx | katana -jc -o endpoints.txt.

Com todos os endpoints capturados, filtraremos aqueles que terminam com .js. Para isso, utilizaremos grep '.js' endpoints.txt > js_files.txt. No entanto, isso também armazenará os endpoints que terminam com .json. Para removê-los, podemos utilizar o grep novamente: grep -v '.json' js_files.txt > js_files_cleaned.txt.

Depois de filtrar os endpoints, precisamos salvar os arquivos JavaScript em algum lugar. Vamos combinar os binários cURL e xargs para salvá-los em um diretório. Podemos utilizar o awk para extrair o nome do domínio e o nome do arquivo, facilitando a identificação posteriormente. Antes de executar o comando abaixo, certifique-se de que você está em um diretório apropriado para armazenar todos os arquivos JavaScript.

while read url; do
  filename=$(echo $url | awk -F/ '{gsub(/[\/:]/, "-", $3); print $3 "-" $NF}')
  curl "$url" > "${filename}.js"
done < ../js_files_cleaned.txt

O fim

O resultado final do comando será algo parecido com o seguinte:

Agora, para encontrarmos possíveis vazamentos de segredos (secrets) no código, utilizaremos o Nuclei juntamente com os nuclei-templates. Este é o comando que venho utilizando, e sempre funcionou para mim:

find <js_files_path> -type f -name "*.js" | while read jsfile; do nuclei -t ~/nuclei-templates/file/ -target "$jsfile" -severity low,medium,high,critical -et ~/nuclei-templates/file/xss/dom-xss.yaml; done


Avisos e Declarações

  • Você provavelmente será bloqueado pelo WAF (Web Application Firewall), então tenha cuidado.
  • Naturalmente, haverá muitos falsos positivos, portanto, seja paciente e verifique cada resultado para determinar o que é verdadeiro ou não.
  • Existem, provavelmente, outras maneiras melhores de realizar essa tarefa, mas acredito que esta também seja eficaz. Use essa se quiser.
  • Não estou compartilhando isso para provar qualquer ponto específico, apenas acredito que possa ser útil para pessoas interessadas em experimentar abordagens diferentes.

Referências

Tags