Busindre » Blog Archive » Saltar logueos en comunidades Wi-Fi tipo FON con "Túneles ICMP"

Saltar logueos en comunidades Wi-Fi tipo FON con "Túneles ICMP"

July 6th, 2008 by Busindre

Los túneles ICMP consisten en encapsular otros protocolos que usen TCP / UDP en paquetes ICMP "echo_request" (solicitudes) y "echo_reply" (contestaciones), normalmente usados con el comando ping para localizar ordenadores activos en una red. La comunidad FON, como otras comunidades wi-fi, impiden el tráfico de la mayoría de protocolos usados en Internet (http, ftp, ssh,..) si el cliente que conecta al punto de acceso de dicha comunidad no se loguea correctamente, de autenticarse de forma exitosa el cliente podrá hacer uso de Internet y sus múltiples protocolos.

Es común darse cuenta a la hora de conectar a este tipo de AP's de comunidades wi-fi, que permiten el paso de tráfico ICMP y DNS sin estar autenticados como miembro autorizado de dicha comunidad, no dejará navegar por paginas web, pero SÍ notaremos que nos permite hacer pings (ICMP) a la Internet pública. Entonces,.. si el punto de acceso al que conectamos nos deja enviar trafico ICMP a algún lugar de Internet, podremos usar técnicas de "icmp tunneling" para navegar o usar otras aplicaciones (ssh, irc, telnet,..) sin pagar o loguearse, escondiéndolas dentro de los paquetes ICMP echo_request y echo_reply.

Tenemos el siguiente esquema:

Cliente --- (A) ---> AP comunidad Wiffi --- (B) ---> Server comunidad Wiffi --- (C) ---> INTERNET

Para llegar a Internet por medio de un navegador web (Firefox), cliente de chat (Irssi) o por ejemplo un simple ssh, es necesario pagar cierto dinero o bien loguearse contra el servidor de la comunidad, ya que de no autenticarse el paso (B) fallara y no podremos continuar. Pero sabemos que un ping desde el cliente a un host cualquiera de Internet, como por ejemplo www.busindre.com, responderá sin problemas, por lo que el trafico ICMP pasa por (A) (B) y (C) estemos o no logueados, entendiendo eso proponemos este esquema:

Cliente --- (A) ---> AP Wiffi Fonera --- (B) ---> Server Fon --- (C1) ---> ICMP Proxy --- (C2) ---> INTERNET

Supongamos que un usuario, denominado cliente usa algún tipo de protocolo como puede ser una conexión ssh, pero encapsulado en paquetes ICMP. Si esos paquetes llegaran a algún otro PC en Internet que hiciera de proxy (intermediario), realizando la conexión ssh y devolviendo la salida en forma de paquetes ICMP de nuevo al usuario (A), podríamos hacer uso de ssh sin tener que loguearnos contra el servidor de la comunidad wi-fi, ya que en los pasos A B y C1 todo el trafico sería ICMP. Esto se consigue creando un túnel icmp entre el cliente y el ordenador que hace de intermediario, donde todo el trafico que use el túnel sera encapsulado bajo paquetes ICMP, para ese menester usaremos la utilidad ptunnel que es muy sencilla de utilizar como veremos. Como es de esperar en las aplicaciones tunelizadoras, ptunnel se divide en una parte cliente y otra servidor (proxy), las cuales pasamos a analizar inmediatamente.

Cliente: Se arranca en el ordenador del usuario que quiere iniciar conexiones, estás deben ser de usar un solo puerto, es decir no funcionarán protocolos multipuerto, como es el caso de FTP, que hace uso del 21 y el 20 en su modo de funcionamiento "activo". La aplicación que funciona como cliente se encarga de encapsular una determinada conexión mediante trafico ICMP y mandarla al servidor proxy que hará de intermediario, pero también se encarga como es lógico de desencapsular la información cuando el proxy nos devuelva el resultado de nuestras peticiones en forma de paquetes ICMP.

Servidor: La aplicación servidor escucha peticiones ICMP de un determinado cliente, las desencapsula para obtener el protocolo escondido en forma de paquetes de ping (echo_request y echo_reply), estudia la petición, por ejemplo conectar a un servidor de irc freenode, la ejecuta y nos va pasando la salida de esa conexión a freenode otra vez encapsulada en forma de paquetes ICMP que ya el cliente se encargará de desencapsular.

