Capturar información del servicio de DNS con dnsenum

Capturar información del servicio de DNS con dnsenum

Capturar información del servicio de DNS con dnsenum - Curso hacking con Kali Linux - Capítulos 21, 22 y 23

Empecemos ya con cosas más prácticas. A lo largo de los primeros capítulos te he ido preparando para que te sea más fácil empezar a utilizar cosas de todo tipo. En este capítulo te enseñaré a capturar información de DNS con dnsenum.

dnsenum ya viene instalado en Kali Linux, por lo que un trabajo que te evitas.

Esta potente herramienta puede mostrar mucha información sobre el servicio DNS.

Para mostrar ayuda sobre dnsenum utiliza las opciones -h o --help. Además, puedes utilizar man para ver el manual.

dnsenum -h
dnsenum --help
man dnsenum

El protocolo DNS

Bien, para que entiendas un poco de que va todo esto, te voy a explicar un poco sobre el protocolo DNS.

DNS son las siglas de Domain Name System (sistema de nombres de dominio).

Podemos decir de forma simple que DNS es un traductor de IPs a nombres entendibles por las personas. Es decir, por ejemplo, si voy desde mi navegador a la siguiente URL: www.google.com, en realidad, estoy accediendo a la dirección IP de uno de sus servidores.

Caso práctico

Abres el navegador y te dispones a ir a www.programacionfacil.org.

Los PC se comunican mediante el uso de direcciones IP, por lo tanto, se tiene que traducir el nombre a una dirección IP, la del servidor al cual hace referencia el nombre www.programacionfacil.org.

Lo primero que hace el PC, es consultar a la caché DNS del propio equipo. Si nunca has visitado esa dirección, no la tendrá. Si ya lo has hecho, no tienes que hacer nada más, ya tiene la dirección IP asociada al nombre.

En el caso de que no tenga el registro en la cache DNS, tiene que consultar un resolver, que es un tipo de servidor local que normalmente se corresponde con el ISP (tu proveedor de conexión a internet).

El resolver consulta su caché DNS a ver si alguien más había realizado antes esta consulta. Si no la tiene, debe preguntar a un servidor raíz.

Servidores raíz

Los servidores raíz o root servers son los que están más arriba en la jerarquía DNS.

Son 13 conjuntos de servidores ubicados por todo el mundo y administrados por diferentes organizaciones.

Veamos cuales son con el comando dig.

dig . ANY

En la imagen se muestran las IPv4 e IPv6 de los 13 conjuntos.

Al preguntar el resolver al servidor raíz, este no guarda la información de un dominio específico, pero si la de los servidores TLD (Top Level Domain (dominio de nivel superior)). De modo, puesto que la dirección es .org, se comunica con un servidor TLD que resuelva nombres de dominio .org.

Aquí, tampoco se guarda la dirección de un dominio específico, tiene que preguntar al servidor autoritario correspondiente. Este si que guarda las direcciones IP de servidores específicos.

Pues bien, este servidor si que tiene finalmente la IP correspondiente al nombre del dominio. Se la envía al resolver. Este guarda esa dirección durante un tiempo por si hay futuras consultas, después, le responde con la IP al PC que ha hecho la consulta DNS.

El PC también se guarda la dirección en la cache DNS por si hay futuras consultas.

Hasta que pase un tiempo, el PC va a poder ir a www.programacionfacil.org sin tener que realizar esa consulta, ya que la tiene en su caché.

También, si otro cliente del mismo ISP le hace la misma pregunta al mismo resolver, ya tiene la dirección en su caché, de modo, que no tendrá que ir hasta el servidor autoritario para devolverle la IP.

Registros DNS

Los registros DNS son instrucciones que le indican a un servidor a que dirección IP está asociado un dominio en concreto, así es como se asocia una IP a un nombre DNS.

Sintaxis DNS

Podríamos decir que DNS cuenta con su propio "lenguaje". Se trata de una serie de letras que le dicen que hacer con cada registro.

Registro A: este tipo de registro, relaciona un nombre de dominio con la dirección IP física de un equipo en el que se alojan los servicios de dicho dominio.

Ejemplo de Registro A

Nombre: www.ejemplo.com

