Navegar gratis por una WiFi de pago mediante un túnel DNS con dns2tcp

Normalmente en una red WiFi de pago, cuando no estamos logeados en un portal cautivo con un usuario válido, tenemos el tráfico restringido.
Aún así y en la mayoría de los casos, podemos hacer un túnel y navegar a través del protocolo DNS debido a que el servidor DNS que automáticamente nos asigna el DHCP puede hacer consultas hacia Internet.
Podemos comprobar si podemos aprovechar esta característica en nuestra WiFi:

nslookup www.google.com

Si recibimos respuesta, podemos aprovechar esta vulnerabilidad y encapsular nuestro tráfico en DNS. Para llevar a cabo esta tarea, vamos a usar dns2tcp.

Prerrequisitos:

- Una máquina corriendo el servidor dns2tcp
- Un nombre de dominio.

Servidor dns2tcp

Podemos tener corriendo el servicio en local simplemente en nuestro ordenador, añadiendo una regla en el NAT para el puerto 53, pero voy a explicar como hacerlo en una máquina de Amazon AWS, que además es gratis durante un año.

Vamos a: https://aws.amazon.com/ y buscamos el plan gratuito de hosting de una instancia EC2 durante un año.
Una vez nos logeamos, vamos a Services > Cloud Computing y elegimos EC2.


Después vamos al panel 'Instances' y damos a 'launch instance'. Yo he seleccionado Ubuntu Server de tipo t2.tiny. La máquina no es muy potente pero es gratis 750 horas al mes durante un año.

Cuando creamos la instancia nos dan una clave para conectarnos por ssh con la opcion -i.
Ahora que tenemos la instancia, podemos ver la información relevante:



Vemos nuestra ip pública y Security Groups, que es donde determinamos nuestras reglas de entrada y salida, ya que nuestra máquina tiene una ip privada.
Abrimos el puerto 53, dentro del Security Group que tenemos asignado a nuestra instancia:


Nos conectamos por ssh y comprobamos que tenemos el puerto 53 abierto al exterior:


Ahora descargamos el paquete dns2tcp:

$ apt-get install dns2tcp

Antes de explicar la configuración del servidor dns2tcp, vamos a ver la configuración del dominio, ya que así va a ser más fácil entenderlo.

Nombre de dominio

Vamos a la página que más nos guste que nos permita adquirir un nombre de dominio y administrar los DNS y adquirimos un dominio. En este caso he escogido goddady.
Una vez tenemos el dominio, vamos al apartado administar dns y necesitaremos:
  • Un registro A apuntando a la máquina donde esta corriendo el servidor dns2tcp.
  • Un registro NS para un subdominio apuntando a la maquina corriendo el servidor dns2tcp.

En mi caso, esos son los dos registros que he añadido para el dominio ad0n.com.
El registro NS tunnel dns2tpcd.ad0n.com tiene especial importancia, es una de las claves para que ésto funcione y quiere decir que cuando se haga una consulta DNS a tunnel.ad0n.com, el DNS autoritativo para ese subdominio, es decir, el que va a responder, será dns2tcpd.ad0n.com, osea, donde está alojado nuestro servidor DNS fake.

Podemos comprobar que lo tenemos todo bien configurado preguntando a un servidor autoritativo del dominio ad0n.com por el subdominio tunnel.ad0n.com:

dig @ns46.domaincontrol.com tunnel.ad0n.com


Pasamos a ver la configuración del cliente y servidor dns2tcp.

Cliente/Servidor dns2tcp

Servidor:

Abrimos el fichero /etc/dns2tcpd.conf y lo configuramos de la siguiente manera:


Escuchamos en 0.0.0.0 para que sea accesible desde el exterior y en domain ponemos el subdominio que va a delegar en nuestro servidor DNS.
El campo key es opcional pero servirá si no queremos que todo el mundo pueda usar nuestro servidor DNS sin clave.

Lanzamos el servidor:

$ dns2tcpd -F -d2 -f /etc/dns2tcpd.conf


Cliente

Comprobamos los servicios disponibles del servidor:

$ dns2tcpc -z tunnel.ad0n.com -k 1234



Levantamos el túnel en el puerto 3333 solicitando el recurso ssh.

$ dns2tcpc -z tunnel.ad0n.com -k 1234 -l 3333 -r ssh

Nos conectamos por ssh al servidor y hacemos bind al puerto 1080, que será el puerto que usemos en el navegador para nuestro proxy socks.

$ ssh -i dns2tcpd.pem ubuntu@localhost -p 3333 -D 1080


Listo, ya podemos navegar a través de DNS.
La primera vez se tarda bastante en configurar todo, pero a partir de aquí, lo único que se necesitaría son estos dos comandos:

$ dns2tcpc -z tunnel.ad0n.com -k 1234 -l 3333 -r ssh
$ ssh -i dns2tcpd.pem ubuntu@localhost -p 3333 -D 1080

y configurar el proxy el navegador y a saltarse los portales cautivos en un momento ;).

Comentarios

  1. Muy currado, thanks for the info! :D

    ResponderEliminar
  2. no tiene gracia. Si el portal bloquea las consulta al 53, permitiendo solamente sus dns (ej 8.8.8.8 8.8.4.4 y denegar el resto en el firewall) entonces bye bye al tunel dns2tcpc

    ResponderEliminar
    Respuestas
    1. "... Podemos comprobar si podemos aprovechar esta característica en nuestra WiFi:

      nslookup www.google.com

      Si recibimos respuesta, podemos aprovechar esta vulnerabilidad y encapsular nuestro tráfico en DNS. Para llevar a cabo esta tarea, vamos a usar dns2tcp.... "


      primer apartado

      Eliminar
  3. ja. bloquear el puerto de destino y chao bambino

    ResponderEliminar
  4. puedes usar el puerto 8888 que tambien es escuchado por dns en algunos servidores dns publicos lol

    ResponderEliminar
  5. No funciona, trato de hacerlo con el portal cautivo de pfsense pero no me muestra las conexiones disponibles, de hecho para que las muestre tengo que desactivar el portal cautivo desde el pfsense y poner la sintaxis dns2tcpc -z tunnel.domain.com server.domain.com porque si no espcifico el dominio no funciona

    ResponderEliminar
  6. Me dice que la puerta de enlace no escucha las peticiones por lo que no se puede resolver el dominio

    ResponderEliminar
  7. Lo de bloquear el destino, esta bien como dicen algunos, todo está en que se den cuenta que el tunnel está hecho, lo eh tenido abierto con empresas de telecomunicaciones grandes por mucho tiempo y ni idea han tendido de eso.

    ResponderEliminar

Publicar un comentario