NOTA: En el caso de ptunnel notaremos que solo hay un programa ejecutable que podemos usar, eso es porque puede funcionar tanto como servidor, como cliente dependiendo de las opciones con las que le invoquemos.

CLIENTE <---ICMP---> SERVIDOR PROXY <--- (Irc, Ssh, Telnet, http,...) ---> INTERNET

Tunel ICMP: CLIENTE <---ICMP---> SERVIDOR PROXY

Descargar Ptunnel: http://www.cs.uit.no/~daniels/PingTunnel/#download

$ tar -zxvf PingTunnel-0.61.tar.gz
$ cd PingTunnel
$ make
# make install ó checkinstall

FORMA DE USO

* Sintaxis del comando para Cliente:# ptunnel -p IP_PROXY -lp PUERTO_LOCAL -da IP_OBJETIVO -dp PUERTO_OBJETIVO -x PASSWORD -v -f FICHERO_LOG

Opciones del cliente:

IP_PROXY: Dirección IP del host que usaremos como servidor ICMP (proxy).

PUERTO_LOCAL: Puerto que usaremos en la máquina cliente para establecer el tunel, podríamos entenderlo como el principio del tunel, la puerta de entrada al mismo.

IP_OBJETIVO: Host al que queremos conectar, puede ser un servidor de chat, de ssh, de telnet, un proxy web, lo que sea a lo que se quiera conectar.

PUERTO_OBJETIVO: Puerto de la máquina (IP_OBJETIVO) a la que queremos conectar (ssh - 22, telnet - 23, irc - 6667,...)

PASSWORD: Password para autenticarse contra el servidor, lógicamente el servidor debe usar la misma.

-v: Modo depuración.

FICHERO_LOG: Ruta del fichero donde queremos guarde los logs de nuestros túneles.

NOTA: Las opciones -x -v y -f no son obligatorias.

* Sintaxis del comando para Servidor: # ptunnel -m NUMERO_MAXIMO_TUNELES -x PASSWORD -c DISPOSITIVO -v

Opciones del Servidor:

NUMERO_MAXIMO_TUNELES: Es el número de túneles que el servidor permite mantener de forma simultanea. Por ejemplo una conexión ssh y otra a un servidor de irc serían 2 conexiones (2 puertos), por defecto no viene limitado el número de túneles activos.

PASSWORD: Contraseña usada para autenticar al cliente que establece un tunel, debe ser la misma en cliente que en el servidor.

DISPOSITIVO: Tarjeta de red que usará el servidor para tunelizar las conexiones (eth0, eth1, wlan0, ra0, ath0,...)

-v: Modo depuración.

IMPORTANTE: Para que el ordenador que hace de servidor proxy ICMP pueda funcionar correctamente se debe indicar al kernel de GNU/Linux que no conteste a las peticiones ICMP (ping). Como sabemos, la pila TCP/IP en GNU/Linux se encuentra a nivel de núcleo, por lo que es el kernel el encargado de contestar esos paquetes "echo_request" provenientes del exterior, pero claro,.. Esos paquetes echo_request enviados al proxy a través del túnel NO tienen la finalidad de comprobar si el servidor esta online, si no que dentro tienen encapsulado otros protocolos, por lo que si el kernel contesta a esos paquetes el cliente no entenderá dichas respuestas como es lógico. El que debe responder a esos pings es la aplicación ptunnel, no el kernel de Linux, de esta forma todo el trafico ICMP entre la máquina del cliente y el servidor proxy pertenecerá al túnel. Para desactivar la respuesta ICMP del kernel tenemos que editar un fichero de esta forma:

Desactiva (Necesario en el servidor):

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all nore_all

Activa (Por defecto):

# echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all nore_all

¿Como creo un servidor proxy ICMP desde una conexión a Internet casera?

Como el servidor proxy necesita recibir paquetes ICMP directamente del cliente, depende de la conexión a Internet que tengamos contratada y su configuración, puede que los ping sean contestados por el router y no puedan llegar al "servidor ptunnel" que está dentro de la red LAN privada. Como ICMP es un protocolo de capa de red (Capa 3 OSI) no usa puertos y no podemos actuar igual que si tuviéramos un servidor Apache, un Ftp o cualquier otro protocolo que use puertos, que es mapeando en el router el puerto del servidor a una ip específica de la LAN. Para poder permitir que los ping (Trafico ICMP) de Internet alcancen a una determinado ordenador dentro de una red LAN en estas circunstancias, podemos hacer lo siguiente:

