Panorama#

Las tres ramas anteriores de P2 coleccionaban inteligencia con un fin investigativo: anclar a una persona (2.2), leer el contenido que produce (2.3), mapear la infraestructura que opera (2.4). El recon ofensivo reorienta exactamente el mismo instrumental hacia un fin distinto: la superficie de ataque de una organización. Es el capítulo bisagra de la Parte 2 —donde el mapa OSINT deja de ser un dossier y se convierte en una lista de objetivos—, y su salida alimenta directamente la metodología de pentest (3.1) y, tras el primer punto de apoyo, el reconocimiento interno de Active Directory (4.1). La enumeración exhaustiva y cíclica que 3.1 consagra como principio empieza aquí, del lado de afuera.

Dos ejes ordenan la disciplina. El primero es pasivo frente a activo: el reconocimiento pasivo no toca al objetivo —consulta bases que ya escanearon internet, lee certificados, mira repositorios— y por eso es invisible; el activo interroga directamente los sistemas del objetivo —escanea puertos, fuerza subdominios, enumera buckets— y deja huella en sus registros. El segundo eje es puntual frente a continuo: la ventaja real del atacante no es una herramienta sino el tiempo. Una superficie segura hoy puede exponer mañana un Redis sin contraseña o un Jenkins abierto; quien la vigila —y no solo la escanea una vez— captura esa ventana antes que el defensor la cierre.

flowchart LR
  subgraph P2["Mapa OSINT (2.2–2.4)"]
    ID["personas · dominios ·\nIPs · certificados"]
  end
  subgraph RO["Recon ofensivo (2.5)"]
    PAS["Pasivo\n(Shodan · Censys · certs ·\nGitHub — invisible)"]
    ACT["Activo\n(subdominios · S3 ·\nport scan — deja huella)"]
  end
  AS["Superficie de ataque\n(subdominios · servicios\nexpuestos · secretos · buckets)"]
  ID --> PAS & ACT
  PAS --> AS
  ACT --> AS
  AS -.->|"lista de objetivos"| C31["explotación (3.1)"]
  AS -.->|"tras el foothold"| C41["recon interno AD (4.1)"]
  classDef n fill:#1e293b,stroke:#475569,color:#e2e8f0;
  class ID,PAS,ACT,AS,C31,C41 n;

Pasivo antes que activo, continuo antes que puntual#

La distinción entre reconocimiento pasivo y activo no es académica: gobierna el orden de trabajo y el riesgo de detección. Todo lo que se agotó en la infraestructura (2.4) —Shodan, Censys, crt.sh, GitHub, WHOIS histórico— es pasivo: se consultan motores que ya escanearon internet, y el objetivo no registra una sola conexión anómala. El reconocimiento activo —escanear los puertos del objetivo, forzar sus subdominios contra sus propios servidores de nombres, enumerar sus buckets— es donde empiezan las huellas. La disciplina profesional, y la que las reglas de enganche de un engagement exigen (el scoping de 3.1), es agotar lo pasivo primero y reservar lo activo para cuando ya hay un objetivo definido y autorizado.

Sobre ese orden se monta la segunda idea, la que separa al atacante paciente del oportunista: el recon es monitoreo continuo, no un evento. En lugar de un escaneo puntual, se instala vigilancia permanente de la superficie. La técnica canónica es el Nmap diffing: un cron diario corre nmap y usa ndiff para comparar el resultado de hoy con el de ayer y alertar los puertos nuevos. Un Masscan permite barridos masivos —internet entero en minutos, aunque poco fiable para el diffing en rangos grandes—, y las herramientas de captura de pantalla web (EyeWitness, HTTPScreenshot) generan un mapa visual de cientos de aplicaciones, paneles RDP y VNC de un vistazo, para priorizar sin abrir cada una.

# Nmap diffing: cron diario que alerta puertos nuevos (recon como vigilancia) d=$(date +%F); y=$(date -d yesterday +%F) nmap -T4 -oX /opt/nmap_diff/scan_$d.xml 203.0.113.0/24 >/dev/null 2>&1 [ -e /opt/nmap_diff/scan_$y.xml ] && ndiff /opt/nmap_diff/scan_$y.xml /opt/nmap_diff/scan_$d.xml > diff.txt # mapa visual de la superficie web desde un escaneo de nmap nmap 203.0.113.0/24 --open -p 80,443 -oX scan.xml python EyeWitness.py -x scan.xml --web

