LinkFinder: extraindo endpoints de bundles JavaScript

LinkFinder · MIT

O LinkFinder parseia arquivos JavaScript e extrai qualquer coisa que pareça um endpoint. Front-ends modernos enviam toda a tabela de roteamento ao navegador, o que significa que o bundle é uma descrição bastante completa da API — incluindo rotas que a UI nunca chama.

Instalação

git clone https://github.com/GerbenJavado/LinkFinder.git
cd LinkFinder && pip install -r requirements.txt
python linkfinder.py -h

Comandos principais

# um arquivo JS, saída simples
python linkfinder.py -i https://example.com/static/app.js -o cli

# todo script de uma página
python linkfinder.py -i https://example.com -d -o cli

# um domínio inteiro a partir do corpus da Wayback
python linkfinder.py -i "https://example.com/*" -o results.html

# um bundle local
python linkfinder.py -i ./app.bundle.js -o cli

O -o cli imprime no stdout, que é o que você quer num pipeline; o padrão grava um relatório HTML.

Saída

Um endpoint candidato por linha:

/api/v2/users
/api/v2/admin/impersonate
/internal/healthz

Onde ele entra no Tandera

O LinkFinder roda na fase de analyze do recon_web_lite e do recon_web_full, contra o JavaScript que o katana recuperou durante o crawl. Ele fica ao lado do jxscout e do retirejs, que leem os mesmos bundles para coisas diferentes — segredos e dependências vulneráveis, respectivamente.

Os endpoints que ele recupera voltam ao corpus de URLs e viram alvos de sondagem.

Usando em um pentest

Rotas de admin são enviadas a todo usuário. Um front-end que esconde um painel admin não renderizando o botão ainda contém a rota. /api/v2/admin/impersonate num bundle servido a usuários anônimos vale testar imediatamente — se não estiver autorizado no lado do servidor, esse é seu crítico.

Espere ruído. A regex casa com strings parecidas com paths, então você vai receber fragmentos de CSS, tipos MIME e números de versão. Filtre, depois sonde:

python linkfinder.py -i https://example.com -d -o cli 
  | grep -E '^/' | sort -u 
  | sed 's|^|https://example.com|' | httpx -silent -status-code

Source maps são melhores quando existem. Se app.js.map é servido, você recebe as fontes originais em vez da saída minificada. Sempre verifique.

acesso antecipado

Garanta a Tandera antes do próximo engagement.

Entre na waitlist para acesso antecipado. Estamos integrando times de pentest em ondas.

✓Onboarding prioritário para times de pentest.
✓Linha direta com quem está construindo.
✓Preço de acesso antecipado, garantido.

Sem spam, sem cartão. Cancele quando quiser.

enespt-br