Guía rápida para descubrir, clasificar y revisar aplicaciones web dentro de un alcance autorizado. Conserva siempre la relación entre URL, hostname, IP, tecnología, fuente y fecha de observación.
Flujo rápido
- Normalizar dominios, subdominios e IP autorizados.
- Detectar servicios HTTP y HTTPS con httpx.
- Agrupar por código, título, tecnología, favicon y contenido.
- Capturar screenshots para priorizar visualmente.
- Ejecutar crawling y añadir URLs históricas.
- Extraer endpoints, parámetros, APIs y ficheros JavaScript.
- Realizar descubrimiento de contenido dirigido.
- Comprobar configuraciones y plantillas no intrusivas.
- Validar manualmente los hallazgos con Burp Suite.
# Pipeline mínimo
httpx -l hosts.txt -silent -status-code -title -tech-detect \
-ip -cname -web-server -o web.txt
katana -list urls.txt -silent -jc -kf all -o crawl.txtHTTP probing
El probing convierte una lista de nombres o IP en URLs activas y aporta metadatos para priorizar.
# Detección básica
httpx -l hosts.txt -silent -status-code -title -content-length
# Metadatos técnicos
httpx -l hosts.txt -silent -tech-detect -web-server -ip -cname \
-asn -cdn -tls-grab -favicon
# Probar varios puertos HTTP habituales
httpx -l hosts.txt -ports 80,443,8080,8443,8000,8888 \
-status-code -title -silent
# Guardar JSONL para procesado posterior
httpx -l hosts.txt -json -o httpx.jsonlNo descartar respuestas 401, 403, 404 o 5xx: pueden identificar paneles, APIs o virtual hosts válidos.
Web applications
Para cada aplicación registrar:
- URL canónica y redirecciones.
- IP, CNAME, CDN, WAF y proveedor.
- Código, título, tamaño y favicon.
- Tecnologías observadas.
- Tipo: pública, autenticada, administrativa, API o estática.
- Entorno aparente: producción, staging, desarrollo o laboratorio.
# Seguir redirecciones y conservar la cadena
httpx -l hosts.txt -follow-redirects -location -status-code -title -silent
# Hash de favicon para agrupar aplicaciones relacionadas
httpx -l urls.txt -favicon -silentUn hostname con aspecto de desarrollo no implica que esté fuera de producción ni autoriza pruebas más agresivas.
Virtual hosts
Una IP puede servir aplicaciones distintas según la cabecera Host y el SNI de TLS.
# Respuesta base
curl -skI https://203.0.113.10/ -H 'Host: invalid.example.com'
# Validar un hostname concreto contra una IP
curl --resolve app.example.com:443:203.0.113.10 \
https://app.example.com/ -skI
# Descubrimiento por Host en una IP autorizada
ffuf -u https://203.0.113.10/ \
-H 'Host: FUZZ.example.com' \
-w names.txt -acComparar código, tamaño, palabras, líneas, título y redirección con la respuesta base para eliminar falsos positivos.
Tecnologías
Combinar varias señales porque proxies y WAF pueden ocultar o alterar cabeceras.
# ProjectDiscovery
httpx -l urls.txt -tech-detect -web-server -title -favicon -silent
# WhatWeb
whatweb -a 3 https://app.example.com
# Cabeceras y cookies
curl -skD - -o /dev/null https://app.example.com/Revisar HTML, cookies, cabeceras, rutas estáticas, nombres de bundles, favicon, páginas de error y comportamiento. Diferenciar tecnología confirmada de versión inferida.
Screenshots
Los screenshots permiten agrupar portales, identificar paneles y descartar contenido duplicado rápidamente.
Gowitness
gowitness scan file -f urls.txt --screenshot-path screenshots
# Resultado navegable
gowitness report serverAquatone
cat urls.txt | aquatone -out aquatone-reportEyeWitness
eyewitness --web -f urls.txt --results eyewitness-report --no-promptLas herramientas pueden realizar solicitudes adicionales y ejecutar JavaScript. Limitar concurrencia y proteger los informes, ya que pueden contener información sensible.
Crawling
El crawling descubre enlaces, formularios, scripts, rutas y llamadas observables desde la aplicación.
# Crawling estándar con Katana
katana -u https://app.example.com -silent -d 3 -o crawl.txt
# Analizar JavaScript y fuentes conocidas
katana -u https://app.example.com -silent -jc -kf all -o crawl-js.txt
# Lista de aplicaciones
katana -list urls.txt -silent -d 2 -jc -o all-crawl.txt
# Crawling con navegador para aplicaciones dinámicas
katana -u https://app.example.com -headless -d 3 -o headless.txtEvitar acciones que cambien estado: logout, eliminación, envío de formularios, compras o endpoints administrativos.
Endpoints
Normalizar los resultados antes de priorizar:
# URLs únicas sin fragmentos
sed 's/#.*//' crawl.txt | sort -u > endpoints.txt
# Rutas únicas
cat endpoints.txt | unfurl paths | sort -u > paths.txt
# URLs con parámetros
grep -E '\?.+=' endpoints.txt | sort -u > parameterized.txtPriorizar rutas relacionadas con:
- Autenticación, recuperación y SSO.
- Administración y gestión de usuarios.
- Upload, download, import y export.
- Búsqueda, redirecciones y webhooks.
- Integraciones, callbacks y jobs.
- Debug, métricas, health y configuración.
Parameters
Recopilar parámetros desde HTML, formularios, JavaScript, crawling, URLs históricas y tráfico del navegador.
# Nombres de parámetros observados
cat endpoints.txt | unfurl keys | sort -u > parameter-names.txt
# Agrupar URLs ignorando valores concretos
cat endpoints.txt | uro > normalized-urls.txtRegistrar ubicación y método: query string, ruta, cabecera, cookie, formulario o cuerpo JSON. No enviar valores de prueba destructivos durante el inventariado.
APIs
Buscar APIs REST, GraphQL, SOAP, RPC y endpoints internos expuestos accidentalmente.
Rutas habituales:
/api
/api/v1
/graphql
/graphiql
/swagger
/swagger-ui
/api-docs
/openapi.json
/openapi.yaml
/wsdl# Comprobación dirigida
httpx -u https://app.example.com/api \
-u https://app.example.com/graphql \
-u https://app.example.com/openapi.json \
-status-code -title -content-typeDocumentar base URL, versión, autenticación, formatos, CORS y origen de la referencia. Evitar mutaciones y operaciones no idempotentes.
Swagger y OpenAPI
# Rutas frecuentes
for api_path in openapi.json swagger.json api-docs v3/api-docs swagger/index.html; do
curl -sk -o /dev/null -w '%{http_code} %{url_effective}\n' \
"https://app.example.com/$api_path"
done
# Inspeccionar rutas de una especificación descargada
jq -r '.paths | keys[]' openapi.jsonExtraer:
- Servidores y base paths.
- Endpoints y métodos.
- Esquemas y parámetros.
- Mecanismos de autenticación.
- Versiones y referencias a entornos internos.
Una especificación accesible puede estar desactualizada; contrastarla con tráfico real autorizado.
JavaScript
Los bundles pueden revelar endpoints, rutas, nombres de servicios y configuraciones públicas.
# Extraer JavaScript durante crawling
katana -u https://app.example.com -silent -jc -f qurl -o urls.txt
grep -Ei '\.js([?#].*)?$' urls.txt | sort -u > javascript.txt
# Descargar una lista limitada de scripts
while read -r js_url; do
curl -sk --max-time 15 "$js_url"
done < javascript.txt > javascript-content.txt
# Indicadores de rutas y servicios
grep -Eoi 'https?://[^[:space:]<>]+' javascript-content.txt | sort -uNo reportar automáticamente cualquier cadena con aspecto de secreto. Validar si es pública, activa, sensible y perteneciente al objetivo sin utilizarla contra terceros.
Content discovery
Utilizar diccionarios acordes con la tecnología y los nombres observados.
# Directorios y ficheros
ffuf -u https://app.example.com/FUZZ -w words.txt -ac \
-mc all -fc 404
# Extensiones habituales
ffuf -u https://app.example.com/FUZZ -w words.txt \
-e .html,.js,.json,.txt,.xml,.yaml,.yml -ac
# Discovery autenticado con una cookie autorizada
ffuf -u https://app.example.com/FUZZ -w words.txt \
-H 'Cookie: session=REDACTED' -acCalibrar primero la respuesta inexistente y limitar tasa, concurrencia y recursividad. No buscar copias de seguridad o ficheros sensibles fuera de lo permitido por las reglas de enfrentamiento.
ffuf
ffuf permite fuzzing de rutas, vhosts, parámetros y valores.
# Rutas
ffuf -w words.txt -u https://app.example.com/FUZZ -ac
# Vhosts
ffuf -w names.txt -u https://203.0.113.10/ \
-H 'Host: FUZZ.example.com' -ac
# Nombres de parámetros GET
ffuf -w parameters.txt -u 'https://app.example.com/search?FUZZ=test' -ac
# Limitar velocidad y guardar JSON
ffuf -w words.txt -u https://app.example.com/FUZZ \
-rate 20 -t 10 -of json -o ffuf.json -acFiltrar con -fc, -fs, -fw o -fl cuando la calibración automática no sea suficiente.
gau y waybackurls
Las fuentes históricas aportan URLs que ya no están enlazadas desde la aplicación actual.
# GetAllURLs
printf '%s\n' example.com | gau --subs > gau.txt
# Wayback Machine
printf '%s\n' example.com | waybackurls > wayback.txt
# Combinar, normalizar y deduplicar
cat gau.txt wayback.txt | uro | sort -u > historical-urls.txt
# Verificar cuáles siguen respondiendo
httpx -l historical-urls.txt -silent -status-code -title -o historical-live.txtTratar las URLs históricas como pistas: pueden contener tokens caducados, datos antiguos o dominios que ya pertenecen a terceros.
Misconfigurations
Comprobar de forma no destructiva:
- Redirecciones y canonicalización HTTP/HTTPS.
- Cabeceras de seguridad y cookies.
- CORS y métodos HTTP anunciados.
- Directory listing y páginas por defecto.
- Información de versiones y errores detallados.
- Certificados caducados o nombres incorrectos.
- Paneles, documentación y endpoints de diagnóstico expuestos.
- Archivos públicos de configuración destinados al cliente.
# Cabeceras y métodos anunciados
curl -skI https://app.example.com/
curl -sk -X OPTIONS -i https://app.example.com/
# Scripts NSE web no intrusivos y revisados
nmap -Pn -p 80,443 --script http-title,http-headers,http-methods app.example.comUna cabecera ausente no siempre constituye una vulnerabilidad; evaluar contexto e impacto.
Vulnerability templates
Nuclei automatiza comprobaciones mediante plantillas. Seleccionar etiquetas y severidades acordes con la fase de reconocimiento.
# Actualizar plantillas
nuclei -update-templates
# Detección de tecnologías y exposiciones
nuclei -l urls.txt -tags tech,exposure,misconfig \
-severity info,low,medium -rate-limit 20 -o nuclei.txt
# Ejecutar una plantilla concreta revisada previamente
nuclei -u https://app.example.com -t ruta/a/template.yamlRevisar las plantillas antes de ejecutarlas. Excluir categorías intrusivas, fuzzing, fuerza bruta y cualquier comprobación que cambie estado.
httpx
httpx identifica servicios web y genera inventarios procesables.
httpx -l hosts.txt -silent -status-code -title -content-length \
-tech-detect -web-server -ip -cname -cdn -tls-grab -json -o httpx.jsonl
# Filtrar respuestas concretas
httpx -l hosts.txt -mc 200,301,302,401,403 -silent
# Limitar velocidad
httpx -l hosts.txt -rate-limit 20 -threads 10 -silentNuclei
Nuclei sirve para comprobar patrones conocidos de exposición y configuración.
# Solo detección y paneles
nuclei -l urls.txt -tags tech,panel -severity info -rate-limit 20
# Misconfiguraciones y exposiciones
nuclei -l urls.txt -tags misconfig,exposure \
-severity low,medium,high -rate-limit 20 -jsonl -o nuclei.jsonl
# Excluir etiquetas no deseadas
nuclei -l urls.txt -exclude-tags fuzz,dos,bruteforce,intrusiveValidar manualmente cada resultado; una coincidencia de plantilla no demuestra impacto por sí sola.
Katana
Katana realiza crawling estándar o con navegador.
katana -list urls.txt -silent -d 3 -jc -kf all -o katana.txt
# Scope limitado al dominio raíz
katana -u https://app.example.com -fs rdn -d 3 -silent
# Headless para aplicaciones dinámicas
katana -u https://app.example.com -headless -d 3 -silent
# Limitar peticiones
katana -u https://app.example.com -rate-limit 10 -concurrency 5 -silentRevisar el scope y las exclusiones para evitar logout, acciones sensibles y saltos a terceros.
Aquatone, EyeWitness y Gowitness
| Herramienta | Uso principal | Ejemplo |
|---|---|---|
| Aquatone | Informe visual rápido | cat urls.txt | aquatone -out report |
| EyeWitness | Screenshots e informes HTML | eyewitness --web -f urls.txt --no-prompt |
| Gowitness | Captura y base consultable | gowitness scan file -f urls.txt |
Deduplicar las URLs antes de capturar y almacenar los informes como material sensible del proyecto.
Burp Suite
Usar Burp Suite para validar manualmente la superficie descubierta:
- Configurar Target scope antes de navegar.
- Activar Proxy intercept solo cuando sea necesario.
- Revisar HTTP history, Site map y WebSockets.
- Enviar peticiones concretas a Repeater.
- Utilizar Comparer y Decoder para análisis local.
- Evitar escaneo activo automático fuera del alcance.
Separar sesiones y perfiles de navegador por aplicación. No mezclar cookies, tokens o datos entre usuarios y entornos.
Priorización
- Paneles administrativos y aplicaciones autenticadas.
- APIs y documentación expuesta.
- Entornos de desarrollo, staging o legacy.
- Aplicaciones con tecnología obsoleta aparente.
- Virtual hosts y servicios sin propietario conocido.
- Endpoints históricos que todavía responden.
Plantilla de inventario
URL | IP | CNAME | Código | Título | Tecnología | Tipo | Entorno | Auth | Fuente | Fecha | Confianza | En alcanceEstados recomendados: activa, redirige, autenticada, histórica, duplicada, tercero o pendiente de validar.