Introduccion a la tecnica 'http tunneling' ---------------------------------------------------------------------- Autor : zgor . zgor@int80h.net http://int80h.net Fecha: 7-11-2001 Ultima revision: 7-11-2001 I - Introduccion Con este documento pretendo introducir unas nociones muy basicas sobre la tecnica 'http tunneling' . No esta destinado para personas avanzadas o medias en la materia . Recomiendo visitar las paginas citadas para poder tener una informacion completa y detallada sobre el tema. Ruego me perdonen los puristas del lenguaje por las bestialidades(como tunel y derivados ) y el escaso esfuerzo por la traduccion correcta aqui cometidos II - Nociones Basicas Tunneling --------- Entiendo protocolo como la forma de comunicarse de dos o mas entidades de sistemas diferentes , propongo este pequeño esquema : ENTIDAD Entidad A --------protocolo P (datos)---------- B En este caso el protocolo P es propio al tipo de las entidades A y B. El tunneling consiste en encapsular un protocolo dentro de otro. Quizas os ayude la siguiente ilustracion : ENTIDAD ENTIDAD A ----Protocolo Z (protocolo P(datos))-- B http tunneling -------------- El protocolo http es de aplicacion y usa el protocolo tcp como transporte. En circunstancias normales , cuando un cliente web visita una pagina, se establecen una o mas conexiones tcp al puerto 80 (usualmente) del servidor web , usando el protocolo HTTP Ejemplo: NAVEGADOR HTTP SERVIDOR WEB NETSCAPE ------------------------------------- APACHE El http tunneling consiste en encapsular cualquier protocolo que use el tcp como transporte, puesto que es el que usa http Esquemita tipico : PASO 1 : Datos de Protocolo P Aplicacion -------------------------------------- CLIENTE 'TUNELIZADOR' y a partir de ahi : PASO 2: HTTP CLIENTE -------------------------------------- FALSO SERVIDOR WEB TUNELIZADOR DESTUNELIZADOR y finalmente : PASO 3: Protocolo P FALSO SERVIDOR WEB ------------------------------ Datos de DESTUNELIZADOR Aplicacion En este ejemplo, escojemos dos aplicaciones A y B que se comunican mediante el protocolo P que usa tcp para transporte. En el primer paso, los datos de la aplicacion son enviados al cliente tunelizador , quien encapsula esos datos dentro del protocolo http ( ver seccion 3-Implementacion). La aplicacion y el cliente tunelizador no tienen porque estar en la misma maquina, basta con que sea accesible En el segundo paso, el cliente tunelizador envia una peticion standard http al falso servidor WEB , este ultimo, la desencapsula y envia los datos a la aplicacion destino, que como en el primer paso, no es necesario que sea la misma maquina la que corra la aplicacion y el falso servidor web. Por sencillez, llamare CT al cliente tunelizador y SDT al serviddor destunelizador, valga la redundancia. Si por ejemplo , queremos tunelizar el protocolo SSH (secure shell), tenemos el esquema siguiente : ssh http ssh Cliente SSH --------CT ----- SDT -------- Server SSH Host A Host A Host B Host C Nota:Bastaria con solo 2 hosts A y B , pero pueden participar hasta 4. Configuraremos nuestre cliente SSH para que se conecte con nosotros mismos , al puerto tcp en el que hayamos configurado el CT. El CT enviara los datos al SDT usando el protocolo HTTP , para ello podra utilizar si es necesario un proxy web (tema tratado en la siguiente seccion) . El Host B , SDT, enviara los datos desencapsulados al Host C , servidor de SSH. De esta forma, el host A y el host C establecen una comunicacion SSH a traves del tunnel virtual sobre http, siendo este tunnel 100 % transparente para la aplicacion en cuestion , salvo en lo que a direcciones se refiere, puesto que el cliente del host A ha conectado consigo mismo y no directamente con C. II - Y para que tanto lio ? Seguramente os esteis preguntando porque se organiza tanto jaleo Aunque el protocolo http use al tcp para el transporte , en muchas ocasiones no es posible una comunicacion directa por tcp entre dos maquinas Es el caso por ejemplo de una red interna de una empresa o universidad en la que la salida hacia internet esta limitada a un proxy unicamente WEB Ejemplo: LAN http http SITE INTERNA ----------- Proxy WEB SQUID ---------------- WEB En este caso, en teoria, no es posible una conexion tcp desde la lan interna hacia el exterior, la unica salida es via http Es el unico caso real en el que veo muy necesaria la utilizacion de la tecnica de http tunneling , si sabeis de algun otro caso, no dudeis en mandarmelo y completare esta seccion IV - Implementacion Para implementar el cliente y el servidor de tunneles http , es de obligada lectura el RFC del protocolo http, disponible en castellano en : http://lucas.hispalinux.es (seccion Estandares) Basicamente, consiste en encapsular los datos del cliente en las peticiones POST . Para los datos provienentes del servidor , no hay tal necesidad, puesto que puede devolver el tipo de datos que quiera , siempre y cuando lo especifique. Para detalles sobre la implementacion, la pagina web del ejemplo comentado es una excelente fuente de informacion V - Ejemplo de Implementacion : HttpTunnel por Lars Brinkhoff - http://www.nocrew.org/software/httptunnel.html Este software se distribuye gratuitamente bajo la licencia GPL Este es un excelente ejemplo, puesto que esta estructurado de la forma comentada anteiromente . A fecha de hoy , estan disponibles el clasico tarbal (tar.gz), paquetes .deb para debian y los binarios precompilados para plataformas win9x y NT/2k Los dos ejecutables que nos interesan son : hts y htc , servidor y cliente respectivamente . No requieren muchos parametros , pero veamos el ejemplo de una situacion tipica : + Host A : equipo de una LAN interna , se conecta a internet a traves del host proxy.lan.interna , que es un proxy web (puerto 8080). + Host B : algunLugar.com , equipo de internet , rulando el servicio de telnetd y en el cual tenemos una cuenta con la que acceder En la maquina B , deberiamos ejecutar : hts -F localhost:23 9000 Lo que conseguimos, es hacer que las conexiones http al puerto 9000 sean desencapsuladas y redirigdas al puerto 23 ( demonio de telnet) de la misma maquina. En la maquina A, podemos ejecutar : htc -F 1001 -P proxy.lan.interna algunLugar.com:9000 El cliente se quedara a la esperade conexiones el puerto local 1001, los datos recibidos seran encapsulados y enviados a algunLugar.com ,puerto 9000, usando el protocolo http.El cliente utilizara el proxy proxy.lan.interna para comunicarse con el servidor algunLugar.com Si todo ha ido bien, al conectarnos al puerto 1000, en el host A, veremos el bonito login de la maquina B. (para conectarnos , bastaria con ejecutar telnet localhost 1000 en el host A) Es probable que tarde unos instantes en conectar e incluso que sea necesario establecer otra conexion para lograrlo, recomiendo que probeis primero sin proxy , ya que este ultimo puede dar algun problemilla inciial. Otro ejemplo es Htthost - http://www.htthost.com/, pero es de pago. Introduce nociones nuevas como la introduccion de banners publicitarios , etc .. VI - Saludos y publicidad barata La tecnica de http tunneling esta en vias de desarrollo para la herramienta Aladino Pangea. Se trata de una herramienta de administracion remota segura y eficaz de equipos Windows 9x/Nt.. Me gustaria saludar a toda la gente que conozco , aunque suene un poco a comodin :P Nota: este texto ha sido redactado usando Emacs (vi* sux XD ) a traves de una conexion SSH tunelizada; en la universidad en la que estudio solo disponemos de salida a internet a traves de un proxy web.Vamos , lo que os quiero decir es que la historia funciona realmente