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