Bienvenido a cursohacker.es. Puedes acceder a todo el contenido líbremente pero si deseas poder crear tus propios temas en el foro y que tus respuestas y comentarios se publiquen de forma automática regístrate como alumno aquí

FTP problemas de conexion, PORT y PASV

Uno de los problemas de los servidores FTP es el modo de trabajo en que se pensaron. Cuando estos servidores empezaron a proliferar en la red, hace ya algunos años, la gente se conectaba a internet de forma directa, sin routers, eran aquellos tiempos en los que los módems de 56k hacían que un pc se conectara directamente a internet sin IP privada, directamente con la IP pública.

En estos escenarios no había ningún problema en trabajar con servidores FTP, ya que se trabaja de forma directa entre tu IP pública y la IP pública del servidor FTP. Hoy, con el auge de las redes LAN y las IPs privadas el modelo de conexión con los servidores FTP han tenido ciertos problemas que han sido solucionados, pero que aún así debemos tener claro cómo se ha implantado la solución para aquellos casos en los que no somos capaces de trabajar correctamente con un servidor FTP. Una consecuencia directa de esta solución es la posibilidad de utilizar un servidor FTP como herramienta de hacking. Así que tanto si actúas desde el lado del hacking ético o eres un administrador de sistemas deberías conocer este tema a fondo.

Protocolo de conexión en servidores FTP

Haciendo memoria de las últimas publicaciones sobre servidores y clientes FTP ya deberías saber que este tipo de servidores trabajan de forma estándar sobre el puerto 21. Esto significa que cuando nos conectamos a un servidor FTP se establece una conexión entre un puerto aleatorio de nuestro PC y el puerto 21 del servidor FTP. De este modo creamos un canal de conexión que podría representarse así:
socket FTP

Una vez establecido este canal ya estamos en disposición de trabajar con el servidor FTP al que nos hemos conectado. Nosotros emitimos comandos por este canal y el servidor nos devuelve la respuesta. Pero claro, ¿Qué ocurre cuando pedimos descargar un archivo? Muy sencillo, que el canal se ocuparía descargando el archivo y no podríamos seguir emitiendo más peticiones hasta completar la descarga. Esto es un problema que nos impediría trabajar en paralelo, poder descargar varios archivos a la vez o navegar por el servidor mientras descargamos archivos. Para soluciona esto, los servidores FTP cuando pedimos descargar un archivo "crean" un canal secundario. De esta forma el canal primario siempre queda disponible para lanzar órdenes y las descargas se hacen en canales secundarios, permitiendo así poder seguir trabajando con el servidor FTP aun estando descargando archivos u haciendo cualquier otra tarea.

Aquí es donde se crea el problema, a la hora de crear el canal secundario. Cuando se trabaja con IPs públicas directamente, el servidor FTP conocía tu IP pública, y era capaz de conectar contigo de forma directa, hoy esto no es posible, ya que si estás en una red local y tienes una IP privada, el servidor FTP no conocerá tu IP privada y cuando intenta crear el canal secundario falla. Pero vamos a verlo con un ejemplo gráfico:
esquema conexión cliente FTP servidor FTP
Nosotros estamos trabajando en nuestro PC que es el que tiene la IP 192.168.1.2. Recordemos que esto es una IP privada, que solo "tiene validez" dentro de nuestra red local. El router se encargará de convertir nuestra IP privada en una IP pública, en nuestro ejemplo se convertirá nuestra IP privada 192.168.1.2 en la IP pública 80.5.63.7 y llegamos al servidor FTP que tiene la IP 87.25.67.5. Si en este punto mirásemos el log del servidor FTP veríamos que se ha conectado un usuario desde la IP 80.5.63.7 y no desde 192.168.1.2, esto es porque en internet nosotros aparecemos con nuestra IP pública. Así que a ojos del servidor FTP nosotros somos 80.5.63.7.

Bien ya tenemos creado nuestro canal primario. Enviamos al servidor el comando para descargar un archivo y este se dispone a crear el canal secundario para entregarnos este archivo por el canal secundario y que nosotros podamos seguir dándole ordenes por el canal primario. Entonces como para el servidor nosotros somos el cliente con IP 80.5.63.7 el servidor FTP intentará craear un canal secundario con la IP 80.5.63.7. Pero esta es la IP de nuestro router, y cuando detecta que un servidor intenta establecer una conexión no sabe qué hacer y no nos redirige la petición a nuestro PC 192.168.1.2, con lo cual el canal secundario nunca se establece y falla. Este es el motivo por el que parece que el servidor se queda colgado. Realmente no es que se haya quedado colgado es que por nuestra configuración de red el servidor FTP no ha sabido establecer con nosotros el canal secundario necesario para hacer la descarga del archivo.

