Hola a tod@s, hoy os traigo un nuevo caso práctico el cual se requiere la demostración de un escalado de privilegios en Linux, en mi caso he decidido seleccionar una técnica sugerida, la técnica a utilizar es la que aprovecha los “Linux Capability”.
¿Qué es Linux Capability?
“Linux Capability” forma un rol importante en la seguridad de los usuarios, específicamente en los casos en los que un usuario tiene la necesidad de tener privilegios elevados para realizar cualquier acción. Normalmente este tipo de elevaciones de privilegios en los usuarios se suele otorgar dando permisos con sudo o con permisos setuid, pero en este caso se puede realizar la misma acción de manera más segura con “Linux Capability”.
Por así decir, las capacidades de Linux son atributos especiales en el núcleo Linux que otorgan privilegios específicos a los procesos y ejecutables binarios que normalmente están reservados para procesos cuyo ID de usuario es 0, es decir el usuario raíz del sistema (root).
A modo de ejemplo, se expone el siguiente caso, supongamos que tenemos un usuario y este está ejecutando un proceso como usuario normal, esto quiere decir que nuestro proceso no es privilegiado. Solo podríamos acceder a los datos que son propiedad de dicho usuario o a los datos que han sido marcados para ser tratados por todos. Supongamos que dicho proceso tiene la necesidad de abrir un socket de red, el cual se necesitan permisos del usuario raíz, dicho proceso al estar ejecutado con un usuario normal, no tendría la capacidad de ejecutar el socket. Ahora es cuando entran las capacidades de Linux, gracias a esta característica podemos otorgar permisos especiales a ciertos procesos o binarios para que puedan ejecutar tareas con los permisos que les sean necesarios.
En resumidas cuentas, el objetivo de las capacidades de Linux, es dividir el poder del usuario root en privilegios específicos, de modo que, si un proceso o binario fuese explotado, los permisos de este se verían limitados a los necesarios.
Preparando entorno para escalado de privilegios.
Para preparar una máquina se tiene que dar una casuística la cual un binario tenga otorgados ciertos permisos de “Linux Capability”, para esto, lo primero que necesitamos saber, es como funciona y como podemos realizar una gestión de “Linux Capability”, para empezar, vamos a ver como añadir permisos, pero antes tenemos que tener instalado en el sistema los siguientes paquetes:
libcap2-bin: Paquete que contiene las principales herramientas de gestión (getcap y setcap).
Tras realizar la instalación del paquete, en mi caso ya se encontraba instalado en el sistema operativo, podemos realizar una comprobación de todos los archivos que contienen permisos de las capacidades de Linux. Esto lo podemos realizar con el siguiente comando:
getcap -r / 2>/dev/null
Es habitual encontrarse al comando “ping” como único binario en el sistema con permisos de capacidades de Linux.
En caso de tener la necesidad de querer consultar los permisos que tiene un binario en particular, se haría de la siguiente manera:
getcap /ruta/del/binario
Para nuestro caso, no vamos a utilizar el binario de ping para la escalada de privilegios, si no que vamos a crear o copiar nuestro propio binario, o simplemente copia uno existente simulando la acción de un administrador del sistema que necesita otorgarle la ejecución con permisos del usuario raíz a un usuario normal, esto lo haremos copiando el binario de Python para que el usuario normal “soporte” lo pueda ejecutar con permisos de root, lo que provocará que el usuario normal, tenga la posibilidad de realizar un escalado de privilegios como veremos a lo largo del documento.
Primero procedemos a la copia del binario de Python:
cp /usr/bin/python3 /home/soporte
Una vez hemos copiado el binario para el usuario normal, procedemos a darle permisos completos al binario de Python para que el usuario normal “soporte” pueda ejecutarlo con todos los permisos de root:
setcap cap_setuid+ep /home/soporte/python3
Si comprobamos los permisos que tiene el binario, nos tendrá que mostrar los permisos que acabamos de asignar:
/sbin/getcap /home/soporte/python3
Listo, ya tenemos un binario con permisos de ejecución root, en este caso Python.
Escalado de privilegios con Linux Capability.
Si analizamos un posible escenario, es completamente posible que un administrador por no darle permisos sudo o SUID al usuario en específico, haya preferido permitir la ejecución del binario a través de las capacidades de Linux, en este caso ese binario ha sido Python y el usuario “soporte”.
Supongamos también que el atacante ya ha conseguido acceso a la máquina y tiene sesión con el usuario “soporte” y ha localizado el fichero con los permisos de ejecución del usuario raíz, en este caso “/home/soporte/python3”:
Tras localizar el binario que vamos atacar, comprobamos el usuario y grupo del binario de Python:
ls -al /home/soporte/python3
Como se puede observar en la captura el binario es del usuario y grupo “root”, es decir que es propiedad del usuario raíz, pero para el resto de usuario se le permite la ejecución, pero al tener los permisos de las capacidades de Linux, esta ejecución se realizará como root, en este caso, vamos a ejecutar un bash con Python y al ejecutar este binario (python) con privilegios root, nos devolverá una sesión la cual será de “root”:
./python3 -C ‘import os; os.setuid(0); os.system(«/bin/bash»)’
Como se puede observar en la captura, la sesión que nos ha devuelto es de root, pero al ser escalado desde soporte el GUID sigue siendo de “soporte”, pero el UID es “root”. Esto sería un ejemplo de una escalada de privilegios de las capacidades de Linux.
Considero que esto será una técnica más valorada en el futuro, ya que en teoría es una manera más segura de gestionar/dividir los permisos del usuario raíz sobre los binarios. Esto hará que las capacidades de Linux se implementen en más sistemas para su seguridad y así de esta manera se encontrar los auditores de seguridad malas configuraciones que podrán aprovechar para el escalado de privilegios.
Fuentes:
https://book.hacktricks.xyz/linux-unix/privilege-escalation
http://manpages.ubuntu.com/manpages/bionic/es/man7/capabilities.7.html
https://www.vultr.com/docs/working-with-linux-capabilities/
https://unix.stackexchange.com/questions/515881/what-does-the-ep-capability-mean