RECONOCIMIENTO — Escaneo de puertos
Se lanza un escaneo completo para descubrir la superficie de ataque disponible en la máquina víctima.
| PUERTO | ESTADO | SERVICIO |
|---|---|---|
| 22/tcp | OPEN | SSH |
| 80/tcp | OPEN | HTTP |
La superficie es reducida: una web y SSH. Al intentar acceder directamente por IP al puerto 80, el navegador no puede resolver el nombre de host porque la aplicación espera un virtual host específico. Hay que añadir la entrada correspondiente al fichero /etc/hosts de la máquina atacante:
Con esto ya es posible acceder a la web. A simple vista no hay nada aprovechable en la página principal, así que se procede a enumerar subdirectorios con gobuster:
Gobuster no encuentra nada relevante en la raíz, así que se amplía la enumeración buscando subdominios con ffuf. La idea es que el servidor pueda estar sirviendo aplicaciones distintas según el valor del header Host:
Host. Al hacer fuzzing de subdominios con ffuf, se envían peticiones variando ese header con palabras de un diccionario. Si el servidor responde distinto (tamaño o código de respuesta diferente), es señal de que existe esa aplicación. Aquí se descubren backup.internal.dl y Backup.internal.dl.
Se añaden los subdominios descubiertos al /etc/hosts:
REMOTE CODE EXECUTION — Bypass del WAF con quote splitting
Al acceder a backup.internal.dl se encuentra una aplicación web llamada Directory Inspector. Permite introducir una ruta del sistema de ficheros y listar su contenido. Internamente ejecuta un comando del sistema operativo con la ruta proporcionada.
El primer intento de inyección de comandos con el operador ; resulta bloqueado por el WAF (Web Application Firewall) de la aplicación. Probando con el operador | el error es distinto: ya no bloquea el operador, sino el comando en sí. Esto indica que hay dos capas de filtrado independientes: una para operadores y otra para comandos conocidos.
;, |, etc.) y también si contiene comandos en una lista negra (id, bash, etc.). Sin embargo, la comprobación se hace sobre la cadena completa y de forma literal, sin interpretar el contexto de shell. Esto lo hace vulnerable a técnicas de ofuscación.
El bypass consiste en fragmentar la palabra del comando usando comillas vacías '' en medio de ella. El shell de Linux interpreta las comillas vacías como una cadena de longitud cero y las ignora al ejecutar, reconstruyendo el comando original. Sin embargo, el WAF hace una comparación de subcadenas literal y no reconoce el comando porque aparece partido.
| i''d — El filtro busca la palabra id literalmente. No la encuentra porque está escrita como i''d, así que deja pasar la petición.i''d: las comillas vacías son expansión vacía, así que el resultado es simplemente id. El comando se ejecuta con normalidad.uid=33(www-data) gid=33(www-data) groups=33(www-data). El bypass funciona.Con el bypass confirmado, se construye la reverse shell aplicando la misma técnica de quote splitting a las palabras bash y ash, que también estarán en la lista negra:
b''ash se procesa en tres partes: el literal b, la expansión vacía '' (que produce nada), y el literal ash. Al concatenarlas, bash obtiene bash y lo ejecuta como comando. El WAF, que realiza una búsqueda de subcadena simple sin interpretar el lenguaje de shell, no detecta la palabra prohibida porque está fragmentada. Esta técnica se conoce como quote splitting o quote removal bypass.
ESCALADA HORIZONTAL — Fuerza bruta SSH con Hydra
Estando dentro del sistema como www-data, se explora el sistema de ficheros en busca de información sensible. En el directorio /opt se encuentra un fichero llamado .vault_pass.txt, propiedad del usuario vault pero legible por www-data:
El fichero contiene una lista de contraseñas candidatas. Todo apunta a que alguna de ellas es la contraseña del usuario vault. Se usa Hydra para hacer fuerza bruta sobre SSH con esa lista:
Se accede directamente por SSH en vez de pivotar desde la reverse shell, obteniendo así una sesión más estable e interactiva:
PRIVILEGE ESCALATION — SUID en binario personalizado
Ya como usuario vault, el objetivo es escalar a root. Una de las técnicas más habituales en Linux es buscar binarios con el bit SUID activado. Un binario SUID se ejecuta siempre con los permisos de su propietario (normalmente root), independientemente de quién lo lance:
/usr/local/bin/vaultctl con SUID de root. A diferencia del resto de binarios SUID (que son del sistema y bien conocidos), este es un ejecutable personalizado. Su permiso rwsr-xr-- indica que es ejecutable por el grupo vault — al que pertenece nuestro usuario — y corre con privilegios de root.
Se ejecuta el binario directamente. Sin necesidad de argumentos especiales, vaultctl escala automáticamente los privilegios del proceso actual a root:
vaultctl, al ejecutarse con SUID de root, eleva automáticamente los privilegios a root. Probablemente el binario invoca setuid(0) o lanza una shell sin validar el entorno, lo que es suficiente para obtener acceso completo al sistema.
CADENA DE ATAQUE
backup.internal.dl con una aplicación de inspección de directoriosb''ash e i''d para fragmentar las palabras → RCE como www-datawww-data → se descubre /opt/.vault_pass.txt con lista de contraseñas candidatasYk8$pZ5@cN4! → sesión SSH como vault/usr/local/bin/vaultctl con SUID de root ejecutable por el grupo vault → escalada a root sin argumentos adicionales