Exención de responsabilidad rápida: entiendo completamente que el código que estoy intentando escribir es inseguro, y permite que usuarios arbitrarios puedan acceder a la raíz. Estoy escribiendo un programa de C simple como este para demostrar cómo funciona la escalada privilegiada para aquellos que no están familiarizados.
Lo que tengo ahora es un simple programa en C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int BUFFERSIZE = 512;
void main(int argc, char** argv) {
char ipaddr[BUFFERSIZE];
snprintf(ipaddr, BUFFERSIZE, "ping -c 4 %s", argv[1]);
if(setuid(0) == -1) printf("setUID ERROR");
system(ipaddr);
}
Compilo este código como root y configuro los permisos como tales:
-rwsr-xr-x 1 root root 16840 Oct 28 14:13 pingSys
Como puede ver, el bit setUID se invierte. Entonces, lo que debería suceder, es si ejecuto el programa así:
./pingSys 127.0.0.1; /bin/sh
Debería ejecutar ping -c 4 127.0.0.1; /bin/sh
como usuario root y generar un shell. Pero en cambio, me sale esto:
user@localhost:~/privEsc$ ./pingSys 127.0.0.1; /bin/sh
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.089 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.118 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.089 ms
--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 59ms
rtt min/avg/max/mdev = 0.034/0.082/0.118/0.031 ms
$ whoami
user
¿Qué está mal aquí? Tengo el bit setUID invertido en el ejecutable, e incluso intenté ejecutar la función setuid(0)
, que no produce un error. Estoy muy confundido en cuanto a por qué no puedo generar un shell como root porque en todas partes he visto que esto ha funcionado.
¿Alguna idea?