Modo activo y modo pasivo, comando PORT y PASV

Para solucionar el problema descrito anteriormente tenemos comandos para indicar al servidor la arquitectura de nuestra red y así poder trabajar de forma correcta con el servidor, sin que el nuestra arquitectura sea un impedimento. El modo activo y el modo pasivo indican quien abre el canal secundario y quien espera la conexión. En modo pasivo las conexiones son siempre abiertas por el cliente, mientras que en modo
activo se abren por el que envía los datos, el servidor. En el ejemplo anterior el servidor (que por defecto tiene establecido el modo activo) es quien crea el canal secundario con nosotros encontrándose la dificultad del router, si nosotros habilitamos el modo pasivo seremos nosotros quienes crearemos el canal secundario y así evitamos que la conexión quede colgada en el router. Al igual que nosotros hemos sido capaces de establecer el canal primario también debemos ser capaces de craear el secundario si ningún firewall nos lo impide.

Solución comando PORT ftp server

Con este comando nosotros indicamos al servidor FTP dónde estamos esperando la conexión. ¿Cómo y en qué situaciones este comando nos puede ayudar? Supongamos que el administrador del firewall o cortafuegos que protege al servidor FTP ha denegado todas las nuevas conexiones que se le hagan por puertos distintos al 21, con esta configuración nosotros no podriamos establecer el canal secundario ya que su cortafuegos nos lo impediría. En este caso podemos hacer uso del comando PORT para indicar al servidor FTP cómo ha de conectarse a nosotros.

En primer lugar. en nuestro router debemos de mapear un puerto (es un concepto que veremos mas adelante que consiste en hacer que cuando el router detecte una conexión en un puerto nos la envíe a nuestro PC). Así mapeando un puerto hacemos que cuando el servidor FTP se conecte con nuestro router para establecer el canal secundario en el puerto que le especifiquemos ésta conexión sea redirigida a nuestro PC y así no se queda "parada" en nuestro router. Supongamos que mapeamos el puerto 6970. A efectos práticos, toda conexión que llege a la IP pública de nuestro router (80.5.63.7) al puerto 6970 será redirigida a nuestra IP privada (192.168.1.2) al puerto 6970. Así que debemos indicar al servidor FTP que queremos que establezca el canal secundario con nuestra IP pública en el puerto 6970 (80.5.63.7:6970). Esto lo hacemos así:

PORT 80,5,63,7,27,58

Veamos con detalle de donde han salido estos números, los 4 primeros 80 5 63 y 7 hacen referencia a nuestra IP, los 2 siguientes 27 y 58 al puerto. ¿Cómo se han calculado? Así; queríamos indicar al servidor el puerto 6970 entonces hemos hecho lo siguiente: 27x256=6912; 6912+58 = 6970 Si tu quieres calcular estas 2 componentes para cualquier puerto, primero divide el puerto entre 256 quédate con la parte entera, luego multiplica la parte entera por 256, el segundo número es al diferencia entre el resultado obtenido el y el puerto en cuestión.

Solución comando PASV ftp server

Si nos encontramos en una red local en la que nos es imposible configurar nuestro router para mapearnos un puerto entonces nuestra única solución será indicarle al servidor FTP que seremos nosotros quienes crearemos el canal secundario. Para esto primero pasamos el comando PASV sin parámetros para indicar al servidor esta condición. Seguidamente le pasamos un comando PORT para indicarle al puerto del servidor FTP al que deseamos conectarnos. Esta sería la secuencia

PASV
PORT 87,25,67,5,27,58

Primero hemos establecido el modo pasivo y luego le hemos dicho que nos vamos a conectar a su IP al puerto 6970, ahora cuando hagamos el comando GET para descargar el archivo se creará el canal secundario con la configuración indicada.

Esto es todo por hoy, haced pruebas, en la próxima entrega utilizaremos estos comandos para hacer esas cosas que en principio no se deben hacer, pero que debes de saber cómo se hacen si quieres ser un buen administrador de redes y así proteger tu red.

Comentarios

Estos comandos, PASV y PORT, donde deben ser ejecutados exactamente? en la cmd una vez conectados al FTP? desde ahí me dice que tales comandos no existen.

Y otra duda respecto a la entrega anterior, ¿es posible activar el comando SITE EXEC en tu propio servidor FTP?

