Bit SUID en shell script (II)

Como vimos en la entrada anterior, el uso de scripts con el bit suid presenta grandes problemas de seguridad. Por eso se recomienda siempre el uso del comando sudo, para la ejecución de scripts con privilegios mayores que el usuario que los ejecute. Como pregunta final del artículo, se comentaba si existía la opción de permitir ejecutar un script con el uso del bit suid activado. La respuesta es que sí, hay una forma de conseguir ejecutar un script como si de root se tratará mediante la ejecución de un programa sencillo en C. No se trata en si de la ejecución de un script suid, pero su resultado sería el mismo.

Vamos a explicarlo con un ejemplo, que se va a desarrollar sobre el directorio /tmp/prueba. Comenzaremos creando el script que queremos ejecutar como root de nombre shell.sh:

#!/bin/bash
grep -c "*" /etc/shadow

A continuación creamos un programa en C llamado pr.c:

#include <sys/types.h>
void main(){
   setuid(0);
   system("/tmp/prueba/shell.sh");
}

Compilamos el programa, le asignamos permisos de suid al usuario y de ejecución a “otros”:

# gcc pr.c -o pr.exe
# chmod 4001 pr.exe

Comprobamos si conseguimos mostrar el contenido del fichero shadow:

$ id
uid=1000(prueba) gid=1000(prueba)
grupos=4(adm),20(dialout),24(cdrom),46(plugdev),104(lpadmin),115(admin),120(samb
ashare),1000(prueba)
$ grep -c "*" /etc/shadow
grep: /etc/shadow: Permiso denegado
$ ls -l shell.sh
-rwxr-xr-x 1 root root 36 2010-03-13 14:25 shell.sh
$ ./shell.sh
bash: ./shell.sh: Permiso denegado
$ ls -l pr.exe
---S-----x 1 root root 9891 2010-03-13 14:31 pr.exe
$ ./pr.exe
29

Como ven, gracias a llamar primero al ejecutable pr.exe, quien activara el suid a 0 (root), podremos ejecutar el script como si de un usuario root se tratará. Para terminar, y como reflexión, ¿que ocurriría si sustituyen en el programa pr.c la orden ‘system(“/tmp/prueba/shell.sh”);‘ por ‘system(“/bin/bash -s”);‘?

Compruébenlo ustedes mismos:

$ id
uid=1000(prueba) gid=1000(prueba)
grupos=4(adm),20(dialout),24(cdrom),46(plugdev),104(lpadmin),115(admin),120(samb
ashare),1000(prueba)
$ ls -lrt /bin/bash
-rwxr-xr-x 1 root root 917960 2009-09-14 07:08 /bin/bash
$ ./pr.exe
# id
uid=0(root) gid=1000(prueba)
grupos=4(adm),20(dialout),24(cdrom),46(plugdev),104(lpadmin),115(admin),120(samb
ashare),1000(prueba)
# grep -c "*" /etc/shadow
29

Trackbacks

  1. […] This post was mentioned on Twitter by Security Art Work. Security Art Work said: Joaquín acaba la serie de Bit Suid en shell scripts mostrando cómo ejecutar scripts setuidados: http://bit.ly/dzKXtk […]