Valor: IPv4 (100.110.65.115)

Registro AAAA: lo mismo que A, pero para dirección IPv6.

Ejemplo de Registro AAAA

Nombre: www.ejemplo.com

Valor: IPv6 (ff42:8849:1b70:f7a9:eed1:7065:0d30:5cee)

Registro CNAME: canonic name o nombre canónico en español es el registro que vincula un nombre de alias con otro nombre de dominio. Por ejemplo, el nombre del servicio www.ejemplo.com para que apunte al dominio canónico "ejemplo.com".

Registro MX: servidor de correo electrónico.

Registro NS: name server o servidor de nombres en español, determinan los servidores de DNS autorizados para el dominio indicado.

Registro TXT: sirve para añadir notas de texto en el registro.

Hay más registros, pero no los vamos a ver todos.

DNS Enumeration

La enumeración de DNS es el proceso de localizar todos los servidores DNS y los registros correspondientes de una organización

Vamos a utilizar una herramienta escrita en Perl, llamada dnsenum, ya instalada en Kali Linux. Más fácil de conseguir imposible.

La transferencia de zona

Una transferencia de zona es un tipo de transacción DNS para poder replicar bases de datos con registros entre servidores DNS.

La información en cada transferencia de zona puede entregarnos información de todos los dominios y/o servidores de cada base de datos de los registros en el servidor DNS. Esto es peligroso, ya que podemos tener datos accesibles a un atacante que esté recopilando información.

¿Cómo funciona la transferencia de zona?

De forma simple, tenemos un servidor principal que contiene la información. Cuando creamos un servicio que siempre debe estar disponible, es importante tener uno o varios respaldos, para no perder la información y tener el servicio siempre disponible.

Al hacer la transferencia de zona, se replica el servidor principal en uno o varios secundarios, los cuales, se irán actualizando a medida que el principal vaya recibiendo cambios.

Seguridad con la transferencia de zona

Una configuración de transferencia de zona preparada para permitir transferencias de zona a cualquier servidor, puede acabar dando los datos a un servidor DNS sin autorización.

Al hacer esto, el atacante puede recopilar un mapa de los servidores de un sistema completo y tener ya equipos por los que empezar un ataque.

Realizar una recopilación de datos DNS con DNSenum

Voy a realizar la recopilación con un sistema vulnerable, con la transferencia de zona habilitada para cualquiera.

Fases DNSenum

  1. Obtener el registro A.
  2. Obtener los servidores de nombres.
  3. Obtener los registros MX.
  4. Realizar consultas AXFR en los servidores de nombres (las consultas para la transferencia de zona).
  5. Busca nombres de servidores y subdominios con Google (si pruebas muy seguido, Google te detecta y te dice que están teniendo un tráfico inusual).
  6. Prueba de encontrar más subdominios mediante un diccionario en un archivo de texto. Por defecto, tenemos dns.txt, pero podemos añadir uno propio.
  7. Calcula los rangos de redes de dominio de clase C de los resultados y hace un whois (que aún no hemos visto).
  8. Realiza consultas inversas (con IP en lugar de nombre DNS) sobre los rangos de red (clase C y/o whois a los rangos de red).
  9. Escribe en el archivo "domain_ips.txt resultados de bloques de IP no contiguos.

En el manual de DNSEnum podrás ver con calma todas las opciones que tiene. No las puedo detallar todas aquí, ya que quedará un capítulo muy largo y además, debes empezar a leer (si no lo haces ya) manuales, referencias y demás para ir progresando.

Algunas opciones de DNSEnum

--dnserver

Se utiliza para realizar consultas A, NS, MX y AXFR.

--noreverse

Se salta la comprobación de resolución inversa (IP a nombre). Esto es porque en rangos de red muy grandes, puede tardar mucho. A veces queremos desactivarlo.

-v o --verbose

Nos revela todos los errores que va encontrando.

-p o --pages

El número de páginas de búsqueda de Google en el scraping (raspado). 20 páginas por defecto.

-s o --scrap

El número máximo de subdominios que serán raspados (scraped) por Google.

Estas operaciones en Google, son las que hacen que nos detecten por enviar solicitudes automatizadas.

