msntunnel: Tuneliza conexiones TCP usando MSN Messenger

Como hace bastante tiempo que no publico nada tengo un montoooooon de basura arrinconada en los portátiles; y por esto, he abierto un proyecto en googlecode (rusoblancogarbage) para ir subiendo todos los scripts y códigos curiosos que tengo por aquí.

Para empezar he subido msntunnel.py, este pequeño script permite conectarte a un puerto de un host remoto usando como pasarela una conexion de MSN Messenger.

Teoría

La teoría es bien simple, en la máquina origen de la conexión se pone un puerto a la escucha que es leido por msntunnel.py, cada uno de los paquetes que se leen en ese socket se codifica en base64 y se mandan usando una cuenta de messenger como un mensaje de chat a una segunda cuenta de messenger manejada por otro proceso msntunnel.py en el host remoto,  el mensaje se decodifica y se envía al host (normalmente localhost) y puerto de destino.

Ejemplo

No os distraigais con el pedazo de esquema que he hecho con el Dia; os pongo un ejemplo.

Digamos que tenemos dos cuentas de MSN Messenger (host_a@hotmail.com y host_b@hotmail.com) previamente asociadas entre si como contactos.

Si quisiéramos conectarnos al puerto 22 de HOST B desde HOST A haríamos lo siguiente:

En HOST A:
root@host_a# python msntunnel.py -u host_a@hotmail.com -p passhosta -r host_b@hotmail.com -L 2222
En HOST B:
root@host_b# python msntunnel.py -u host_b@hotmail.com -p passhostb -r host_a@hotmail.com -R 127.0.0.1 -P 22

Una vez ejecutados estos comandos en sus respectivas máquinas deberíamos tener el puerto 2222 abierto en HOST A que corresponde con el puerto 22 en HOST B.

Ventajas

  • La ventaja principal de este tipo de tunneling es que no es necesario conocer la dirección IP de la máquina destino ya que todo el routing de mensajes se hace a través de un servidor externo.
  • Otra de las ventajas es que no existe comunicación directa entre las máquinas y por lo tanto es un poquito más dificil de rastrear.

Limitaciones

  • En esta versión no se verifica que el tamaño del paquete codificado en base64 sea lo suficientemente pequeño para que el protocolo de messenger lo admita, por lo tanto los paquetes grandes dan un error de envio (más bien creo que no llegan xD). Lo dicho, como ésta versión falla con paquetes grandes, lo mejor es que la probeis con algo como SSH o quizas sea suficiente con bajar el MTU de loopback (no lo he probado).
  • Otra limitación es la velocidad que se ve bastante afectada.
  • El canal de comunicación es controlado por un tercero (Microsoft) por lo que la modificación/intercepción/almacenamiento de la comunicación es posible para el.

Posibilidades

  • No sería demasiado complicado reescribir modificar el código para usar interfaces TUN en vez de sockets y así poder tener más libertad en la conexión.
  • Otra mejora interesante sería permitir la comunicación simultanea con más de una cuenta de messenger de la lista de contactos y así tener un auténtico servicio de VPN sin un servidor dedicado (OpenVPN/Hamachi por messenger x”D).
  • Incluir otros servicios de mensajería instantanea como jabber, icq, irc…

Descargas