This content is not available in English yet.View Spanish original →
WIKI / FIELD NOTE

Superficie web

Descubrimiento y clasificación inicial de aplicaciones web expuestas por una organización.

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

  1. Normalizar dominios, subdominios e IP autorizados.
  2. Detectar servicios HTTP y HTTPS con httpx.
  3. Agrupar por código, título, tecnología, favicon y contenido.
  4. Capturar screenshots para priorizar visualmente.
  5. Ejecutar crawling y añadir URLs históricas.
  6. Extraer endpoints, parámetros, APIs y ficheros JavaScript.
  7. Realizar descubrimiento de contenido dirigido.
  8. Comprobar configuraciones y plantillas no intrusivas.
  9. 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.txt

HTTP 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.jsonl

No 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 -silent

Un 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 -ac

Comparar 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 server

Aquatone

cat urls.txt | aquatone -out aquatone-report

EyeWitness

eyewitness --web -f urls.txt --results eyewitness-report --no-prompt

Las 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.txt

Evitar 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.txt

Priorizar 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.txt

Registrar 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-type

Documentar 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.json

Extraer:

  • 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 -u

No 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' -ac

Calibrar 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 -ac

Filtrar 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.txt

Tratar 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.com

Una 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.yaml

Revisar 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 -silent

Nuclei

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,intrusive

Validar 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 -silent

Revisar el scope y las exclusiones para evitar logout, acciones sensibles y saltos a terceros.

Aquatone, EyeWitness y Gowitness

HerramientaUso principalEjemplo
AquatoneInforme visual rápidocat urls.txt | aquatone -out report
EyeWitnessScreenshots e informes HTMLeyewitness --web -f urls.txt --no-prompt
GowitnessCaptura y base consultablegowitness 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

  1. Paneles administrativos y aplicaciones autenticadas.
  2. APIs y documentación expuesta.
  3. Entornos de desarrollo, staging o legacy.
  4. Aplicaciones con tecnología obsoleta aparente.
  5. Virtual hosts y servicios sin propietario conocido.
  6. 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 alcance

Estados recomendados: activa, redirige, autenticada, histórica, duplicada, tercero o pendiente de validar.