Cómo escalar privilegios en GNU/Linux con las Linux Capabilities
Ya por aquí, en "El lado del mal" hemos hablado de escalada de privilegios, más en Windows que en Linux, pero al fin y al cabo de escaladas de privilegios. A través de vulnerabilidades como las Application Screen o el famoso Dirty COW se ha ido viendo que las vulnerabilidades en sistemas GNU/Linux han sido importantes y que es muy importante gestionar el ciclo de vida de la seguridad, así como comenzar con procesos estrictos de Hardening de sistemas GNU/Linux.
Han sido muchos los bugs descubiertos y explotados en proyectos de Ethical Hacking, y el propio su o sudo han sido utilizados por debilidades o fallos a lo largo de su historia algunos bugs sonados e interesantes. Herramientas como Linux Exploit Suggester, una herramienta vista también en Windows a través de Windows Exploit Suggester, y que tiene una implementación acoplada en Metasploit a través de post/multi/recon/local_exploit_suggester, han dado un toque de automatización siempre con valor a la búsqueda de la escalada de privilegios.
Figura 2: Explotacion de Dirty Cow en GNU/Linux
Antes de nada, ¿qué son las Linux Capabilities?
Si queremos que un usuario pueda hacer uso de una herramienta o de una característica del sistema como super usuario podríamos utilizar varias cosas, un SetUID, un Sudoer, pero quizá le daríamos más ‘poder’ del que requiera, abriendo una puerta. Las capabilities llegan a GNU/Linux en la versión 2.2 de su kernel y pretenden delimitar las acciones que puedes hacer como root. Un buen eslogan sería “no le hagas root, dale solo lo que necesita”.
(Revisada y Ampliada) de Carlos Álvarez y Pablo González en 0xWord
En otras palabras, las capabilities permiten segmentar los privilegios de un root en GNU/Linux. Es decir, podemos dividir estos privilegios en varios valores. Es una granularidad o segmentación, sin duda, interesante a la hora de hacer hardening de servidores GNU/Linux. Una de las cosas más interesantes que con las capabilities, un usuario no tiene que tomar la identidad de root como, por ejemplo, ante la ejecución con sudo. Un usuario puede realizar solo la operación para la que se le dio ese privilegio, pero nada más.
Figura 4: Libro de Linux Exploiting en 0xWord. |
- Permitted: Capabilities que son añadidas al proceso durante su ejecución, a través de execve().
- Effective: Es un bit que indica que si se ejecuta con execve(), las capabilities permitidas se incluyen en el nuevo conjunto.
- Inheritable: Un fichero tiene un conjunto de capabilities y otro conjunto (o subconjunto) con el flag de heredable. Se realiza un AND para ver qué capabilities se encuentra en ambos conjuntos para el nuevo proceso hijo que se ejecuta con execve().
En los procesos tenemos cinco tipos de capabilities, que son: heredables, permitidos, efectivos, delimitación y ambiente. En resumen es, las permitidas son las que un proceso puede emplear, mientras que las efectivas son las que el proceso realmente puede utilizar (o efectivas en ese momento) en dicho proceso. La descripción y definición de las capabilities puede ser encontrado en linux/capabilities.h.
Figura 5: linux/capabilities.h
Figura 6: Listado de capabilities
Ahora vamos a ver un listado de capabilites. Como se puede ver en la imagen hay unas cuantas. Es algo vivo, ya que pueden incorporarse nuevos permisos o formas de segmentar un privilegio. La idea está clara, pero, ¿qué ocurre si no se hace bien? ¿qué ocurre si configuramos las capabilities de forma insegura? Podemos abrir la puerta a una escalada de privilegio.
Probando Linux Capabilities y logrando escalada de privilegio
Lo primero es indicar, ¿cómo podemos encontrar las capabilities que hay en el sistema? Es fácil, existe un comando que es ‘getcap’. Con este comando podemos encontrar las capabilities asociadas a los ficheros. Por otro lado, tenemos ‘getpcaps’ que nos permite obtener información de las capabilities de los procesos.
Figura 7: Búsqueda de capabilities asociadas a ficheros
Si nos fijamos vemos que hay capabilities y todas tienen el “+ep”, es decir, son permitidas y efectivas. Ninguna es heredable. Ahora vamos a hacer una pequeña prueba. Vamos a intentar hacer un ZIP con el fichero /etc/shadow en su interior. Lógicamente, el usuario ‘pablo’ no tiene privilegios para poder empaquetar dicho fichero.
Figura 8: No se puede zipear el /etc/shadow
¿Cómo se configura una capability? Es una cosa que realizará el administrador del sistema a través del comando ‘setcap’. Por ejemplo, setcap cap_dac_read_search=ep [fichero].
Figura 9: Configurando una capability
Imaginaos que se pretende dar un privilegio al binario zip para que el usuario pueda ‘bypassear’ los permisos de lectura en ficheros y en directorios. Entonces, si probamos a hacer de nuevo el zip sobre el fichero shadow del sistema, tenemos la sorpresa.
Figura 10: Gracias a la capability dada se puede acceder a Shadow
Descomprimimos y, si verificamos permisos, veremos que podemos leerlo. El resultado sería el siguiente. Es un ejemplo sencillo de un fallo en la configuración de capabilities puede dar una escalada de privilegios a un usuario.
Figura 11: Fichero /etc/shadow obtenido
Si revisamos otras capabilities se abre un mundo por dónde la escalada de privilegio puede llegar en un sistema GNU/Linux. Usar capabilities para segmentar privilegios y obtener un impacto menor en muchos escenarios es una realidad, pero una mala configuración puede abrir una segunda puerta.
Saludos,
Pablo González Pérez (@pablogonzalezpe), escritor de los libros "Metasploit para Pentesters: Gold Edition", "Hacking con Metasploit: Advanced Pentesting" "Hacking Windows", "Ethical Hacking", "Got Root", “Pentesting con Powershell (2ª Edición)”, "Pentesting con Kali Silver Edition" y de "Empire: Hacking Avanzado en el Red Team", Microsoft MVP en Seguridad y Security Researcher en el equipo de "Ideas Locas" de la unidad CDCO de Telefónica. Para consultas puedes usar el Buzón Público para contactar con Pablo González - Conseguir 100 Tempos Gratis en MyPublicInbox
Contactar con Pablo González |
No hay comentarios:
Publicar un comentario