21 marzo 2009

Haciendo el Ciber Houdini

Harry Houdini fue un famoso mago que se granjeo fama a base de realizar actuaciones en las que, el plato fuerte, eran los trucos de escapismo por el cual el simpático mago conseguía zafarse de tanques de agua, gruesas cadenas y toda suerte de esposas y candados que pretendían retenerle.

En muchas ocasiones, por diversas circunstancias, el entorno en el que estamos conectados tiene el acceso al exterior restringido mediante un Proxy http, a priori, este Proxy restringe el uso de ciertos protocolos y en otros casos nos obliga a usar versiones web de esos protocolos (por ejemplo, mensajería instantánea). Adicionalmente, es posible que el Proxy tenga restricciones sobre el tipo de paginas web “aceptables”, por no hablar de la falta de privacidad que supone navegar teniendo la certeza de que toda nuestra navegación se esta registrando con todo lujo de detalles.

Desde SBD vamos a proponer un sistema para poder “escapar” de todo lo expuesto anteriormente y conseguir acceso ilimitado con privacidad adicional.
Para ello necesitamos unos cuantos requerimientos tanto en el entorno como en las herramientas. Para poder poner en practica esta técnica necesitamos:

  • Una maquina con conexión permanente a Internet (vale un ADSL)
  • Que esa maquina sea unívocamente localizable (ya sea mediante una IP fija o una dirección IP dinámica accesible a través de un nombre DNS fijo conseguido a través de DynDNS
  • Un host que ejecute alguna versión de Linux o *BSD accesible a través de la dirección anterior con el puerto 443 disponible

Una vez tengamos esos requisitos, procedemos a instalar el software necesario para poder “saltar”.
En la maquina Linux / *BSD necesitamos instalar un servidor OpenSSH (sería extraño que no formara parte del software base) y un software de tipo Proxy-Socks llamado Nylon . Este software debería compilar correctamente en cualquier sistema Unix.
Todo eso es para la parte “servidor”, en la parte cliente (basada en windows) únicamente necesitamos tener disponible el software Putty

Configuración Servidor

Asumiendo que ya tenemos instalado el servidor OpenSSH y Nylon, vamos a configurar primero el servidor OpenSSH para que escuche en el puerto 443. El motivo de hacer esto es porque para realizar una conexión “limpia” a través de un Proxy http solo se puede realizar empleando el método CONNECT y la mayoría de los proxys tienen restringida esa funcionalidad para que se realice contra puertos 443.

Editamos /etc/ssh/sshd_config y añadimos Port 443 para que escuche también en ese puerto, re-iniciamos el servicio y comprobamos que al ejecutar telnet localhost 443 aparece el banner de OpenSSH

$ telnet localhost 443
Trying 127.0.0.1...
Connected to localhost
Escape character is '^]'.
SSH-2.0-OpenSSH_4.3

El siguiente paso es configurar el Proxy Nylon que será el que nos permita hacer uso de cualquier aplicación que implemente conectividad a proxys socks (MSN Messenger, firefox, Explorer …)
La forma de configurar el Proxy es ejecutarlo de la siguiente forma:

/usr/local/bin/nylon -s -a 127.0.0.1 -i lo

Ejecutándolo de esta forma, el proxy únicamente es accesible en la dirección local (no podría usarse directamente desde Internet, evitando que algún amigo-de-lo-ajeno lo empleé para hacer el mal) Lo interesante es que añadas a tu rc.local (si usas Redhat/Fedora/Centos) o /etc/init.d/bootmisc.sh (Si usas un sistema basado en Debian) la ejecución de Nylon para hacer que, en futuros re-inicios, el proxy esté disponible.
El ultimo paso que hay que hacer es crear una cuenta en el sistema para conectarnos, valdría cualquier cuenta con login habilitado pero por motivos de higiene es recomendable crear una cuenta nueva, por ejemplo, salto:
#adduser salto
#passwd salto
Con esto quedaría configurado nuestro servidor de salto, ahora veamos la configuración de la parte cliente basada en Putty.

Configuración cliente

Primero de todo debemos crear una nueva sesión en putty a la que llamaremos “salto” y en ella configuramos la maquina donde tenemos ejecutando OpenSSH y Nylon


El siguiente paso es configurar el proxy interno HTTP del lugar en el que nos encontremos, tenemos que especificar el host, el puerto, nuestro usuario y contraseña


El siguiente punto es crear el túnel inverso por SSH para poder acceder a Nylon, para ello configuramos Putty de la siguiente forma:



pulsamos “add” y la configuración queda de la siguiente forma:


Una vez realizada la configuración, la salvamos


El último paso es pulsar “Open” y acceder a nuestra maquina de salto, si todo funciona como es debido, en nuestra maquina cliente tendremos abierto el puerto 1080 que a su vez estará conectado con el puerto 1080 (donde escucha Nylon) de nuestra maquina de salto. Lo ultimo que nos queda es re-configurar nuestras aplicaciones para que usen un proxy socks en la dirección 127.0.0.1 puerto 1080


Feliz navegación !

32 comments :

Jose Andres dijo...

Muy excelente informacion, gracia por el gran articulo

Teknik dijo...

¿Y usar únicamente SSH con la opción "Dynamic" (i.e. proxy SOCKS)? Yo la he usado en escenarios en que la salida era libre, pero necesitaba llegar desde la IP donde tenia el servidor SSH pero, ¿funcionaría también en este caso?

Yago Jesus dijo...

Muy interesante el tema de 'Dynamic' (que yo no conocía) con eso te ahorras montar el proxy Socks, el problema es que Putty no soporta esa opción, solo el ssh y a su vez, el ssh no soporta conectar a través de un proxy web por método CONNECT así que para este escenario, no serviría

RoMaNSoFt dijo...

Yago, lo del "dynamic" sí que serviría para este escenario -perfectamente-, y de hecho, Putty lo soporta. Las conexiones van tunelizadas en el tramo cliente-servidor, por lo que lo del proxy HTTP no afecta (una vez tienes establecido el tunel SSH).

-r

Anónimo dijo...

Muy interesante este articulo, cada día se aprende algo nuevo, pero ,

Que me deciis de un servidor openvpn escuchando en el 53 udp ?

Con esto todo lo que salga de la máquina cliente con la VPN delavantada, saldría tunelizado y seguro, cierto ?

Anónimo dijo...

Muy interesante. Muchas gracias. Me he liado un poco con el puerto 1080.
Duda1: ¿Por qué se supone que el proxy remoto -Nylon- escucha en p1080? ¿Es así por defecto?
Duda2: ¿Qué software es el que hace que nuestro PC del curro escuche en el p1080? ¿PuTTY?
Duda3: ¿Podrías por favor explicar la opción DYNAMICS?
Muchas gracias

Yago Jesus dijo...

@Romansoft, cierto, acabo de ver la opción en putty, lo probare.

Sobre lo de openvpn ... El escenario que yo describo es un entorno donde no hay conexion directa hacia el exterior (ni udp, ni tcp) únicamente el proxy, asi que no funcionaria. (Harina de otro costal serían los tuneles DNS, pero eso otro tema)

Sobre la opción Dynamic, he encontrado este tutorial http://www.debian-administration.org/articles/449 donde lo explican bastante bien.

Guillermo dijo...

Hay un artículo bastante parecido en http://www.kriptopolis.org/proxy-casero.

4v4t4r dijo...

Yago, genial el tutorial... Funciona perfectamente...

Acostumbro a realizar algunos video tutoriales sobre diferentes laboratorios, espero me permitas tomar tu tutorial para ello.

Gracias

Yago Jesus dijo...

@4v4t4r claro que si, seguro que en formato vídeo queda mucho mas ameno

Asfasfos dijo...

Muy buen artículo Yago, te felicito por ello. Tengo una preguntilla, bueno mas que pregunta aclaración, he estado leyendo también sobre el lado oscuro de hacer esto, es decir la gente de sistemas que te pone un proxy delante para que no navegues, uses msn, etc. He leido que hay aplicaciones y formas de saber que estás realizando un tunel por mucho que lo hagas con ssh, ¿cuanto de cierto hay en esto?

Graciass!!!

Un saludo

P.D: si encuentro el artículo donde lo decía os pongo el link

Yago Jesus dijo...

@Asfasfos perdona por el retraso, si, efectivamente detectar una conexión ssh mediante un proxy HTTP, es bastante sencillo puesto que ssh publica un banner muy llamativo. De todas formas, hay opciones VPN totalmente SSL que serían mucho menos detectables. Ahora bien, no te olvides de 'meter' tu tráfico DNS también por el túnel

zaping dijo...

No me funciona y no se porque.. putty no me pide login se queda en negro

Yago Jesus dijo...

Tendrás que dar mas detalles del entorno en el que lo has montado, asegúrate que el hostname donde está el ssh realmente es accesible, que el SSH esté escuchando en el puerto 443 ...

zaping dijo...

tengo el problema que no me accede a mi ip no se porque hago telnet ami no ip y se queda en trying..

en lan funciona todo

Yago Jesus dijo...

A ver, el escenario típico / normal es el siguiente
[tu] <--> [Proxy] <--> [host]
Donde el Host es donde ha de estar el ssh escuchando en el puerto 443. Entonces, lo que da la impresión es que tu proxy no está conectando bien hacia tu host. Desde el host intenta un telnet localhost 443 para asegurarte que el SSH está ahí esperando conexiones. Si esa prueba ha ido bien, intenta conectar desde el Putty configurando el proxy

zaping dijo...

creo que son los puertos 443 y 1080 del router que estan cerrados

zaping dijo...

eran los puertos he logrado conectar pero no me funciona el ultimo paso del proxy para navegar me dice la conexion ha sido reiniciada

zaping dijo...

He instalado nylon en los dos computadores y con eso tengo en los dos a la espera el puerto 1080. Configuro firefox como pone y funciona internet pero mi duda es si miro la ip con la que navego cual deberia ser la del servidor no? o la del cliente?

Yago Jesus dijo...

No, en la maquina 'cliente' no debes tener instalado nylon, solo en tu ADSL (donde corre el ssh)

zaping dijo...
Este comentario ha sido eliminado por el autor.
zaping dijo...

ok entonces cuando configuras el proxy en firefox solo pones socks ? y supongo que deberia darte la ip del servidor ssh no del cliente cuando navegas no?

zaping dijo...

una ultima cosilla jeje sabes donde guarda nylon los logs porque si hay viene las webs que he probado significa que esta bien aunque no salga la ip del server

zaping dijo...

Soy el unico que ha configurao el tuenel ssh pero no logra hacer funcionar nylon?

Si alguien a configurao nylon de otra forma que no sea ejecutarlo asi.... que lo diga pls

Yago Jesus dijo...

A ver ... pasteame la salida de un netstat -tanp de la maquina donde tienes nylon y ssh

zaping dijo...

(No todos los procesos pueden ser identificados, no hay información de propiedad del proceso
no se mostrarán, necesita ser superusuario para verlos todos.)
Conexiones activas de Internet (servidores y establecidos)
Protocolo Recv-Q Send-Q Dirección Local Dirección Externa Estado PID/Program name
tcp 0 0 127.0.0.1:631 0.0.0.0:* ESCUCHAR -
tcp 0 0 192.168.0.12:1080 0.0.0.0:* ESCUCHAR 25738/nylon
tcp 0 0 127.0.0.1:1080 0.0.0.0:* ESCUCHAR -
tcp 0 0 0.0.0.0:443 0.0.0.0:* ESCUCHAR -
tcp 0 0 192.168.0.12:49913 209.85.227.99:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:57043 64.4.36.56:1863 ESTABLECIDO 22055/python
tcp 0 0 192.168.0.12:58050 64.4.36.32:1863 ESTABLECIDO 22055/python
tcp 0 0 192.168.0.12:36935 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:34397 209.85.137.19:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36330 64.4.37.53:1863 ESTABLECIDO 22055/python
tcp 0 0 192.168.0.12:49915 209.85.227.99:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:44857 209.85.229.101:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36948 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:37893 207.46.109.96:1863 ESTABLECIDO 22055/python
tcp 0 0 192.168.0.12:36806 209.85.229.147:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:49928 209.85.227.147:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36946 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:49916 209.85.227.99:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:443 192.168.0.11:49442 ESTABLECIDO -
tcp 0 0 192.168.0.12:36805 209.85.229.147:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36939 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36934 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:54180 207.46.26.96:1863 ESTABLECIDO 22055/python
tcp 0 0 192.168.0.12:36947 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:39284 67.202.94.94:80 TIME_WAIT -
tcp 0 0 192.168.0.12:49927 209.85.227.147:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36933 209.85.229.191:80 ESTABLECIDO 5905/firefox
tcp 1 0 192.168.0.12:46139 66.135.59.147:80 CLOSE_WAIT 5905/firefox
tcp 0 0 192.168.0.12:49914 209.85.227.99:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:36804 209.85.229.147:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:56441 209.85.137.18:80 ESTABLECIDO 5905/firefox
tcp 0 0 192.168.0.12:34398 209.85.137.19:80 ESTABLECIDO 5905/firefox
tcp6 0 0 :::80 :::* ESCUCHAR -
tcp6 0 0 :::443 :::* ESCUCHAR

zaping dijo...

El problema esque en el ssh server configuro el proxy y si pueod navegar . en el ssh cliente una vez ya dentro con putty y configurao el 1080 con 127.0.0.1:1080. lo configuro y me pone conexion reiniciada.

Yago Jesus dijo...

Amigo, definitivamente creo que lo mejor será que dejes por privado tu dirección de MSN o Gtalk (mandalá a contacto@securitybydefault.com) y te guío

zaping dijo...

Gracias ya te he enviado el correo

Miguel Sánchez dijo...

Buenas! creo que para montarte un pequeño proxy-socks no hace falta tener un Linux (pc de escritorio) arriba. Con un simple Router (el test está basado en el WRT54GL) y DD-WRT como firmware sería suficiente. En el Router no hace falta configurar nada a excepción que el puerto sea público y visible desde INet. En el cliente, uso "plink" que forma parte del paquete de Putty.

plink.exe -ssh -2 -4 -D puerto -N -C -l root -pw passwd -P 443 servidor.no-ip.info

listo!

Anónimo dijo...

Disculpen mi torpeza pero no me queda claro. ¿cuantas máquinas reales se necesitan en total? cliente, proxy y host, es decir, ¿tres?, ¿dos?, ¿o se puede ejecutar todo en uno?.


Gracias.

Yago Jesus dijo...

@Anónimo: Dos, tu PC (que conecta desde las redes hostiles) y el servidor donde se ejecuta SSH