Hola Ivan, ciertamente estos comandos se ejecutan desde la consola (CMD) una vez estás conectado al servidor. Ya que lo que estamos haciendo es trabajar con una sesión iniciada en el servidor FTP. En algunos servidores es necesario incluir el comando "literal" antes del comando a ejecutar, que es para que lo pase tal cual. Entonces, en vez de lanzar el comando:
PASV
Lanza el comando de la siguiente forma:
literal pasv

Y como puedes ver añadiendo "literal" el servidor acepta el comando perfectamente.

Con respecto al comando SITE EXEC, la mayoría de los servidores FTP no lo incluyen, ya que se considera un agujero de seguridad, si deseas ejecutar comandos en un servidor remoto, espera a las entregas de TELNET y SSH, con ellos si podrás ejecutar comandos de forma segura.

Saludos.

Perfecto, que rapidez jajaja muchas gracias

mi duda viene dada por el formato de la dirección de red y el puerto para PORT y PASV... A que se debe ese formato? ¿Como es que no se utiliza el formato xxx.xxx.xxx.xxx:xxxx? muchas gracias y felicidades por el curso

Buenas Jaime. Esto es así debido a que el comando PORT está programado para recibir 6 parmetros separados por comas. Los cuatro primeros hacer referencia a los 4 octetos que forma la ip. Por ello pasar la IP 192.168.0.1 se pasaría como 192,168,0,1. Los otros 2 parámetros que faltan para llegar a 6 se utilizan para pasar el puerto en que establecerá el canal secundario y se pasa de la siguiente forma; primero divide el puerto entre 256 quédate con la parte entera, luego multiplica la parte entera por 256, el segundo número es al diferencia entre el resultado obtenido el y el puerto en cuestión. Viendo un ejemplo práctico si quierer por ejemplo pasar la dirección 192.168.0.1 y puerto 80 (192.168.0.1:80) Deberías pasar los siguientes parámetros PORT 192,168,0,1,0,80

Saludos

Hola admin,

Genial, muchas gracias por la aclaración. Solo una pequeña cosa mas... y para evitar confusiones, ¿podeis corregir el pequeño errata que hay en PORT y PASV PORT en el ejemplo en negrita donde se ha colado un par de puntos en vez de comas? Un saludo y gran trabajo ;)

Gracias por el aviso ;)

Buenas tardes estimado!

Estuve leyendo su publicación y está excelente! Gracias por ayudarnos!

Pido de su ayuda, (aunque el error lo tengo identificado) tengo problema para establecer una conexión FTPS con un puerto definido 47555 y si establece la primera conexión, pero cuando se establece la segunda conexión (Data Channel) no, me muestra “Error al listar el directorio”, uso como FileZilla como cliente, Windows 2008R2 IIS7 como Servidor FTPS y entre ellos hay un ASA, donde logramos identificar que la segunda conexión usa otro puerto dinámico, ahí procedí a investigar un poco más para tratar de no usar tantos puertos estoy buscando la forma de usar uno solo y no tener tantos puertos abiertos, claro, si es posible, entonces encontré esto, los cuales se agregaron al ASA pero son muchos puertos dinamicos (49152 a 65535):

“El intervalo de puertos dinámicos predeterminado para TCP/IP en Windows Server 2008

Los números de puerto se dividen en tres categorías: los puertos conocidos, los puertos registrados, y los puertos dinámicos y/o privados. 

  • Los puertos conocidos están comprendidos entre 0 y 1023.
  • Los puertos registrados están comprendidos entre 1024 y 49151.
  • Los puertos dinámicos y/o privados van de 49152 a 65535.

Puede ver el intervalo de puertos dinámicos en un equipo que está ejecutando Windows Vista o Windows Server 2008 con los comandos de netsh siguientes:

  • netsh int ipv4 show dynamicport tcp
  • netsh int ipv4 show dynamicport udp

Este intervalo se ajusta mediante el comando:

netsh int < ipv4|ipv6 > establece inicio dinámica < tcp|udp > =número num =intervalo

Los siguientes son ejemplos de comandos

  • netsh int ipv4 set dynamicport tcp start=10000 num=1000
  • netsh int ipv4 set dynamicport udp start=10000 num=1000

Este comando establece el intervalo de puertos dinámicos para TCP. El puerto de inicio es el númeroy el número total de puertos es el intervalo.”

Mi pregunta es: ¿Es posible hacer esto? De usar un puerto definido para el Control y otro para Data Channel.

