Evadir un portal cautivo mediante un túnel DNS

En una cafetería, en el aeropuerto, en un hotel... hoy en día en cualquier sitio existen puntos de acceso wi-fi abiertos que te ofrecen la posibilidad de navegar por Internet, aunque la mayoría durante un tiempo limitado y por un precio fijado. Son los llamados hotspot públicos que te redireccionan a la web de un portal cautivo para solicitar previamente unas credenciales por las que has tenido que pagar. Evadirlos sin embargo es muy fácil...

Lo primero comentaros lo que seguro ya sabéis: estas redes inalámbricas carecen de cualquier tipo de cifrado por lo que es posible esnifar el tráfico y robar la sesión de otro usuario conectado (o las credenciales de Facebook, Dropbox, Whatsapp, etc.). Es decir, no sería dificil envenenar ARP y/o hacer MiTM para obtener lo que buscamos puesto que la inmensa mayoría de los usuarios NO utilizan un servicio VPN para protegerse en este tipo de redes públicas. Pero no vamos a no ser demasiado malos y simplemente vamos a navegar sin robar nada a ningún otro cliente...

Para ello vamos a aprovecharnos de que normalmente estos puntos de acceso permiten utilizar el protocolo DNS sin necesidad de estar autenticado.
Veamos. Por ejemplo, si nos conectamos a un SSID "wifi_hotel" e intentamos navegar se nos redireccionará a un portal cautivo Cisco:

https://1.1.1.1/login.html?redirect=web

Pero sin embargo comprobamos que si podemos resolver cualquier nombre de Internet:
Adaptador de LAN inalámbrica Conexión de red inalámbrica:

   Sufijo DNS específico para la conexión. . :
   Dirección IPv4. . . . . . . . . . . . . . : 192.168.2.133
   Máscara de subred . . . . . . . . . . . . : 255.255.255.0
   Puerta de enlace predeterminada . . . . . : 192.168.2.1

C:\Users\vmotos>ping www.oracle.com

Haciendo ping a e7075.b.akamaiedge.net [23.51.70.140] con 32 bytes de datos:
Control-C
^C
C:\Users\vmotos>ping www.google.es

Haciendo ping a www.google.es [173.194.41.215] con 32 bytes de datos:
Control-C   
  
Gracias a esto podremos encapsular IPv4 en el payload de los datos de los paquetes UDP y establecer un túnel DNS con un servidor externo.

Quizás la herramienta más extendida y la que utilizaré en este caso es iodine que facilita el túnel cliente-servidor mediante un interfaz TUN/TAP normalmente creado por OpenVPN, aunque (no sé vosotros) yo no dispongo de un servidor externo, así que para tener la parte servidor de iodine utilizaré dns.canhasinter.net, que es un servicio que nos permitirá 500mb de tráfico gratuito ampliables mediante pago con bitcoins.

Para empezar tenemos que tener previamente instalado OpenVPN con un interfaz tun/tap creado y un cliente ssh, con puttygen.exe si os gusta el PuTTY (qué mal suena esto XD). En mi caso utilizaré Windows 7 con msysgit (Git para Windows) y los primero que haremos será generar un par de claves simétricas para luego registrarnos en el servidor del proveedor:
vmotos@PCVMOTOS ~
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/vmotos/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /c/Users/vmotos/.ssh/id_rsa.
Your public key has been saved in /c/Users/vmotos/.ssh/id_rsa.pub.
The key fingerprint is:
7e:0c:73:b7:b6:ba:4c:4f:ce:f0:02:3c:3e:66:e8:c5 vmotos@PCVMOTOS

