Reconocimiento externo & OSINT

Whois

WhoisXMLAPI

https://whois.whoisxmlapi.com/

Se puede obtener el whois de un dominio realizando la siguiente consulta a la API:

curl --location 'https://www.whoisxmlapi.com/whoisserver/WhoisService' \
    --header 'Content-Type: application/json' \
    --data '{
        "domainName": "dominio.com",
        "apiKey": "<TUAPIKEY>",
        "outputFormat": "JSON"
    }'

Con el siguiente mini-script de bash se puede automatizar la obtención de los registros Whois de una lista de dominios objetivos.

Para ello, hay que sustituir en la variable data el valor de la APIKey por la de una cuenta de WhoisXMLAPI.

for i in $(cat domains.txt); do ts=$(date +%Y%m%d); data="{\"domainName\": \"$i\", \"apiKey\": \"<TUAPIKEY>\", \"outputFormat\": \"JSON\"}"; curl -s --location 'https://www.whoisxmlapi.com/whoisserver/WhoisService' --header 'Content-Type: application/json' --data "$data" -o "${ts}_${i}whoisxmlapi.json"; echo "Guardado: ${ts}${i}_whoisxmlapi.json"; done

En el siguiente enlace, tras haber iniciado sesión, se puede obtener el valor de nuestra APIKey:

https://whois.whoisxmlapi.com/documentation/making-requests

Enumeración de dominios

WhoIsXMLApi

Si por ejemplo, conociendo el nombre de la organización y usando, además, el nombre que usa la organización para registrar dominios que sepamos que les pertenecen, se pueden buscar otros dominios asociados a la misma organización.

https://tools.whoisxmlapi.com/reverse-whois-search

Obtención de IPs

echo "domain,ip" > domain_ips.csv && for d in $(cat domains.txt); do ips=$(dig +short "$d" | tr '\n' ' ' | sed 's/ *$//'); [[ -z "$ips" ]] && ips="NA"; echo "$d,\"$ips\"" >> domain_ips.csv; done

Enumeración de subdominios

WhoIsXMLApi

https://tools.whoisxmlapi.com/domains-subdomains-discovery

O usando la API:

https://domains-subdomains-discovery.whoisxmlapi.com/api/documentation/making-requests

curl -s -X POST "https://domains-subdomains-discovery.whoisxmlapi.com/api/v1" \
  -H "Content-Type: application/json" \
  -d '{ "apiKey": "<TUAPIKEY>", "domains": { "include": [ "dominio.com" ] }, "subdomains": { "include": [ "*" ] } }'

ProjectDiscovery Cloud Platform

https://cloud.projectdiscovery.io/assets/domain/<dominio>
https://cloud.projectdiscovery.io/assets/domain/hubspot.com

Bevigil

https://bevigil.com/osint-api

crt.sh

https://crt.sh/?q=%25.<dominio>
https://crt.sh/?q=%25.xtormin.com

Subfinder

https://github.com/projectdiscovery/subfinder

subfinder -d xtormin.com -silent

Subfinder + httpx

https://github.com/projectdiscovery/httpx

subfinder -silent -d xtormin.com | httpx -silent
subfinder -silent -d xtormin.com | httpx -silent > discover/urls-xtormin.com.txt
subfinder -silent -d xtormin.com | httpx -silent | nuclei -t technologies/tech-detect.yaml

gau

https://github.com/lc/gau

Obtener URL conocidas de Open Threat Exchange de AlienVault, Wayback Machine y Common Crawl.

gau ejemplo.com > urls.txt

Se ejecuta el comando anterior y luego se filtran esas URLs (por ejemplo, quedarse con aquellas con parámetros ?=) y pasarlas a Nuclei.

¿Por qué? Porque en esas rutas a veces hay endpoints antiguos. Un caso práctico: extraer todas las URLs de ejemplo.com con gau, luego ejecutar plantillas de exposures sobre ellas (buscando si algún endpoint /dev/ o parámetros de debug están accesibles). Esto puede revelar API ocultas o páginas de administración a las que ya no se enlaza, pero siguen activas.

katana

https://github.com/projectdiscovery/katana

Es un web crawler rápido de ProjectDiscovery. Tras identificar un host interesante, se puede ejecutar el comando anterior para descubrir rutas internas (por ejemplo, enlaces o endpoints en el código JavaScript) y luego alimentar esos resultados a Nuclei.

katana -u https://ejemplo.com

Katana encuentra cosas que gau (pasivo) no ve, ya que explora la aplicación en tiempo real. Integrando Katana con Nuclei, se logra un fuzzing dirigido: primero se rastrea la superficie del sitio, luego se escanean esos descubrimientos con plantillas. Por ejemplo, si Katana descubre un /api/v2/internal/test, se puede inmediatamente correr plantillas de API genéricas sobre ese endpoint para ver si hay configuraciones inseguras o métodos HTTP habilitados inesperadamente.

qsreplace

Esta herramienta reemplaza valores de parámetros en una lista de URLs con un payload deseado. Es útil para pruebas de inyección.

Un ejemplo: supongamos que con gau/katana se obtuvo una lista de URLs con parámetros (urls_con_params.txt). Un hunter podría usar qsreplace para inyectar un payload XSS en todos esos parámetros de golpe:

cat urls_con_params.txt | qsreplace '"><img src=x onerror=alert(1)>' > xss_test_urls.txt

Luego ese archivo xss_test_urls.txt se pasa a Nuclei con una plantilla de detección de XSS reflejado. La plantilla comprobaría si la cadena "><img src=x onerror=alert(1)> aparece en la respuesta sin escapar, indicando vulnerabilidad. De esta manera, Nuclei se convierte en el motor de verificación, mientras que herramientas como qsreplace generan variaciones de los inputs. Similarmente, qsreplace se puede usar para SSRF (reemplazando parámetros url= con un dominio collaborator y usando Nuclei/Interactsh para detectar salida), o para LFI (reemplazando parámetros file= con ../../../../etc/passwd y buscando la respuesta).

Concatenación de herramientas

Dnsx puede resolver masivamente subdominios (por si subfinder entrega resultados sin IP); Naabu para detectar puertos abiertos no estándar (por ejemplo aplicaciones corriendo en 8080, 8443, etc., que Httpx luego convierte a URLs para Nuclei); Katana headless para escenarios con heavy JavaScript; ParamSpider/GF para encontrar parámetros candidatos a inyección, etc. En general, Nuclei se coloca al final de estas cadenas: consume los datos que otras herramientas producen (URLs, parámetros, hosts) y realiza los chequeos de vulnerabilidades en base a sus plantillas.

Parseado de información

Extraer subdominios de una lista de URLs:

cat subfinder_output.txt | awk -F/ '{print $3}' | sort -u > subdomains.txt

Enumeración de redes (PTR)

echo "173.0.84.0/24" | dnsx -silent -resp-only -ptr

Enumeración de organizaciones y ASN

https://github.com/j3ssie/metabigor

echo "organización" | metabigor net --org -o org-data.txt
echo AS17012 | dnsx -silent -resp-only -ptr

Subdomain Takeover

Condiciones de explotación

Condiciones:

  1. El subdominio existe y apunta a un servicio externo.

  2. El recurso en el proveedor externo no está activo o no ha sido creado.

  3. El proveedor permite reclamar ese nombre sin verificación adicional.

  4. El DNS sigue apuntando al servicio (registro activo).

Condición 1

El subdominio (sub.example.com) tiene un registro DNS que apunta a un proveedor externo mediante un registro CNAME o A.

Algunos ejemplos:

Subdominio
Registro DNS
Servicio externo

blog.example.com

CNAME → example.github.io

GitHub Pages

app.example.com

CNAME → app.herokuapp.com

Heroku

shop.example.com

CNAME → shops.myshopify.com

Shopify

status.example.com

CNAME → example.statuspage.io

Atlassian Statuspage

Condición 2

La cuenta, repositorio, app o recurso ya no existe en el proveedor (o nunca fue creado), pero el subdominio sigue apuntando allí.

Ejemplo:

dig blog.example.com CNAME +short
# example.github.io.

Y si visitas blog.example.com, obtienes algo como:

There isn't a GitHub Pages site here.

Condición 3

El servicio no requiere validación de propiedad del dominio para aceptar el subdominio apuntado por DNS. Esto permite a un atacante registrar un nuevo recurso con ese nombre y automáticamente tomar control del subdominio.

🔧 Ejemplo real:

  • El atacante crea example.github.io → GitHub lo acepta sin verificación.

  • El CNAME ya existe → blog.example.com carga el sitio del atacante.

Condición 4

Aunque el recurso externo fue eliminado, el registro DNS sigue presente, por lo tanto el atacante no necesita acceso a la cuenta original, solo al servicio.

Identificación de recursos vulnerables

subjack -w subdomains.txt -t 50 -timeout 10 -o subdomains_takeovers_vuln_subjack.txt -ssl

nuclei -l subdomains.txt -t takeovers -silent -o subdomains_takeovers_vuln_nuclei.txt

Última actualización

¿Te fue útil?