User Tools

Site Tools


scripts_con_suid

This is an old revision of the document!


Como ejecutar scripts con el bit SUID activado

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

scripts_con_suid.1608933466.txt.gz · Last modified: 2020/12/25 22:57 by 127.0.0.1