# DNS Port (53)

## Introduction

El **Domain Name System (DNS)** traduce nombres de dominio (por ejemplo, _hackthebox.com_) a direcciones IP numéricas (por ejemplo, _104.17.42.72_). DNS utiliza principalmente UDP/53, pero con el tiempo dependerá más de TCP/53.

Desde el inicio, DNS fue diseñado para usar tanto UDP como TCP en el puerto 53, siendo UDP el predeterminado. Si no puede comunicarse por UDP, recurre a TCP, generalmente cuando el tamaño del paquete es demasiado grande para enviarse en un solo paquete UDP.

Como casi todas las aplicaciones de red usan DNS, los ataques contra servidores DNS representan una de las amenazas más comunes y significativas hoy en día.

***

## Enumeration

DNS contiene información interesante sobre una organización. Como se mencionó en la sección de **Domain Information** del módulo de **Footprinting**, podemos entender cómo opera una empresa, los servicios que ofrece, así como identificar proveedores externos como los de correo electrónico.

Las opciones `-sC` (scripts por defecto) y `-sV` (escaneo de versiones) de **Nmap** pueden utilizarse para realizar una **enumeración inicial** sobre los servidores DNS objetivo:

```bash
gzzcoo@htb[/htb]$ nmap -p53 -Pn -sVC 10.10.110.213

Starting Nmap 7.80 ( https://nmap.org ) at 2020-10-29 03:47 EDT
Nmap scan report for 10.10.110.213
Host is up (0.017s latency).

PORT    STATE  SERVICE     VERSION
53/tcp  open   domain      ISC BIND 9.11.3-1ubuntu1.2 (Ubuntu Linux)
```

***

## DNS Zone Transfer

Una **zona DNS** es una porción del espacio de nombres DNS que está gestionada por una organización o administrador específico. Dado que DNS está compuesto por múltiples zonas, los **servidores DNS** utilizan las **transferencias de zona (zone transfers)** para copiar parte de su base de datos a otro servidor DNS.

A menos que un servidor DNS esté configurado correctamente (limitando qué IPs pueden realizar una transferencia de zona), **cualquiera puede solicitar una copia de la información de la zona**, ya que estas transferencias **no requieren autenticación**. Aunque el servicio DNS usa normalmente el puerto UDP, al realizar transferencias de zona utiliza **TCP** para asegurar una transmisión fiable.

Un atacante puede aprovechar esta vulnerabilidad para obtener información detallada del espacio de nombres DNS de la organización objetivo, **ampliando la superficie de ataque**.

Para explotarlo, podemos usar la utilidad `dig` con el tipo de consulta `AXFR` para intentar **volcar todas las entradas DNS** desde un servidor vulnerable:

**DIG - AXFR Zone Transfer**

```bash
gzzcoo@htb[/htb]$ dig AXFR @ns1.inlanefreight.htb inlanefreight.htb

; <<>> DiG 9.11.5-P1-1-Debian <<>> axfr inlanefrieght.htb @10.129.110.213
;; global options: +cmd
inlanefrieght.htb.         604800  IN      SOA     localhost. root.localhost. 2 604800 86400 2419200 604800
inlanefrieght.htb.         604800  IN      AAAA    ::1
inlanefrieght.htb.         604800  IN      NS      localhost.
inlanefrieght.htb.         604800  IN      A       10.129.110.22
admin.inlanefrieght.htb.   604800  IN      A       10.129.110.21
hr.inlanefrieght.htb.      604800  IN      A       10.129.110.25
support.inlanefrieght.htb. 604800  IN      A       10.129.110.28
inlanefrieght.htb.         604800  IN      SOA     localhost. root.localhost. 2 604800 86400 2419200 604800
;; Query time: 28 msec
;; SERVER: 10.129.110.213#53(10.129.110.213)
;; WHEN: Mon Oct 11 17:20:13 EDT 2020
;; XFR size: 8 records (messages 1, bytes 289)
```

**FIERCE - AXFR Zone Transfer**

