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
[…] Bit SUID en shell script (II) […]