Kiterunner: content discovery hecho para APIs
Kiterunner · AGPL-3.0
Kiterunner es content discovery diseñado para APIs en lugar de sitios web. Los brute-forcers genéricos envían GET /path; las APIs reales usan métodos, headers, parámetros de path y content types específicos. Kiterunner reproduce plantillas de solicitud derivadas de decenas de miles de especificaciones reales de API, así que encuentra rutas que solo responden a, por ejemplo, POST con cuerpo JSON.
Instalación
# release binario
wget https://github.com/assetnote/kiterunner/releases/latest/download/kiterunner_linux_amd64.tar.gz
tar xf kiterunner_linux_amd64.tar.gz && sudo mv kr /usr/local/bin/
# wordlists (archivos kite routes-* de Assetnote)
wget https://wordlists-cdn.assetnote.io/data/kiterunner/routes-large.kite Comandos principales
# scan con una wordlist kite
kr scan https://api.example.com -w routes-large.kite
# una lista de hosts
kr scan hosts.txt -w routes-large.kite -o json -O results.json
# lleva un header de auth
kr scan https://api.example.com -w routes-large.kite
-H "Authorization: Bearer TOKEN"
# ajusta concurrencia y tasa
kr scan https://api.example.com -w routes-large.kite
--max-connection-per-host 5 -x 10 Salida
{"method":"POST","path":"/api/v2/users/import","status":401,"content_length":52,
"host":"https://api.example.com"} Un 401 aquí es una señal, no un fallo: la ruta existe y exige auth.
Dónde encaja en Tandera
Kiterunner se ejecuta en la fase de analyze de recon_api. Sus resultados alimentan la síntesis de shadow-endpoints del flujo — las rutas que descubre se comparan contra la especificación documentada de la API, y cualquier cosa presente pero no documentada se saca a la luz como superficie oculta.
Uso en un pentest
401 y 403 son los resultados interesantes, no 200. Significan que el endpoint existe y está protegido. Un endpoint no documentado que exige auth es exactamente donde la autorización rota a nivel de objeto tiende a vivir — pruébalo con y sin credenciales.
Coincide el método, o no encuentras nada. La razón por la que los brute-forcers genéricos se pierden rutas de API es que solo envían GET. La consciencia de método de Kiterunner es el punto; no recurras a una wordlist solo de GET contra una API.
Haz diff contra la spec. Si el cliente proporcionó un documento OpenAPI, la brecha entre lo que documenta y lo que Kiterunner encuentra es la shadow API — no documentada, y normalmente menos probada.
Limita la tasa contra producción. Las listas de rutas son grandes. Limita las conexiones y coordina la ventana con el cliente.