Enumeración DNS
Investigando sobre como darle algo de interés al tema de DNS encontré un hilo de twitter de mi ex-compañero Gabriel Martí donde enseña a hacer de forma muy sencilla un script de enumeración DNS para automatizar un procedimiento específico.
Como bien dice él, algunas de las herramientas básicas son los comandos nslookup, dig, host. Otras más avanzadas podrían ser dnsenum, nmap, dnsrecon, fierce, Sublist3r, etc. Por no hablar del sinfín de herramientas online, como dnsdumpster, nmmapper, netcraft, etc.
Voy a poner aquí limpio el hilo de Twitter y procederé a añadir alguna cosa más paso por paso:
Preparación de los ficheros
El primer paso es tener una lista de posibles nombres de subdominio a comprobar. La lista nos la podemos generar nosotros mismos, o descargar alguna que ya esté hecha. Siempre la podemos personalizar añadiendo los que creamos necesarios o convenientes. Algunas online son:
Nos las podemos descargar con un simple git clone o de forma mas sencilla con un curl:
curl -o subdomains-top1mil-20000.txt https://raw.githubusercontent.com/theMiddleBlue/DNSenum/master/wordlist/subdomains-top1mil-20000.txt
Preparación del script
Y aquí viene la parte importante. hacer nuestro script en bash. Muy simple, pocas líneas y usando el comando host
que nos permitirá comprobar un nombre de (sub)dominio y nos dice si tiene una dirección IP, en caso de existir. Si no existe, nos devolverá un mensaje de error, evidentemente.

Así que si vamos combinando diferentes nombres de subdominio (los que creas que son habituales o probables), puedes descubrir subdominios de algún dominio que, a priori, no suelen estar anunciados en ningún sitio.
Vamos con el script en si:
Verificaremos que se haya pasado como argumento el nombre de dominio que se desea comprobar. Esto asegura que el script tenga la información mínima necesaria para funcionar.

Se define una variable que indica el fichero de subdominios que se utilizará.

Cada usuario puede usar su propio fichero. Como información adicional, se muestra en pantalla cuántos subdominios se van a comprobar.
Se recorre la lista de palabras del diccionario de posibles subdominios.

Por cada subdominio, el script comprueba si existe y muestra los resultados por pantalla.
Un ejemplo del script funcionando:

Y otro ejemplo:

Resultados
El script devuelve los subdominios encontrados para un dominio determinado.
Es posible que aparezcan subdominios duplicados, debido a:
Listas de subdominios no correctamente “sanitizadas”.
Subdominios que apuntan a un mismo subdominio final.
El script no es perfecto, pero permite obtener información básica de manera rápida.
Script completo
El script completo se encuentra disponible en el GitHub Gist de Gabi Marti para descarga o copia directa:
Mejoras propuestas para el script
Validación de argumentos y manejo de errores
Actualmente, el script verifica si se ha proporcionado un dominio como argumento, pero no valida si el archivo de subdominios existe o si el comando host
está disponible en el sistema.
Optimización del bucle de comprobación
El bucle actual recorre cada subdominio de forma secuencial, lo que puede ser lento. Utilizar xargs
o parallel
permite realizar las comprobaciones en paralelo, acelerando significativamente el proceso.
Filtrado de subdominios duplicados
El script actual puede generar subdominios duplicados debido a la falta de sanitización en la lista de subdominios. Utilizar sort
y uniq
ayuda a eliminar entradas repetidas.
Mejora en la presentación de resultados
Para una mejor legibilidad, es útil mostrar los resultados con un formato claro y ordenado.
Documentación y comentarios
Añadir comentarios explicativos y una sección de ayuda mejora la comprensión y usabilidad del script.
Aceptando estas mejoras, el script queda de la siguiente manera:
#!/bin/bash
# checkDNS.sh
# Script para comprobar subdominios de un dominio específico.
# Uso: ./checkDNS.sh dominio.com
# Validación de argumentos
if [ -z "$1" ]; then
echo "Error: Debes proporcionar un nombre de dominio."
echo "Uso: $(basename "$0") dominio.com"
exit 1
fi
# Verificación de existencia de archivo de subdominios
subfile="subdomain-top.txt"
if [ ! -f "$subfile" ]; then
echo "Error: El archivo de subdominios '$subfile' no existe."
exit 1
fi
# Comprobación de disponibilidad del comando 'host'
if ! command -v host &>/dev/null; then
echo "Error: El comando 'host' no está instalado. Instálalo para continuar."
exit 1
fi
# Presentación de resultados
#esto ejecuta 10 procesos en paralelo con xargs
echo "Subdominios encontrados para $1:"
cat "$subfile" | sort -u | xargs -I % -P 10 bash -c '
dominio_completo="%.$1"
if host "$dominio_completo" &>/dev/null; then
echo "$dominio_completo"
fi
' _ "$1"
Puede mejorarse más incluso por si alguien se anima:
El archivo de subdominios proporcionado debe tener ese nombre concreto, podría ponerse como argumento del script.
Referencia:
Última actualización