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.