Ahora descargamos iodine para Windows y ejecutamos:
C:\Users\vmotos\Desktop\iodine-0.6.0-rc1-win32\bin>iodine.exe -f -P canhasinternet 166.78.128.18 i.dfw1.dns.canhasinter.net
Opening device Conexi¾n de ßrea local 4
Opened UDP socket
Opened UDP socket
Sending DNS queries for i.dfw1.dns.canhasinter.net to 166.78.128.18
Autodetecting DNS query type (use -T to override)Opened UDP socket
.
Using DNS type NULL queries
Version ok, both using protocol v 0x00000502. You are user #0
Enabling interface 'Conexi¾n de ßrea local 4'
Setting IP of interface 'Conexi¾n de ßrea local 4' to 172.16.0.2 (can take a few
 seconds)...

Server tunnel IP is 172.16.0.1
Testing raw UDP data to the server (skip with -r)
Server is at 166.78.128.18, trying raw login: OK
Sending raw traffic directly to 166.78.128.18
Connection setup complete, transmitting data.

Con ésto hemos establecido un túnel virtual punto a punto mediante el interfaz tun/tap 'Conexi¾n de ßrea local 4'. Ahora tendremos que registrarnos con la clave pública generada:
vmotos@PCVMOTOS ~
$ ssh nopass@172.16.0.1
The authenticity of host '172.16.0.1 (172.16.0.1)' can't be established.
RSA key fingerprint is 17:79:60:65:21:8e:af:c6:4a:20:98:a5:8c:cc:e6:b5.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.0.1' (RSA) to the list of known hosts.

Help:
a) About
r) Register
l) Login
q) Quit
? r
Register:
Enter in an SSH key (~/.ssh/id_rsa.pub) to register your account.
You must have a 2048 bit RSA key. No others accepted.
Input must be exactly 372 characters. Paste the key here.
Do not paste in the ssh-rsa prefix. Go from the start of the key to
the end without the user@host comment section.
Press ctrl+c if you wish to abort.
?
Does this key look good?
AAAAB3NzaC1yc2EAAAABIwAAAQEAu/iH3eybVrQcvXhSh4SKxsOUNfJmSogAoxOHlrx/Tu8IwmyA+0ha
G0R+ZFNxwikfLXmMrzNvBwVjWdQ9wfxVw9adwD7H7l4vORuj/Nh//Jxq7EV2fSPnmco8wRCFHoSidYmW
1baZijiv2hEcIDJlyMY9KM23vhOTI91XewCl5KSWsjVgz4tpSwOh2n9G/JFf8u53+HqP4N+eUgWNss/Z
G2OFcfb3rVuCm5LMDfClOQ41wiGH69bdvgubt7/eCREhJlfWS8NZsf4eFx5x+6sj44+2bU3TPHKKG1U2
jMiWQcRHp5PYKx9TwgC4pePe4MOgfvFC3A8ER2y8s6jNpfglMw==
? y
Registration successful!
? e
Help:
a) About
r) Register
l) Login
q) Quit
?
? q
Connection to 172.16.0.1 closed.

Ahora mantenemos las rutas para los servidores DNS y cambiamos el gateway por defecto para redireccionar todo el tráfico por el túnel:

D:\>route add 8.8.8.8 mask 255.255.255.255 192.168.2.1
 Correcto

D:\>route add 8.8.4.4 mask 255.255.255.255 192.168.2.1
 Correcto

D:\>route add 166.78.128.18 mask 255.255.255.255 192.168.2.1
 Correcto

D:\>route delete 0.0.0.0
 Correcto
 
D:\>route add 0.0.0.0 mask 0.0.0.0 172.16.0.1
 Correcto

Finalmente lanzamos el cliente ssh:
ssh dns@172.16.0.1
Bandwidth purchased: N/A Bandwidth used: 560134
Bandwidth remaining: 499 MB
Bitcoin address: 1GMaV7RMyiagFmkv3EyPGGvgJ647bBFEfn
BTC/GB: 0.001. Minimum suggested payment 0.01 BTC.
Last transasction: N/A

Y probamos... ;)

D:\>ping www.oracle.com

Haciendo ping a e7075.b.akamaiedge.net [23.77.102.140] con 32 bytes de datos:
Respuesta desde 23.77.102.140: bytes=32 tiempo=265ms TTL=51
Respuesta desde 23.77.102.140: bytes=32 tiempo=260ms TTL=51

