Ir al contenido

Cheatsheet de reconocimiento web

Por

Madurezreviewed
Última revisión
Publicado
Última actualización

Esta referencia empieza con un dominio, hostname, IP o URL ya atribuido. Los comandos abren preguntas concretas. Continúa en la página enlazada, conserva el output y utiliza la checklist de reconocimiento web antes de cerrar.

RDAP y WHOIS
curl --silent --show-error \
'https://rdap.org/domain/DOMAIN' |
jq .
whois DOMAIN
Registros DNS principales
dig DOMAIN A
dig DOMAIN AAAA
dig DOMAIN NS
dig DOMAIN MX
dig DOMAIN TXT
dig FQDN CNAME
Nombres en Certificate Transparency
curl --silent --show-error \
'https://crt.sh/?q=%25.DOMAIN&output=json' |
jq -r '.[].name_value' |
tr '\r' '\n' |
sed 's/^\\*\\.//' |
sort -u

La información de dominios desarrolla procedencia, delegación, RDAP, WHOIS, DNS y Certificate Transparency.

Descubrir HTTP y HTTPS con Nmap
nmap -sV -p 80,443,8000,8080,8443 \
--script http-title,http-headers,sdoc-cert \
TARGET_IP

Los puertos conocidos son una primera selección, no un inventario completo. Nmap explica descubrimiento, detección de versiones, NSE, output y cobertura TCP.

HTTP/1.1 sin TLS mediante Ncat
printf 'GET / HTTP/1.1\nHost: FQDN\nConnection: close\n\n' |
ncat -nvC TARGET_IP PORT
TLS, SNI y cadena enviada
openssl s_client \
-connect TARGET_IP:PORT \
-servername FQDN \
-showcerts \
-verify_return_error
Respuesta HTTP separada en artefactos
curl --verbose \
--dump-header response.headers \
--output response.body \
BASE_URL/ \
2>connection.trace
Fijar IP sin modificar hosts
curl --verbose \
--resolve FQDN:443:TARGET_IP \
https://FQDN/

Consulta interacción manual con HTTP y TLS para destinos de petición, redirecciones, sesiones y diagnóstico por capa.

Conservar la primera respuesta
curl --include \
--output response.body \
BASE_URL/
Seguir una cadena acotada
curl --location \
--max-redirs 5 \
--dump-header redirect-chain.headers \
--output final.body \
BASE_URL/
Guardar y reutilizar cookies
curl --cookie-jar session.cookies BASE_URL/login
curl --cookie session.cookies BASE_URL/account

Los ficheros de cookies pueden contener sesiones. Sanea su contenido antes de incorporarlo a notas o evidencias compartidas.

Construir la respuesta de referencia del host por defecto
curl --silent \
--dump-header default.headers \
--output default.body \
http://TARGET_IP/
Validar un candidato HTTPS
curl --verbose \
--resolve FQDN:443:TARGET_IP \
https://FQDN/
Probar una wordlist con ffuf
ffuf -w VHOST_LIST \
-u 'https://TARGET_IP/' \
-H 'Host: FUZZ.DOMAIN' \
-mc all \
-rate 20 \
-of json \
-o evidence/ffuf-vhosts.json

La página de hosts virtuales separa DNS, SNI y autoridad HTTP y explica cómo filtrar la respuesta por defecto.

Señales de cabeceras y contenido
curl --include \
--output response.body \
BASE_URL/
whatweb --verbose BASE_URL/
Firmas HTTP y TLS de Nmap
nmap -sV -p PORT \
--script http-title,http-headers,http-server-header,sdoc-cert \
TARGET_IP
Contrastar indicios de WAF
wafw00f BASE_URL/

El fingerprinting web exige correlacionar varias capas. Una firma no demuestra versión, pertenencia ni vulnerabilidad.

Metadatos publicados
curl --silent --show-error BASE_URL/robots.txt
curl --silent --show-error BASE_URL/sitemap.xml
curl --silent --show-error BASE_URL/.well-known/security.txt
curl --silent --show-error BASE_URL/.well-known/openid-configuration

Continúa en robots, sitemaps y rutas conocidas para interpretar cada formato según su estándar.

Crawling con salida JSONL
katana -u BASE_URL/ \
-d 3 \
-jc \
-kf all \
-j \
-o evidence/katana.jsonl
Extraer URLs únicas
jq -r 'select(.request.endpoint != null) | .request.endpoint' \
evidence/katana.jsonl |
sort -u

La estructura exacta del JSONL depende de la versión. Comprueba una línea antes de automatizar la extracción. Crawling desarrolla scope, sesiones, normalización, JavaScript y modo headless.

