the_open_door
café
ESEN
← Volver al índice

cap_sys_ptrace capability abuse

Arsenal completo de comandos en la cheatsheet

Las capabilities de Linux trocean los poderes de root en permisos concretos que se pueden asignar a un binario. cap_sys_ptrace habilita las llamadas ptrace(2), process_vm_readv(2) y process_vm_writev(2): permite adjuntarse a otro proceso, leer y escribir su memoria. Está pensada para depuradores (gdb, strace), pero si se concede a un intérprete (por ejemplo python2.7), quien lo ejecute puede inyectar código en cualquier proceso al que tenga acceso, incluidos los que corren como root.

Se detecta con getcap:

getcap -r / 2>/dev/null
# /usr/bin/python2.7 = cap_sys_ptrace+ep

El +ep significa effective + permitted: la capability está activa al ejecutar el binario. La escalada consiste en inyectar un shellcode en un proceso de root. El flujo habitual:

  1. Elegir un proceso víctima que corra como root y sea estable (Apache, un demonio):
ps -faux | grep apache   # anotar el PID
  1. Con un script en Python que use ctypes + ptrace, adjuntarse a ese PID, escribir en su memoria un shellcode (por ejemplo una bind shell en el puerto 5600) y desviar la ejecución hacia él.
  2. Conectarse al puerto que abre el shellcode: la shell hereda el uid=0 del proceso secuestrado.
python2.7 exploit.py <PID_de_root>
nc <ip> 5600      # shell como root

No hay que romper ninguna contraseña ni explotar un fallo de memoria del kernel: la capability es el permiso para manipular la memoria ajena.

Requisitos. Un binario con cap_sys_ptrace ejecutable por nuestro usuario, un proceso de root al que adjuntarse y (salvo endurecimiento) que no haya un filtro seccomp restringiendo ptrace. Yama (/proc/sys/kernel/yama/ptrace_scope) puede limitarlo, pero la capability suele bastar para saltárselo.

Cómo detectarlo. La firma inequívoca es una llamada ptrace(PTRACE_ATTACH/POKETEXT) o process_vm_writev de un proceso no privilegiado (un python/perl) sobre un proceso root: auditd con -a always,exit -F arch=b64 -S ptrace la registra, y una regla seccomp/eBPF puede alertar. En reposo, getcap -r / mostrando cap_sys_ptrace sobre un intérprete es ya la desviación. La consecuencia observable es un proceso servidor estable (Apache, un demonio) que de pronto abre un socket en escucha inesperado (la bind shell) o lanza /bin/sh sin motivo, con su memoria alterada por otro PID.

Defensa. No asignar cap_sys_ptrace a intérpretes ni a binarios de uso general; reservarla para depuradores concretos, aislar con seccomp y subir ptrace_scope. Emparenta con abuso de cap_setuid como otra capability peligrosa.

Herramientasgetcap

Máquinas donde se aplica