Estadísticas de ping para 23.77.102.140:
    Paquetes: enviados = 2, recibidos = 2, perdidos = 0
    (0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
    Mínimo = 260ms, Máximo = 265ms, Media = 262ms
Control-C
^C
D:\>tracert www.oracle.com

Traza a la dirección e7075.b.akamaiedge.net [23.77.102.140]
sobre un máximo de 30 saltos:

  1   135 ms   136 ms   135 ms  172.16.0.1
  2   139 ms   136 ms   136 ms  166.78.16.2
  3   140 ms   139 ms   138 ms  core3.dfw1.rackspace.net [72.3.202.48]
  4   182 ms   139 ms   138 ms  coreb.dfw1.rackspace.net [74.205.108.22]
  5   141 ms   138 ms   138 ms  corea-edge6.dfw1.rackspace.net [74.205.108.113]

  6   140 ms   139 ms   139 ms  ae53.edge10.Dallas1.Level3.net [4.28.44.161]
  7   143 ms   138 ms   149 ms  ae-3-80.edge5.Dallas3.Level3.net [4.69.145.145]

  8   140 ms   139 ms   138 ms  xe-8-1-2.dal33.ip4.tinet.net [77.67.71.221]
  9   264 ms   262 ms   270 ms  xe-0-0-0.bru20.ip4.tinet.net [89.149.187.121]
 10   270 ms   267 ms   265 ms  akamai-gw.ip4.tinet.net [77.67.65.90]
 11   265 ms   259 ms   259 ms  a23-77-102-140.deploy.static.akamaitechnologies.
com [23.77.102.140]

Traza completa.

Y ya está, ya podemos navegar... aunque recordar que conviene utilizar además un servicio VPN para mantener la privacidad de nuestros datos.

18 comentarios :

  1. "...si os gusta el PuTTY[...]" LOL Buena info. Vaya, por que usaras el Windows y no alguna distro GNU/Linux me pregunto -.-

    ResponderEliminar
    Respuestas
    1. man yo soy cubano necesito ke me hagas un video para evadir un portal cautivo cubano ke es el unico internet ke hay en cuba pero esta super ke restringido men dime ke programas necesito en linux o en lo ke sea para darte los datos de ese portal para ke me puedas hacer un video porke sy un tipo bastante lento por esa parte es un abuso dos dolares la hora bueno aki son cuc saludos soy fan de tu foro

      Eliminar
  2. Pero sí, lo ideal sería un debian o un arch con un servidor iodined propio en Internet, pero amigo, no siempre tenemos lo que queremos en cada momento... ;)

    ResponderEliminar
  3. Genial Maestro, llevo algun tiempo intentando montar un tunel dns. El hecho de poder empaquetar el trafico http en peticiones dns es algo que me fascina.
    Tengo mi servidor dns (en GNU/linux) configurado correctamente, tanto para peticiones de nombres como para ip's .. mi problema es iodine, y me imagino que la configuración variará con este escenario. ¿Sería posible que comentara su configuración?
    Mis agradecimientos por su tiempo. Saludos.

    ResponderEliminar
  4. gracias anónimo, tienes varios tutos en Internet para montar el iodined en Linux (por ej. http://grahamedgecombe.com/blog/ip-over-dns-with-iodine)

    Habría que ver más especificamente cuál es tú problema, hacer un pequeño troubleshooting, etc..

    Saludos!

    ResponderEliminar
  5. Hola, excelente tuto.

    Tengo un problema, no entiendo que haces en "Finalmente lanzamos el cliente ssh: ". Levantas unas sesion ssh con el putty contra 172.16.0.1? redirecconas el puerto 80?
    Disculpa, no me es claro

    Saludos

    ResponderEliminar
  6. una pregunta ago todo los pasos como esta aqui pero a la hora de conectarme con el msysgit hace todo pero se queda en esta parte u no hace mas nada

    $ ssh nopass@172.16.0.1
    The authenticity of host '172.16.0.1 (172.16.0.1)' can't be established.
    RSA key fingerprint is 17:79:60:65:21:8e:af:c6:4a:20:98:a5:8c:cc:e6:b5.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '172.16.0.1' (RSA) to the list of known hosts.

    Help:
    a) About
    r) Register
    l) Login
    q) Quit
    ? r
    Register:
    Enter in an SSH key (~/.ssh/id_rsa.pub) to register your account.
    You must have a 2048 bit RSA key. No others accepted.
    Input must be exactly 372 characters. Paste the key here.
    Do not paste in the ssh-rsa prefix. Go from the start of the key to
    the end without the user@host comment section.
    Press ctrl+c if you wish to abort.
    ?

    ya de aqui no pasa q es lo q pase q no me funciona

    ResponderEliminar
  7. Hola. esta aplicacion de verdad que es maravillosa. Estoy fascinado. Pero la verdad es que no entiendo ni papa. Lo unico que entiendo es que la parte servidos debe estar subido o puesto mejor dicho en un servidor ya contratado que esté vinculado a un dominio que por supuesto tambien tenga yo contratado. Estoy seguro que tunnel guru tambien utiliza esta aplicacion pero enmascarado en un software. Señor, quiero pedirle por favor si esta en sus posibilidades para que me haga una aplicacion personalizada que funcione con iodine disfrazado. Yo le pago previo acuerdo. Mi correo electronico es mariocheremos@gmail.com gracias

    ResponderEliminar
  8. Hola solo una duda compa...com obtienes estos datos

    Bandwidth purchased: N/A Bandwidth used: 560134
    Bandwidth remaining: 499 MB
    Bitcoin address: 1GMaV7RMyiagFmkv3EyPGGvgJ647bBFEfn
    BTC/GB: 0.001. Minimum suggested payment 0.01 BTC.
    Last transasction: N/A

    ResponderEliminar
    Respuestas
    1. hola compa, los datos se muestran al establecer una sesión ssh (ssh dns@172.16.0.1) y te muestra el contador del tráfico restante del servicio usado en el ejemplo (dns.canhasinter.net)

      Eliminar
  9. por esto y muchas cosas mas..... yo agregue una contraseña wpa + aes con un pass de 63 digitos entre letras minusculas mayusculas numeros y simbolos todos al azar.

    ResponderEliminar
  10. muy buen tutorial, siempre me ando buscando estos tutoriales para implementar mas seguridad a mi red, la mejor forma de saber tu seguridad es vulnerandola, gracias

    ResponderEliminar
  11. me gustara que me dijeran como puedo entrar en una red con puerto cautivo ya que no hay manera , yo uso el windows 7 y nada , tiene que ver alguna manera mas facil de entrar a estas redes , espero respuesta ...

    saludos ....

    ResponderEliminar
  12. Es mi técnica jajaja

    ResponderEliminar
  13. Oye e instalado un data logger para monitorear unos equipos electrónicos, la verdad no se mucho de redes pero el data logger necesita que configure una red para que pueda subir los datos a un portal de internet, el lugar cuenta con una red abierta con portal cautivo, pero no se como hacer que el data logger se conecte, me dieron un usuario y contraseña pero se trata de un data logger y a la hora de configurarlos solo me pide la red, el tipo de seguridad, y la contraseña si es que tiene.

    ¿Qué puedo hacer?

    ResponderEliminar
  14. a bote pronto se me ocurre que utilices un gateway entre medias que haga previamente la validación contra el portal cautivo y enmascare (NAT) la salida del data logger hacia Internet...

    ResponderEliminar
  15. he instalado iodined y he establecido una conexion pero aun no logro que transmita datos

    ResponderEliminar
  16. hola una pregunta si pude sacar la contraseña y el usurario por envenenamiento con yamas como lo puedo registrar ya que la contraseña me aparece como con 20 números y letras como si fuera la huella digital?

    ResponderEliminar