Primera pasada con ffuf
ffuf -w WORDLIST \
-u 'BASE_URL/FUZZ' \
-mc all \
-rate 20 \
-t 10 \
-timeout 10 \
-of json \
-o evidence/ffuf-content.json
Gobuster con extensiones justificadas
gobuster dir \
-u BASE_URL/ \
-w WORDLIST \
-x php,txt,bak \
-l \
-o evidence/gobuster-content.txt
Feroxbuster con recursión limitada
feroxbuster \
--url BASE_URL/ \
--wordlist WORDLIST \
--depth 2 \
--rate-limit 15 \
--time-limit 15m \
--json \
--output evidence/feroxbuster.json

La página de descubrimiento de contenido explica respuestas de referencia, criterios de selección, filtros, extensiones, recursión y falsos negativos.

Estos perfiles amplían los ejemplos mínimos. BASELINE_SIZE procede de varias respuestas negativas. COOKIE_VALUE representa una sesión obtenida por el procedimiento previsto para la evaluación.

Gobuster con sesión, ritmo, timeout y reintento acotado
gobuster dir \
--url BASE_URL/ \
--wordlist WORDLIST \
--threads 12 \
--delay 150ms \
--timeout 10s \
--retry \
--retry-attempts 1 \
--cookies 'SESSION=COOKIE_VALUE' \
--exclude-length BASELINE_SIZE \
--output evidence/gobuster-authenticated.txt

Señal: candidatos que difieren de la longitud negativa dentro de la sesión. Límite: la espera se aplica por hilo y no constituye un límite global de peticiones. Gobuster en el flujo de trabajo.

ffuf no atendido con rate, pausa, timeout y JSONL
ffuf -w WORDLIST \
-u 'BASE_URL/FUZZ' \
-mc all \
-t 10 \
-rate 20 \
-p 0.1-0.4 \
-timeout 10 \
-maxtime 900 \
-sa \
-audit-log evidence/ffuf.audit \
-json > evidence/ffuf.jsonl

Señal: resultados parciales en JSONL y decisiones de auditoría. Límite: -sa puede detener la ejecución ante una proporción alta de 403. ffuf en el workflow.

Feroxbuster con concurrencia por raíz y global
feroxbuster \
--url BASE_URL/ \
--wordlist WORDLIST \
--depth 2 \
--threads 8 \
--scan-limit 2 \
--rate-limit 15 \
--timeout 10 \
--time-limit 15m \
--json \
--output evidence/feroxbuster.json

Señal: recursos y estadísticas en el mismo artefacto. Límite: autofiltrado, extracción de enlaces y recursión añaden peticiones que no aparecen en la wordlist. Feroxbuster en el workflow.

Consultas de índice
site:DOMAIN
site:DOMAIN filetype:pdf
site:DOMAIN inurl:admin
site:DOMAIN ext:env OR ext:bak OR ext:old
Recuperar URLs de Wayback mediante CDX
curl --silent --show-error \
'https://web.archive.org/cdx/search/cdx?url=DOMAIN/*&output=json&fl=timestamp,original,statuscode,mimetype,digest&filter=statuscode:200&collapse=digest' \
> evidence/wayback-cdx.json

Consulta buscadores y archivos históricos para procedencia, captura, validación actual y deduplicación.

Candidatos pasivos
subfinder -d DOMAIN -silent -o 01-candidates.txt
Observaciones HTTP estructuradas
httpx -l 01-candidates.txt \
-threads 20 \
-rate-limit 25 \
-timeout 10 \
-retries 1 \
-sc \
-title \
-server \
-td \
-ip \
-cname \
-location \
-include-chain \
-json \
-o 02-http.jsonl
Semillas y crawling
jq -r 'select(.url != null) | .url' 02-http.jsonl |
sort -u > 03-base-urls.txt
katana -list 03-base-urls.txt \
-crawl-scope '^https?://([A-Za-z0-9-]+\.)*DOMAIN(?::[0-9]+)?(?:/|$)' \
-d 3 \
-concurrency 5 \
-parallelism 2 \
-rate-limit 20 \
-host-rate-limit 5 \
-timeout 10 \
-retry 1 \
-jc \
-kf all \
-jsonl \
-o 04-crawl.jsonl

Automatización del reconocimiento web explica los controles de HTTPX y el acceso externo que puede producir el clasificador de páginas al generar JSON. La etapa de crawling desarrolla el scope, los límites por host y la reanudación. Una ausencia en HTTP no debe borrar el candidato original.

evidence/
├── commands.log
├── tool-versions.txt
├── 01-candidates.txt
├── 02-http.jsonl
├── 03-base-urls.txt
├── 04-crawl.jsonl
├── content-discovery/
├── manual-validation/
└── review.md

Conserva timestamp, origen, resolución, versiones, inputs, filtros, rate, errores y decisiones. No publiques cookies, tokens, credenciales ni datos de terceros que no sean necesarios para explicar la señal.