Lo que vamos a utilizar en esta ocasión con DNSenum es el siguiente comando:

dnsenum -v nombre_dominio

Nos devuelve una gran cantidad de información sobre el sistema que tiene montado el dominio:

escaneo con dnsenum
transferencia de zona no segura

Sale mucho más, pero no lo voy a poner todo. Saltemos a la parte de la fuerza bruta. Gracias a la opción "-v" o "--verbose" puedo ver como va yendo el ataque por fuerza bruta. Todo lo que sale en rojo son errores, subdominios que prueba y no existen.

ataque fuerza bruta dnsenum

En el título del ataque te indica la ruta del archivo que está utilizando.

diccionario dnsenum

Lo que hace, es probar cada una de estas palabras (algunas muy comunes en nombres de subdominio) y el nombre del dominio "subdominio.dominio". Si existe por casualidad, encontramos el subdominio. Si no, nos da el error "NXDOMAIN".

Finalmente, nos da los rangos de redes de clase C y hace las consultas inversas. En mi caso ha tenido que realizar más de 2000. Por este motivo, puede que quieras a veces deshabilitar esta opción con "--noreverse".

rangos clase c dnsenum

¿Cómo aseguro la transferencia de zona?

Llegamos a lo importante, que es proteger el sistema vulnerable.

Te voy a hablar del servicio de Linux bind9 que habitualmente es con lo que se crean los servidores DNS.

Este servicio cuenta con unos archivos de configuración.

archivos servidor dns bind9

En concreto, nos interesa el archivo named.conf.options. Se puede indicar en el allow-transfer una o varias IP de los equipos que queremos permitir para la transferencia de zona.

Las opciones de options{} son globales, es decir, afectan a todos los archivos. Si dejamos aquí allow-transfer {none;} lo que va a ocurrir es que por defecto se deniegan todas las transferencias de zona a otros servidores.

options {
        directory "/var/cache/bind";
        forwarders {
                8.8.8.8;
                8.8.4.4;
         };
        dnssec-validation auto;
        listen-on-v6 { any; };
        allow-transfer { none; };
};

Cuando trabajamos con DNS, nos encontramos con servidores primarios y secundarios, entre otros.

Para configurarlos y administrarlos, tenemos que crear lo que se llaman zonas. Cada uno tendrá su zona.

Supongamos que tenemos dos servidores. Uno primario (master) y uno secundario (slave) y lo que queremos, es que el servidor principal se replique en el secundario, así tenemos respaldo.

Periódicamente, este servidor secundario va a realizar consultas AXFR para la transferencia de zona, es decir, para ver si hay algo nuevo y actualizarse.

Si tenemos options{} con el allow-transfer { none; }, no va a ser posible esta transferencia, ya que la denegamos globalmente. Entonces, podemos permitir solo a nuestro segundo servidor realizar dicha transferencia de zona. Indicando en la zona del servidor principal que permitimos cierta IP (la del servidor secundario). Al hacer esto, creamos una excepción a la regla global.

include "/etc/bind/zones.rfc1918";
zone "programacionfacil.org" in {
   type master;
   file "db.programacionfacil.org";
   allow-transfer { 192.168.1.101; };
};

El resultado a esto, es que cuando intentas hacer un DNSenum a un dominio que tiene esta seguridad, no descubres nada relevante. Te devuelve un NOAUTH (no autorizado).

noauth dns axfr

¿No sabes nada o poco de los servidores DNS? Si quieres ampliar tus conocimientos y crearte tu propio servidor DNS, te recomiendo este sitio web tan completo donde te enseñarán todo lo necesario: fpgenred.es.

Si lo tuyo es pasar directamente a la acción, hay muchísimos tutoriales sobre la creación de estos servidores tanto para Linux como para Windows Server.

Por desgracia, no puede explicar absolutamente de todo para este curso, ya que solo para profundizar en el tema de DNS nos podríamos tirar más de 10 o 15 capítulos.

Si quieres saber más sobre hacking y sobre Linux, no te pierdas estas categorías.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

curso de Python Entrada anterior Tipos de datos primitivos, conversiones y errores – 100 días de Python #2
Entrada siguiente Las direcciones IPv4