Como ejecutar scripts con el bit SUID activado
Recopilación de aplicaciones que pueden explotar el bit suid o sudo: https://gtfobins.github.io/
Por defecto la inmensa mayoría de distribuciones no permiten la ejecución de scripts con el bit SUID activado por motivos de seguridad. La solución es crear un ejecutable en C con SUID activado y que este llame o ejecute al script necesario. También se podría hacer con el SGID.
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <unistd.h> int main() { setuid( 0 ); system( "/opt/aplicacion/script.sh" ); return 0; }
Compilando el código C.
gcc runscript.c -o runscript
Dando permisos rwx + SUID (4775)
chown root:root execscript chmod 4755 execscript
Al ejecutar el programa se ejecutará como root el script especificado en el código.
Otra alternativa sería utilizar shc: Generic shell script compiler
Problema de seguridad a ejecutar scripts con el bit SUID activado
Si el script se sustituye por uno que ejecute /bin/bash, se estaría haciendo un escalado de privilegios y se obtendría una shell Bash como usuario root.
Supongamos que no se ejecuta un script, si no un binario / comando, pero no indicando la ruta completa dentro de la función “system”, por ejemplo el comando “ls”.
system( "ls" );
Al no indicar una ruta completa, se nos permite poder escalar privilegios al poder modificar la ruta sin necesitar privilegios sobre “runscript” o el binario “/bin/ls”. Para ello usaremos la variable PATH, esto sería suficiente para obtener root en el sistema.
cp /bin/bash $HOME/ls # Se podría usar un enlace, un script que apunte a bash export PATH=$HOME:$PATH
Ahora al ejecutar “runscript”, Linux buscará el comando ls, como se ha indicado en la variable PATH que se debe buscar “ls” primeramente en /home, se ejecutará $HOME/ls con el suid 0, recibiendo así una consola de root.
Como recomendación se debe evitar el uso del suid, hay aplicaciones que son más agradecidas a la hora de permitir la escalada de privilegios, veamos algunos ejemplos.
SUID en vim.basic.
ls -lt /usr/bin/vim lrwxrwxrwx 1 root root 21 Feb 2 15:45 /usr/bin/vim -> /etc/alternatives/vim ls -lt /etc/alternatives/vim lrwxrwxrwx 1 root root 18 Feb 2 15:45 /etc/alternatives/vim -> /usr/bin/vim.basic ls -lt /usr/bin/vim.basic -rwsr-xr-x 1 root root 2437320 Nov 24 2016 /usr/bin/vim.basic # Tiene el SUID activo
Ahora se podría abrir /etc/sudoers y adaptar nuestro usuario para que tenga el máximo privilegio.
usuario ALL=(ALL:ALL) ALL
También se podría modificar la password del usuario root en “/etc/shadow”, agregar un comando “adduser usuario sudo” dentro del .bashrc de root para que cuando el admin ingrese nos incluya en el grupo de sudo, etc.
Buscar ficheros con SUID o GUID activado.
# Busca ficheros con root como propietario con SUID activado. find / -user root -perm -4000 # Busca ficheros con root como propietario con SGID activado. find / -group root -perm -2000 # Busca ficheros de cualquier usuario con SUID y SGID activos. find / -perm -4000 -o -perm -2000 # Busca ficheros que no pertenecen a ningún usuario. find / -nouser # Busca ficheros que no pertenecen a ningún grupo. find / -nogroup # Busca enlaces simbólicos y muestra a donde apuntan. find / -type l -ls
Lectura recomendada: http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html