Usar la opción de DMZ (No todos los routers tienen opción a ello).
Abrir todos los puertos (Virtual server) para todos los protocolos (Funciona en la mayoría de routers).
Configurar el router en modo monopuesto, pero eso limita el uso del router a un solo PC.

Al abrir todos los puertos de un router para una determinada dirección IP, lo que hace el enrutador es que deja pasar todo a esa dirección IP sin comprobar puertos abiertos o cerrados, si están todos abiertos para todos los protocolos,.. Para que gastar rendimiento en comprobaciones? Se le pasa todo el trafico a esa IP de la LAN tanto como si se usa un protocolo que use puerto, como si no lo usa (El caso de ICMP), por lo que suele ser la solución más simple.

Ejemplos de uso de ptunnel

Dirección IP del servidor proxy ICMP para los ejemplos: 83.52.24.106

* Ejemplo de tunel para conexión SSH (Puerto 22) a 91.200.143.20

Cliente: ptunnel -p 83.52.24.106 -lp 6565 -da 91.200.143.20 -dp 22 -x busipass -v
Cliente: ssh -p 6565 127.0.0.1
Servidor: ptunnel -v -x busipass -c eth0

* Ejemplo de tunel para conexión IRC a Freenode (Puerto 6667)

Cliente: ptunnel -p 83.52.24.106 -lp 6667 -da 204.11.244.21 -dp 6667 -x busipass -v
Cliente: Arrancamos nuestro cliente de IRC y ejecutamos ./server 127.0.0.1
Servidor: ptunnel -v -x busipass -c eth0

¿Como puedo usar un tunel ICMP para navegar (http) por Internet?

Lo más lógico si queremos poder navegar por paginas web usando un tunel, es usar a dicho tunel para que nos comunique con un "proxy web" de esos que encontramos por Internet y que sabemos que funciona. Veamos un ejemplo tomando como proxy web a 125.244.53.194:8080

Cliente: ptunnel -p 83.52.24.106 -lp 9999 -da 125.244.53.194 -dp 8080 -x busipass -v

Cliente: Arrancamos nuestro navegador (Editar > Preferencias > Avanzado > Red > Configuración) y añadimos como proxy web la dirección 127.0.0.1 y el puerto 9999. La lentitud al cargar las webs será palpante debido a que en cada petición los paquetes pasan por dos proxys, el configurado por nosotros corriendo ptunnel (ICMP) y el proxy web (Http) seleccionado para navegar, encontraremos muchas páginas con listados de proxy webs a nuestra entera disposición.

Servidor: ptunnel -v -x busipass -c eth0

Cliente <------> AP Wiffi Fonera <------> Server Fon <------> ICMP Proxy <------> WEB Proxy <------> Pagina WEB

Tráfico ICMP: Cliente <------> AP Wiffi Fonera <------> Server Fon <------> ICMP Proxy
Tráfico HTTP: ICMP Proxy <------> WEB Proxy <------> Pagina WEB

¿Como acelerar el trafico entre el cliente y el servidor?

Para acelerar un poco el tráfico en el tunel se puede usar un truquillo en la parte del cliente, que es ejecutar un ping a la ip del proxy ICMP, con la opción de flood (-f) activada. Esta opción mandará paquetes echo_request muy rápidamente al servidor ICMP, como recordamos el kernel del servidor tiene desactivada la capacidad de responder a esos echo_request, por lo que el único que contestará a esa inundación de solicitudes será ptunnel, acelerando sus contestaciones. Podría entenderse como una forma de "meterle prisa" al servidor proxy mediante muchas solicitudes de paquetes ICMP.

Errores que podemos encontrar:

Violación de segmento -> Debido a poner nombres de dominio en vez de direcciones ip, lo cual es lo recomendable. De usar la opción -c (Solo servidor proxy) se debe indicar el nombre de la interfaz, no la IP.

Muchos mensajes [err]: Dropping duplicate proxy session request. uno detras de otro: Si tenemos varios mensajes de este tipo (Usando la opción -v) probablemente no termine de funcionar el tunel ICMP, debemos asegurarnos de tener un "1" en el fichero icmp_echo_ignore_all del directorio /proc/sys/net/ipv4/. De tener un 0 es crucial ejecutar el siguiente comando para que el kernel de GNU/Linux no responda a los ping, ya que solo debe responder a los ping la aplicación ptunnel:

# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

Posted in Linux |

Leave a Comment

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.