La nube rompió el escaneo por rango; los certificados lo resolvieron#

El escaneo por rango de IP daba por sentada una infraestructura propia con bloques asignados. La nube lo rompió: un objetivo alojado en AWS puede estar en cualquier IP de un /13 repartido en cualquier región, con direcciones dinámicas y sin bloque atribuible —un nmap por rango no lo encuentra—. La solución es pasiva e indirecta, y extiende la técnica de certificados de 2.4 hacia el ataque: parsear los certificados SSL. Censys ya scrapea los certificados de todo internet, y como el Common Name y los Subject Alternative Names llevan el hostname real del servidor —incluidos los internos int., dev., vpn., que no responden por IP pública—, el certificado revela dónde está alojado el objetivo y qué servidores internos existen. La misma lógica corre a mano con una herramienta como sslScrape, que escanea el puerto 443 de un rango y extrae los hostnames de cada certificado. Es el ejemplo más limpio del capítulo: un dato pensado para dar confianza —el certificado que cifra el tráfico— delata la topología que se quería ocultar.

Enumeración de subdominios#

Cada subdominio es un candidato de entrada, y el objetivo casi siempre tiene más de los que publica. Los rangos se obtienen de los registros regionales (ARIN, RIPE y pares). Los subdominios se descubren por tres caminos de riesgo creciente. El bruteforce por diccionario (Knock y listas como las de SecLists) prueba nombres comunes —webmail, ftp, vpn, dev— contra los servidores de nombres del objetivo: es efectivo pero activo y ruidoso. La consulta vía buscadores (Sublist3r) extrae subdominios ya indexados sin tocar al objetivo, aunque arriesga captchas. Y la vía más elegante es el bruteforce a través de resolvedores DNS abiertos (SubBrute con MassDNS): al preguntar a resolvedores públicos en lugar de a los del objetivo, evita el rate-limit y no deja huella en los servidores de nombres de la víctima —anonimato y velocidad a la vez—. Los frameworks de descubrimiento (Discover Scripts, y hoy Amass o amass enum) orquestan las tres vías y las cruzan con las fuentes pasivas. El producto es la lista de dev, staging y vpn que 2.4 anticipó: la puerta trasera arquitectónica de casi toda organización.

Secretos en GitHub y almacenamiento en la nube#

Dos fuentes convierten el recon en acceso casi inmediato. La primera es GitHub, que filtra los secretos que sus dueños creen borrados: cuando un desarrollador sube por error una clave de AWS, una contraseña o un hostname interno y luego lo elimina, Git conserva el archivo en el historial de commits —el borrado da una falsa sensación de seguridad—. TruffleHog y git-all-secrets recorren todo el historial y todas las ramas buscando cadenas de alta entropía (claves, tokens) que delatan un secreto. La segunda fuente es el almacenamiento en la nube, que amplifica lo visto en 2.3 y 2.4: los buckets S3 se enumeran (Slurp, Bucket Finder) y se abusan con la propia awsclis3 ls y s3 sync para leer y descargar todo, get-bucket-acl para leer permisos—; y un bucket con escritura global cuyos archivos se sirven en las páginas de la aplicación escala de fuga de datos a ejecución de código, porque modificar esos archivos inyecta contenido malicioso en los servidores web del objetivo. El pariente de esta clase es el subdomain takeover: un CNAME colgante que apunta a un servicio de terceros ya dado de baja (S3, Heroku, GitHub Pages) permite reclamar ese hostname del objetivo y servir desde él. La cosecha se cierra con la de correos (formato corporativo de 2.2, SimplyEmail, brechas), que arma la lista de destinatarios del spear phishing —el puente hacia la ingeniería social—.

Defensa, encuadre púrpura y detección#

El rasgo que define la defensa de este capítulo es incómodo: buena parte del recon ofensivo es invisible. Como lo pasivo no toca al objetivo, no hay nada que detectar en el perímetro, y la defensa deja de ser detección para volverse postura y gestión de superficie externa (attack surface management, la disciplina que 2.4 introdujo).

