miércoles, febrero 10, 2021

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

Figura 1: Cómo escalar privilegios en GNU/Linux con las Linux Capabilities

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

Pero como hemos comentado en otros artículos, en el caso de Windows, no todo es buscar una falta de actualización o una aplicación vulnerable. Necesitamos conocer las debilidades, donde encontrar las debilidades en un sistema GNU/Linux. Podemos hacer un listado a modo de procedimiento, pero hoy hablaremos de las Linux Capabilities como uno de los focos dónde buscar y encontrar algunas debilidades en un sistema 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.

Sin duda, queda claro que es una funcionalidad de seguridad interesante y, en muchos casos, poco explotada desde el punto de vista defensivo que, en muchos casos, sigue delegando cuentas y permisos de forma más genérica. Sin ir más lejos, los contenedores y los entornos de virtualización utilizan las capabilities para gestionar contextos de seguridad. Lo que permite dificultar mucho más la explotación de vulnerabilidades en entornos GNU/Linux.

Figura 4: Libro de Linux Exploiting en 0xWord.

Las capabilities se aplican sobre ficheros y procesos, esto es importante, utilizaremos una serie de comandos como son getcap, setcap y getpcaps. Las capabilities en ficheros tienen un juego de tres opciones que son las siguientes:

- 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

El resumen es que cuando ejecutemos un proceso, éste pueda realizar una acción privilegiada, sin necesidad de que se esté ejecutando con un privilegio de super usuario. En caso de ser vulnerado, no tendría el efecto esperado por el atacante, como si ocurriría en caso de no utilizar capabilities.

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.

No hay comentarios:

Publicar un comentario