Page cover

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

  1. 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.

  1. 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.

  1. 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.

  1. Mejora en la presentación de resultados

Para una mejor legibilidad, es útil mostrar los resultados con un formato claro y ordenado.

  1. 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