flowchart TD
  A["Recon ofensivo\n(mayormente pasivo = invisible)"]
  B["ASM: correr las mismas\nherramientas CONTRA UNO MISMO"]
  A --> B
  B --> C["Shodan/Censys/sslScrape propios\n→ inventario de lo expuesto"]
  B --> D["TruffleHog/git-secrets sobre\nrepos propios → rotar claves"]
  B --> E["auditar ACL de S3\n(nunca Everyone write)"]
  B --> F["eliminar CNAMEs colgantes\n(IOC de subdomain takeover)"]
  G["Lo ÚNICO detectable:\nrecon activo"] --> H["picos de conexiones +\nqueries DNS fallidas (brute)"]
  H -.->|"pero SubBrute usa resolvers\nabiertos → no toca al objetivo"| I["correlación parcial\n(SIEM 4.9)"]
  classDef n fill:#1e293b,stroke:#475569,color:#e2e8f0;
  class A,B,C,D,E,F,G,H,I n;

El programa defensivo es, punto por punto, la inversión de las técnicas —el self-recon (2.1) llevado a la infraestructura—. Se corren Shodan, Censys y sslScrape contra la propia organización para inventariar lo que está expuesto y descubrir servidores internos que el certificado filtra; se escanean los repositorios propios con TruffleHog o git-secrets como control continuo, rotando y revocando cualquier credencial filtrada; se endurecen los permisos de S3 (jamás escritura para Everyone, auditoría de get-bucket-acl); se eliminan los CNAME colgantes, que son el indicador de compromiso directo del subdomain takeover; y se monitorean las brechas para forzar el reinicio de las cuentas expuestas. Lo único detectable es el reconocimiento activo: el diffing de Nmap o Masscan y el bruteforce de subdominios generan picos de conexiones y de consultas DNS fallidas, correlacionables en un SIEM —el terreno de la defensa de AD (4.9) y de la telemetría de perímetro—; pero el atacante disciplinado usa resolvedores abiertos precisamente para no tocar los servidores de nombres del objetivo, de modo que la correlación siempre es parcial. La superficie del subdomain takeover y del S3 escribible enlaza además con las clases del web moderno (3.5).

En MITRE ATT&CK el capítulo cruza el reconocimiento pasivo y el activo: T1595 (Active Scanning, con T1595.001 escaneo de bloques de IP y T1595.002 escaneo de vulnerabilidades), T1596.001/T1596.003 (Search Open Technical Databases: DNS y certificados digitales), T1593.003 (Search Open Websites: Code Repositories, para GitHub) y T1590 (Gather Victim Network Information). Su mitigación combina Pre-compromise (M1056) con un programa maduro de ASM: dado que lo pasivo no se detecta, la única defensa real es conocer y reducir la propia superficie antes que el atacante la descubra.

Referencias#

  • red-infra/hacker-playbook3/cap-02Before the Snap: Red Team Recon: el recon como monitoreo continuo (Nmap diffing con ndiff, Masscan, capturas web con EyeWitness/HTTPScreenshot), el descubrimiento en la nube por certificados SSL (Censys, sslScrape), la enumeración de subdominios (Knock, Sublist3r, SubBrute con resolvedores abiertos), los secretos en GitHub (TruffleHog, git-all-secrets), el abuso de buckets S3 y el subdomain takeover por CNAME colgante, y la cosecha de correos para el spear phishing.
  • osint/bazzell-osint/cap-06 — apoyo pasivo: crt.sh/Censys para el pivoteo por certificados y los SAN, Shodan con sus filtros, y el marco de gestión de superficie externa (la misma base que sostiene la infraestructura (2.4)).
  • Herramientas: Amass (enumeración de subdominios), TruffleHog, EyeWitness, crt.sh y Censys; listas de SecLists.
  • MITRE ATT&CK — Reconnaissance (TA0043): T1595 (Active Scanning), T1596 y T1593/003 (repositorios de código), con mitigación Pre-compromise (M1056) y gestión de superficie externa.