
Uma ferramenta poderosa de brute-force de diretórios, projetada para operações recursivas/multiplex, descoberta e enumeração de APIs, extração de arquivos JS e listagem de métodos HTTP de API, em um único comando. Isso não é SOMENTE para APIs, minha ferramenta apenas se destaca nelas.
Uma ferramenta poderosa de brute-force em diretórios projetada para reconhecimento de API e testes de penetração. Descobre automaticamente endpoints ocultos de API, realiza subvarredura recursiva e testa métodos HTTP para enumeração mais aprofundada de APIs.
✨ Capacidades Principais:
requeststmux (opcional, para a flag --split)xfce-terminal (para ambientes desktop Linux)# Clone o repositório
git clone https://github.com/austinjump-sec/API-SPY.git
cd API-SPY
# Instale as dependências
pip install requests
# Torne os scripts executáveis (opcional)
chmod +x apispy.py apiprobe.py
python3 apispy.py <baseUrl> <wordlist> [OPÇÕES]
| Argumento | Descrição |
|---|---|
<baseUrl> | URL alvo (ex.: http://exemplo.com ou http://api.exemplo.com) |
<wordlist> | Caminho para o arquivo de wordlist contendo endpoints (um por linha) |
| Argumento | Descrição |
|---|---|
--t<número> | Número de threads (máx. 150, padrão: 1) |
--split | Usa tmux split-window em vez de novas janelas de terminal |
--debug | Mostra mensagens de erro ocultas |
--loud | Mostra todas as mensagens, positivas e erros, destacando qualquer coisa que não retorne 404 |
--js | Escaneia arquivos JavaScript e extrai endpoints de API comuns fixados no código |
python3 apispy.py http://api.exemplo.com wordlist.txt
python3 apispy.py http://api.exemplo.com wordlist.txt -t10
python3 apispy.py http://api.exemplo.com wordlist.txt -t5 --split
python3 apispy.py http://api.exemplo.com/v1 wordlist.txt -t20
A ferramenta começa testando um conjunto predefinido de caminhos comuns de API:
api, v1, v2, api/v1, api/v2, graphql, rest#)200, 401, 403Quando um endpoint é encontrado, você recebe um prompt:
'-> Subscaneamento <url>? (s/n) [Pulo automático em 5s]:
s/sim para escanear recursivamente aquele endpoint com a mesma wordlistApós a subvarredura, você recebe um prompt:
'-> Testar métodos em <url>? (s/n) [Pulo automático em 5s]:
apiprobe.py que testa métodos HTTP no endpoint descobertoAllow[+] Url found: http://api.exemplo.com/v1 ← 200 OK (acessível)
'-> Subscaneamento http://api.exemplo.com/v1? (s/n) [Pulo automático em 0s]:
[-] Timeout: Skipped prompt for http://api.exemplo.com/v1?
'-> Testar métodos em http://api.exemplo.com/v1? (s/n) [Pulo automático em 4s]:
[-] Url found but not permitted (403 ERR): ... ← Proibido mas existe
[-] Url found but not permitted (401 ERR): ... ← Requer autenticação
[+] GET -> STATUS: 200 OK (Tamanho: 1024)
[-] POST -> STATUS: 405 (Tamanho: 0)
[Dica do Cabeçalho] Allow: GET, HEAD, OPTIONS
Crie um arquivo de texto simples com endpoints (um por linha):
admin
users
api/users
v1/products
v2/customers
/api/v1/auth
/graphql
search
data
config
Nota: Linhas iniciadas com # são tratadas como comentários e ignoradas.
Wordlists populares de API para usar com o API-SPY:
# Modo furtivo (poucas threads)
python3 apispy.py http://alvo.com wordlist.txt -t3
# Modo equilibrado
python3 apispy.py http://alvo.com wordlist.txt -t15
# Modo agressivo
python3 apispy.py http://alvo.com wordlist.txt -t50
timeout=5 no código-fonte para personalizarVerifique se o caminho da wordlist está correto e o arquivo existe:
ls -la /caminho/para/wordlist.txt
Ao subvarrer, certifique-se de que:
apispy.pyapiprobe.pySe --split falhar:
sudo apt install tmuxtmux new-session -s scancurl http://sua-url/check_status()⚠️ Legal e Ético: