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
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
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:
El subdominio existe y apunta a un servicio externo.
El recurso en el proveedor externo no está activo o no ha sido creado.
El proveedor permite reclamar ese nombre sin verificación adicional.
El DNS sigue apuntando al servicio (registro activo).
Si se apunta un wildcard a un servicio (ej: *.example.com
→ myapp.herokuapp.com
) y no se reclaman explícitamente los subdominios, el atacante puede crear uno arbitrario.
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:
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?