Herramientas como [**Fierce**](https://github.com/mschwager/fierce) también pueden utilizarse para enumerar todos los servidores DNS del dominio raíz y escanear si es posible realizar una transferencia de zona DNS:

```bash
gzzcoo@htb[/htb]# fierce --domain zonetransfer.me

NS: nsztm2.digi.ninja. nsztm1.digi.ninja.
SOA: nsztm1.digi.ninja. (81.4.108.41)
Zone: success
{<DNS name @>: '@ 7200 IN SOA nsztm1.digi.ninja. robin.digi.ninja. 2019100801 '
               '172800 900 1209600 3600\n'
               '@ 300 IN HINFO "Casio fx-700G" "Windows XP"\n'
               '@ 301 IN TXT '
               '"google-site-verification=tyP28J7JAUHA9fw2sHXMgcCC0I6XBmmoVi04VlMewxA"\n'
               '@ 7200 IN MX 0 ASPMX.L.GOOGLE.COM.\n'
               '@ 7200 IN MX 10 ALT1.ASPMX.L.GOOGLE.COM.\n'
               '@ 7200 IN MX 10 ALT2.ASPMX.L.GOOGLE.COM.\n'
               '@ 7200 IN MX 20 ASPMX2.GOOGLEMAIL.COM.\n'
               '@ 7200 IN MX 20 ASPMX3.GOOGLEMAIL.COM.\n'
               '@ 7200 IN MX 20 ASPMX4.GOOGLEMAIL.COM.\n'
               '@ 7200 IN MX 20 ASPMX5.GOOGLEMAIL.COM.\n'
               '@ 7200 IN A 5.196.105.14\n'
               '@ 7200 IN NS nsztm1.digi.ninja.\n'
               '@ 7200 IN NS nsztm2.digi.ninja.',
 <DNS name _acme-challenge>: '_acme-challenge 301 IN TXT '
                             '"6Oa05hbUJ9xSsvYy7pApQvwCUSSGgxvrbdizjePEsZI"',
 <DNS name _sip._tcp>: '_sip._tcp 14000 IN SRV 0 0 5060 www',
 <DNS name 14.105.196.5.IN-ADDR.ARPA>: '14.105.196.5.IN-ADDR.ARPA 7200 IN PTR '
                                       'www',
 <DNS name asfdbauthdns>: 'asfdbauthdns 7900 IN AFSDB 1 asfdbbox',
 <DNS name asfdbbox>: 'asfdbbox 7200 IN A 127.0.0.1',
 <DNS name asfdbvolume>: 'asfdbvolume 7800 IN AFSDB 1 asfdbbox',
 <DNS name canberra-office>: 'canberra-office 7200 IN A 202.14.81.230',
 <DNS name cmdexec>: 'cmdexec 300 IN TXT "; ls"',
 <DNS name contact>: 'contact 2592000 IN TXT "Remember to call or email Pippa '
                     'on +44 123 4567890 or pippa@zonetransfer.me when making '
                     'DNS changes"',
 <DNS name dc-office>: 'dc-office 7200 IN A 143.228.181.132',
 <DNS name deadbeef>: 'deadbeef 7201 IN AAAA dead:beaf::',
 <DNS name dr>: 'dr 300 IN LOC 53 20 56.558 N 1 38 33.526 W 0.00m',
 <DNS name DZC>: 'DZC 7200 IN TXT "AbCdEfG"',
 <DNS name email>: 'email 2222 IN NAPTR 1 1 "P" "E2U+email" "" '
                   'email.zonetransfer.me\n'
                   'email 7200 IN A 74.125.206.26',
 <DNS name Hello>: 'Hello 7200 IN TXT "Hi to Josh and all his class"',
 <DNS name home>: 'home 7200 IN A 127.0.0.1',
 <DNS name Info>: 'Info 7200 IN TXT "ZoneTransfer.me service provided by Robin '
                  'Wood - robin@digi.ninja. See '
                  'http://digi.ninja/projects/zonetransferme.php for more '
                  'information."',
 <DNS name internal>: 'internal 300 IN NS intns1\ninternal 300 IN NS intns2',
 <DNS name intns1>: 'intns1 300 IN A 81.4.108.41',
 <DNS name intns2>: 'intns2 300 IN A 167.88.42.94',
 <DNS name office>: 'office 7200 IN A 4.23.39.254',
 <DNS name ipv6actnow.org>: 'ipv6actnow.org 7200 IN AAAA '
                            '2001:67c:2e8:11::c100:1332',
...SNIP...
```

***

## Domain Takeovers & Subdomain Enumeration

La **toma de dominio (domain takeover)** consiste en registrar un nombre de dominio inexistente para tomar control sobre otro dominio. Si un atacante encuentra un dominio expirado, puede reclamarlo para realizar ataques como alojar contenido malicioso en un sitio web o enviar correos de phishing aprovechando ese dominio ya reclamado.

La toma de control también es posible con subdominios, lo que se conoce como **subdomain takeover**. Un registro **CNAME** en DNS se usa para apuntar un dominio a otro. Muchas organizaciones utilizan servicios de terceros como AWS, GitHub, Akamai, Fastly y otras CDNs para alojar contenido. En estos casos, se suele crear un subdominio que apunte a dichos servicios. Por ejemplo

```bash
sub.target.com.   60   IN   CNAME   anotherdomain.com
```

El nombre de dominio `sub.target.com` utiliza un registro CNAME que apunta a `anotherdomain.com`. Si `anotherdomain.com` expira y queda libre para ser registrado, cualquier persona puede reclamarlo. Dado que el servidor DNS de `target.com` aún tiene ese registro CNAME apuntando allí, quien registre `anotherdomain.com` tendrá **control total sobre `sub.target.com`** hasta que el registro DNS sea actualizado.

***

#### Subdomain Enumeration

Antes de realizar un **subdomain takeover**, debemos enumerar los subdominios del dominio objetivo utilizando herramientas como [**Subfinder**](https://github.com/projectdiscovery/subfinder). Esta herramienta recopila subdominios desde fuentes abiertas como [DNSdumpster](https://dnsdumpster.com/). También se pueden usar otras herramientas como [**Sublist3r**](https://github.com/aboul3la/Sublist3r) para realizar fuerza bruta de subdominios utilizando una wordlist predefinida:

```bash
gzzcoo@htb[/htb]$ ./subfinder -d inlanefreight.com -v       
                                                                       
        _     __ _         _                                           
____  _| |__ / _(_)_ _  __| |___ _ _          
(_-< || | '_ \  _| | ' \/ _  / -_) '_|                 
/__/\_,_|_.__/_| |_|_||_\__,_\___|_| v2.4.5                                                                                                                                                                                                                                                 
                projectdiscovery.io                    
                                                                       
[WRN] Use with caution. You are responsible for your actions
[WRN] Developers assume no liability and are not responsible for any misuse or damage.
[WRN] By using subfinder, you also agree to the terms of the APIs used. 
                                   
[INF] Enumerating subdomains for inlanefreight.com
[alienvault] www.inlanefreight.com
[dnsdumpster] ns1.inlanefreight.com
[dnsdumpster] ns2.inlanefreight.com
...snip...
[bufferover] Source took 2.193235338s for enumeration
ns2.inlanefreight.com
www.inlanefreight.com
ns1.inlanefreight.com
support.inlanefreight.com
[INF] Found 4 subdomains for inlanefreight.com in 20 seconds 11 milliseconds
```

***

#### Subbrute

Una excelente alternativa es una herramienta llamada **Subbrute**. Esta herramienta nos permite usar _resolvers_ definidos por nosotros mismos y realizar ataques de fuerza bruta DNS puros, ideal para pruebas internas en máquinas sin acceso a Internet.

```bash
gzzcoo@htb[/htb]$ git clone https://github.com/TheRook/subbrute.git >> /dev/null 2>&1
gzzcoo@htb[/htb]$ cd subbrute
gzzcoo@htb[/htb]$ echo "ns1.inlanefreight.com" > ./resolvers.txt
gzzcoo@htb[/htb]$ ./subbrute inlanefreight.com -s ./names.txt -r ./resolvers.txt

Warning: Fewer than 16 resolvers per process, consider adding more nameservers to resolvers.txt.
inlanefreight.com
ns2.inlanefreight.com
www.inlanefreight.com
ms1.inlanefreight.com
support.inlanefreight.com

<SNIP>
```

***

A veces, las configuraciones físicas internas están mal protegidas, lo que podemos aprovechar para subir nuestras herramientas desde un USB. Otro escenario sería que hayamos llegado a un host interno haciendo pivoting y queramos trabajar desde ahí. Por supuesto, hay otras alternativas, pero no está de más conocer diferentes formas y posibilidades.

La herramienta ha encontrado cuatro subdominios asociados con **inlanefreight.com**. Usando el comando `nslookup` o `host`, podemos enumerar los registros **CNAME** de esos subdominios.

```bash
gzzcoo@htb[/htb]$ host support.inlanefreight.com

support.inlanefreight.com is an alias for inlanefreight.s3.amazonaws.com
```

El subdominio `support` tiene un registro alias apuntando a un **bucket de AWS S3**. Sin embargo, al acceder a la URL `https://support.inlanefreight.com`, se muestra un error **NoSuchBucket**, lo que indica que este subdominio podría ser vulnerable a un **Subdomain Takeover**.

Ahora, podríamos **tomar el control del subdominio** creando un **bucket S3 en AWS con el mismo nombre** del subdominio: `support.inlanefreight.com`.

<figure><img src="https://228013500-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fnht2ZrhktWnDwC5LAkip%2Fuploads%2Fq0wIYLfINqR4zIa6KhWE%2Fs3.png?alt=media&#x26;token=c5c43a8d-1070-4223-b875-6be9f8456471" alt=""><figcaption></figcaption></figure>

El repositorio [**can-i-take-over-xyz**](https://github.com/EdOverflow/can-i-take-over-xyz) también es una excelente referencia para identificar vulnerabilidades de **subdomain takeover**. Este recurso indica si los servicios utilizados por el subdominio objetivo son susceptibles de ser tomados, y proporciona guías para evaluar si realmente existe la vulnerabilidad.

Es muy útil para saber, por ejemplo, si un servicio como **GitHub Pages**, **Heroku**, **AWS S3**, entre otros, permite el **takeover** cuando un recurso ha sido eliminado, pero el subdominio sigue apuntando hacia él.

***

## DNS Spoofing

El **DNS spoofing**, también conocido como **envenenamiento de caché DNS (DNS Cache Poisoning)**, es un ataque que consiste en alterar registros DNS legítimos con información falsa para redirigir el tráfico hacia sitios fraudulentos. Algunos ejemplos de cómo se puede llevar a cabo este ataque son:

* **Ataque Man-in-the-Middle (MITM):** El atacante intercepta la comunicación entre un usuario y un servidor DNS para redirigir al usuario a un destino fraudulento en lugar del legítimo.
* **Explotación de vulnerabilidades en el servidor DNS:** Si un atacante logra comprometer un servidor DNS, podría modificar sus registros y redirigir el tráfico de múltiples usuarios hacia sitios maliciosos.

**Local DNS Cache Poisoning**

Desde una red local, un atacante también puede llevar a cabo un **DNS Cache Poisoning** utilizando herramientas de MITM como **Ettercap** o **Bettercap**.

Para explotar esta técnica con **Ettercap**, primero debemos editar el archivo `/etc/ettercap/etter.dns` para mapear el nombre de dominio que se quiere suplantar (por ejemplo, `inlanefreight.com`) hacia la dirección IP del atacante (por ejemplo, `192.168.225.110`):

```bash
gzzcoo@htb[/htb]$ cat /etc/ettercap/etter.dns

inlanefreight.com      A   192.168.225.110
*.inlanefreight.com    A   192.168.225.110
```

A continuación, iniciamos la herramienta **Ettercap** y escaneamos los hosts activos en la red navegando a **Hosts > Scan for Hosts**. Una vez completado el escaneo, añadimos la dirección IP de la máquina víctima (por ejemplo, `192.168.152.129`) como **Target1**, y la IP de la puerta de enlace (por ejemplo, `192.168.152.2`) como **Target2**.

<figure><img src="https://228013500-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fnht2ZrhktWnDwC5LAkip%2Fuploads%2FzcSdpj6yGcTyjj0s2vzj%2Ftarget.png?alt=media&#x26;token=775ae9ad-8c68-45d1-8b36-801d4a5c891d" alt=""><figcaption></figcaption></figure>

Luego activamos el ataque `dns_spoof` desde **Plugins > Manage Plugins**. Esto provocará que la máquina víctima reciba respuestas DNS falsas, haciendo que el dominio `inlanefreight.com` se resuelva a la dirección IP `192.168.225.110`:

<figure><img src="https://228013500-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fnht2ZrhktWnDwC5LAkip%2Fuploads%2FACX8W3IKEtz1q8oWxRKA%2Fetter_plug.webp?alt=media&#x26;token=59efc32f-7fda-4a3d-a1f0-2e192c8773bd" alt=""><figcaption></figcaption></figure>

Después de un spoofing exitoso, si un usuario víctima desde la IP `192.168.152.129` visita `inlanefreight.com` en su navegador, será redirigido a una **página falsa** alojada en `192.168.225.110`.

<figure><img src="https://228013500-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fnht2ZrhktWnDwC5LAkip%2Fuploads%2Fe73m4RioYJ0y2hIpIXNC%2Fetter_site.webp?alt=media&#x26;token=fef11a9c-f006-4d9f-8c20-f32b515a0567" alt=""><figcaption></figcaption></figure>

Además, un simple **ping** desde la máquina víctima mostrará que `inlanefreight.com` ahora se resuelve a la IP maliciosa:

```sh
C:\>ping inlanefreight.com

Pinging inlanefreight.com [192.168.225.110] with 32 bytes of data:
Reply from 192.168.225.110: bytes=32 time<1ms TTL=64
Reply from 192.168.225.110: bytes=32 time<1ms TTL=64
Reply from 192.168.225.110: bytes=32 time<1ms TTL=64
Reply from 192.168.225.110: bytes=32 time<1ms TTL=64

Ping statistics for 192.168.225.110:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
```
