Novedades

DNS Tunneling

Por Joaquin Lanfranconi - Cybersecurity Researcher en BASE4 Security

Seguramente alguna vez estuviste en un aeropuerto, en un café, avión o un hotel donde había una red WiFi que no requería una contraseña para conectarse, pero al momento de navegar pedía una suscripción o algún tipo de pago, derivando tu navegación a lo que se conoce como portal cautivo. Esto es muy común dado que cada vez más cosas requieren una conexión a Internet. Muchas veces los proveedores bloquean todo el tráfico entrante y saliente si no estás autorizado o autenticado, pero suelen permitir la resolución DNS (Sistema de Nombres de Dominio) que convierte una dirección recordable por un humano a la dirección IP asociada a la misma y viceversa. Luego, el proveedor decide si bloquear o no el tráfico.

En este escenario, sería interesante poder tunelizar el tráfico de navegación a través del protocolo DNS, y de esta manera tener acceso a Internet. Esta técnica se denomina DNS Tunneling. Como es de esperar, navegar así es lento como si se tratara de un módem con conexión Dial Up, pero aún así no deja de ser cuanto menos curioso y controversial, dado que es un protocolo que no ha sido diseñado para la transferencia de datos más allá de la resolución de nombres.

Cómo se logra esto

Primero debemos encontrarnos dentro de una red con portal cautivo. Para comprobar que es posible aplicar esta técnica, podemos realizar una solicitud de ECHO Request (por ejemplo, un ping a google.com o cualquier dominio. Si recibimos la dirección IP asociada a ese dominio, podemos seguir con este ataque. En caso contrario, muy posiblemente el proveedor haya bloqueado este tipo de tráfico también

Una vez que hayamos comprobado esto, podemos intentar a explotar en 6 pasos:

1. Ante todo, debemos contar con un dominio al cual podamos modificar el registro "A", que asigna el nombre del dominio a la IP de nuestro servidor y el registro "NS", también conocido como registro de servidor de nombres (del inglés Name Server record), el cual asigna el nombre del dominio a una lista de servidores DNS, asignado al registro "A", que es nuestro dominio. Pasando en limpio, los registros deben quedar configurados de la siguiente forma:

  • Registro A = dnsa.midominio.net -> la IP pública de la computadora en casa
  • Registro NS = p.midominio.net -> dnsa.midominio.net

Vale destacar que si utilizamos un subdominio corto como por ejemplo "p", nos posibilita empaquetar más datos por cada petición.

2. Luego debemos configurar el dispositivo que actuará cómo servidor, que puede ser una computadora en nuestras casas con acceso a internet o en la nube.

Para realizar esto vamos a utilizar la herramienta "iodine", que funciona muy eficientemente con este tipo de técnicas, y deberá estar ejecutándose en nuestro servidor a la hora de realizar las pruebas, con el siguiente comando:

usuario@server$ sudo iodined -c -f 10.0.0.1 -P passwordsegura123 p.midominio.net

"-f" determina la red interna que se va a utilizar. Si la red 10.0.0.0 ya se encuentra en uso, puedes utilizar cualquier otra red interna (Ejemplo: 172.16.0.0).

"-P" es la contraseña que se pedirá para conectarse al servicio.

"p.midominio.net" es el dominio configurado anteriormente.

3. Una vez tengamos iodine ejecutándose en el servidor, podemos utilizar esta herramienta “Check-it” del mismo desarrollador para corroborar que todo está configurado correctamente.

4. Nuestra computadora, dispositivo móvil (o hasta una Raspberry Pi) actuará cómo cliente. Debemos encontrarnos en la red con el portal cautivo y dentro de una terminal nos conectaremos a nuestro servidor con iodine, con el comando:

usuario@notebook$ iodine -r -f -L0 -P passwordsegura123 p.midominio.net

Así, iodine intentará conectarse a nuestro servidor y encontrará la forma de empaquetado más eficiente.

5. Ya nos encontraremos en la misma subred que nuestro servidor, por lo que simplemente deberíamos conectarnos a él mediante SSH para realizar un túnel SOCKS y enviar todo el tráfico de nuestro navegador a través suyo.

Un ejemplo sería el siguiente:

usuario@notebook$ ssh -D 8080 root@10.0.0.1 -N

Lógicamente la subred varía según la utilizada en el comando del paso 2.

6. ¡Listo! Ya estamos enviando todo el tráfico mediante DNS Tunneling, solamente queda configurar nuestro navegador para que utilice nuestro servidor remoto cómo proxy

Si queremos comprobar que todo funciona como es esperable, podemos utilizar el siguiente comando (para distribuciones basadas en Linux):

usuario@notebook$ curl api.ipify.org --socks4 127.0.0.1:8080

Con esto deberíamos recibir una respuesta (lo cual significa que ya tenemos conexión con internet) y ver la IP pública de nuestro servidor remoto.

El enfoque de este post, se basa en realizar el salteo (bypass) del portal cautivo, con el fin de obtener una conexión a internet, pero los casos de usos para esta técnica son muchos, desde bypass de firewalls, hasta dispositivos orientados a la prevención de fuga de datos, canales de comunicación no supervisado en la red de una organización, y mucho más.