Permisos especiales - SUID y SGID

3/12/20254 min read

Como podemos observar vamos a estar utilizando de ejemplo un binario. En mi caso python3.11. Nuevamente buscamos su ruta absoluta con $which python3.11 o bien $command -v python3.11. Y como output podemos observar que nos da su ruta absoluta /usr/bin/python3.11. Seguidamente para no tener que escribir otro comando abajo para ver sus permisos como $ ls -l. Podemos hacerlo todo en un mismo comando con xargs, xargs lo que hace es que; en base al output del primer comando, es decir which, agrega lo que queramos. Por ejemplo: $ which python3.11 | xargs ls -l . Le concatena un ls -l al output de which por lo tanto nos hace un ls -l de /usr/bin/python3.11

$ chmod 4777 /usr/bin/python3.11 - Seguidamente como podemos observar agregamos el numero 4000 a la asignación de permisos para decirle que queremos que este archivo tenga los permisos SUID que posteriormente veremos para son útiles.

Una vez se los asignemos podremos comprobar que los permisos del binario ya no són rwxrwxrwx sino que rwsrwxrwx es decir a nivel de permisos de propietario se le ha cambiado la x por una s.

$ chmod u+s /usr/bin/python3.11 - Nuevamente podemos ver que a parte de agregar dicho permiso con el numero 4000 podemos asignarlo de la siguiente manera con el parámetro +s como vemos en el ejemplo. Y para eliminarlo con el parámetro -s.

$ find / -type f -perm -4000 2>/dev/null - Al ejecutar este comando podremos observar cuantos archivos tienen el permiso SUID permiso en todo nuestro sistema sin necesidad de ser root. ¿Y cómo lo hacemos? Con find le decimos que busque. ¿Dónde? En la raíz / ¿Y qué buscamos? -type un archivo o fichero f con los permisos -perm -4000 donde 4000 indica el permiso SUID y queremos que todos los errores STDERR los mande al 2>/dev/null como vimos anteriormente. Por lo tanto veríamos algo tal que así:

¿Entonces, dónde esta el peligro aquí?

El peligro existe en que gracias a este permiso especial, podemos llegar a corromper el sistema atacante mediante el binario que tenga dicho permiso. Que en este caso seria python. Dónde lo utilizaremos de ejemplo práctico, para que podáis ver nuestra primera explotación. Nuevamente le volvemos a dar los permisos SUID al binario /usr/bin/python3.11. ¿Pero qué gracia tiene esto? Pues que al tener este permiso activado. Siendo el usuario que sea, puedo ejecutar tal binario temporalmente como si fuese el propietario. Es decir root. Por lo tanto...

Si me ejecuto python3, como podemos observar se me abre la terminal de python como root ya que es el propietario del archivo y tiene el permiso SUID de manera temporal IMPORTANTE. Entonces si hago un $ import os para importar la librería de sistema. $ os.setuid(0) donde le decimos que queremos ser el usuario con id 0 que seria root y por ultimo le decimos $os.system("whoami") nos da de output "root". Con esto también podríamos setearnos una terminal interactiva con $os.system("bash") Como vemos en la imagen sin problema alguno

Y lo mismo para SGID que en lugar de ser para el propietario, sería a nivel de grupos. $ chmod 2777 /usr/bin/python3.11 Donde con el permiso 2000 le decimos que queremos agregar el SGID a los grupos. O bien también con $ chmod g+s /usr/bin/python3.11 como podemos observar en la imagen rwxrwsrwx como permisos del binario

Y con este comando podríamos hacer los mismo buscar los archivos a nivel de sistema que tengan SGID con el permiso 2000 y explotarlos.

RECORDAD!!! Lo que hace SUID y SGID es de manera temporal convertirnos en el propietario o grupo de ese archivo o ese directorio. Lo que tenemos que buscar es el binario adecuado para poder crear la shell interactiva y realizar escalada de privilegios.