Disculpas, si tienes alguna házmelo saber, igual agradezco tus comentarios.

Saludos,

Richard

Trate de usar el comando PASV pero me sale que es para IPv4 y que yo estoy usando IPv6 y que debo usar el comando EPSV, me podrian decir como lo debo usar,solo es el nombre del comando lo que cambia o debo usarlo de otra forma.

Abre una consola de comandos (CMD) y ejecuta el comando ipconfig con ello podrás ver la IP con la que estás trabajado.

Una vez lo tengas dinos que IP tienes para poder corregir el problema.

Saludos.

Hola, me pasa lo mismo y al usar el ipconfig me dice q uso ipv6 y una dirreccion hexagesimal enorme

gracias

Para entrar a modo pasivo usando el protocolo ipv6 escribi en la consola el comando: 

literal epsv

Hola muy interesante lo que publicas.

Estoy teniendo problemas para enviar unas imagens por FTP a un seervidor externo , necsito hacerlo desde "cmd" pues de esta manera puedo programar una tarea enn Windows y ejecutarla periodicamente.

En el anteror servidor que teneiamos alojada la web funcinaba sin problemas, pero en el nuevo servidor me conecta perfectamente e incluso me direcciono a la carpeta cerrecta con cd xxx/xxx, pero partir de aqui el comando mput para transferir las imagenes solamente responde 200 port command sucessfull y al cabo de un tiempo da conexion cerrada por el servidor remoto y no ejecuta nada.

he probado a forzar el modo pasivo, el modo binario, pero todo sigue igual. ¿alguna idea o comentario?

gracias

Hola Diego.

Mucho me temo que el problema es que se puede establecer el canal secundario. Si estás trabajando cun servidor FTP fuera de tu red local, es decir, en internet muy probablemente estén fallando los mapeos de los routers. Si por el contrario,si estás trabajando en red local lo que podría estar bloqueando la conexión secundaria de datos es el cortafuegos. 

Prueba a utilzar WinSCP, y ves la traza que hace. Luego trata de replicarla por comandos y podrás determinar el problema y hayar la solución.

Un saludo.

Buenas noches, he tratado de replicar lo explicado en este tema desde el terminal de Ubuntu y no soy capaz de usar el modo activo y modo pasivo desde el mismo ni siquiera usando el "literal" delante como hago desde la linea de comandos de windows donde si me funcionan si los precedo de esta palabra.

Dependen estos comandos acaso del cliente que este usando o es que en linux estos comandos tienen una forma diferente de usarse? Pense que era el server el que determinaba que estos no funcionasen si no usaba el comando "literal" delante pero estoy tratando de conectarme con ambos al mismo servidor y no lo consigo.

Gracias y un saludo

En entornos basados en Debian, como es ubuntu no suele ser necesario utilizar el comando: "literal". Para ver con mas detalle tu problema puedes abrir un hilo en el foro con algunas capturas de pantalla y analizamos tu caso.

Un saludo.

Agradezco tu tiempo por compartir tus conocimientos, en verdad te estoy muy agradecido, muy bien explicado. Gracias

De antemano enhorabuena y gracias por llevar a cabo este trabajo, supongo que no soy el unico que os estara eternamente agradecido por haberos atrevido a acercar de una forma tan participativa y paciente este mundo a un publico tan diverso. De nuevo gracias.

Y ahora haceros una pregunta sobre un error. Escribo los siguientes comandos:

(oreviamen,te le he indicado al servidor que escuche en el puerto que habeis usado vosotros, el 6970)

literal pasv

literal port 192,168,1,30,27,58

literal retr XP.iso 

 

entonces habre un canal con el servidor, y este se queda colgado.Si hago un get simplemente sin el port, descarga el archivo sin ningun problema.

Muchas gracias

Mil gracias. Es perfecto, claro y conciso. Realmente myu bueno..

Buenas! Cada vez que ejecuto el comando:

PASV

y luego hago

PORT 192,168,0,1,0,80

el host me cierra la conexion, alguna sugerencia? Gracias!

Quería saber de donde sacan el número de puerto 6970 del ejemplo que luego dividen con 256, etc, etc

Es un número aleatorio en el cual se creará el canal de transferencia de archivos entre el servidor y el cliente.

La única condición para elegir un número de puerto es que no esté siendo utilizado por otro servicio. Para comprobarlo se puede hacer mediante comandos (diferentes en cada sistema operativo) o bien buscando google/wikipedia, ya que hay servicios con puertos 'tipicos'.

Si te ha sido de utilidad Compárteme