Obteniendo root con setuid y la bandera s

1

Ok, entonces estoy tratando de envolver mi cabeza en torno a lo que hace la bandera s en Linux.

Tengo el siguiente código:

#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <stdio.h>

int main(int argc, char **argv, char **envp)
{
  gid_t gid;
  uid_t uid;
  gid = getegid();
  uid = geteuid();

  printf("gid %d\n",gid);
  printf("uid %d\n",uid);

  setresgid(gid, gid, gid);
  setresuid(uid, uid, uid);

  system("id");
}

y la marca s está establecida para el usuario.

-rwsr-xr-x 1 root root 7358 2017-08-24 17:45 a.out

a mi entender, ya que la marca s está activada, el gid efectivo y el uid deben ser el usuario.

Sin embargo, cuando ejecuto este archivo como otro usuario, obtengo lo siguiente.

nebula@nebula:/tmp$ ./a.out 
gid 1000
uid 1000
uid=1000(nebula) gid=1000(nebula) groups=1000(nebula),4(adm),20(dialout),24(cdrom),46(plugdev),108(lpadmin),109(sambashare),110(admin)

Creo que esto demuestra que el uid y el gid efectivos no se configuraron como yo hubiera pensado.

¿Alguna ayuda? Gracias!

    
pregunta MikeSchem 25.08.2017 - 02:51
fuente

2 respuestas

1

Los sistemas de archivos se pueden montar con setuid deshabilitado. Esto normalmente se realiza en dispositivos extraíbles (porque el administrador no tiene control sobre lo que contiene el dispositivo extraíble) y en los sistemas de archivos de la red (a menos que el sistema de archivos esté montado desde un servidor confiable). Es una buena práctica hacerlo para todos los sistemas de archivos que no deben permitir la escalada de privilegios, como un sistema de archivos para archivos temporales.

Verifique el punto de montaje donde se encuentra su ejecutable setuid:

df /tmp

Es probable que en su máquina, /tmp sea un sistema de archivos separado; verá /tmp en la columna "Montado en". Verifique las opciones de montaje para /tmp ; en Linux puedes buscarlos en /proc/mounts :

grep /tmp /proc/mounts

Si ve nosuid como una de las opciones en la cuarta columna, el sistema de archivos se monta con setuid y setgid deshabilitado: ls aún enumera los bits y chmod todavía los cambia, pero no tienen efecto.

Haz tus experimentos en otro sistema de archivos. Por lo general, /var/tmp se monta en el mismo sistema de archivos que / y ese necesita que setuid esté habilitado para programas como (/usr)/bin/su y (/usr)/bin/sudo .

Los bits setuid / setgid también se pueden desactivar a través de un marco de seguridad como SELinux. Vea este hilo en ServerFault sobre cómo investigar esto.

    
respondido por el Gilles 25.08.2017 - 10:25
fuente
0
  1. Parece que hay un error menor en tu programa.

Usted tiene el bit s establecido solo para el propietario, no para el grupo, pero está usando el gid cuando para todos los parámetros en setresuid & setresgid (líneas 17 y 18). [edit:] Debido a esto, el gid pertenecerá al usuario que ejecuta el programa, no al propietario de a.out.

Si cambia los parámetros de esas líneas a uid, debería obtener el resultado esperado. Sujeto a # 2 a continuación.

  1. La salida para el geteuid parece anómala. Debería ser 0. Lo investigaría si fuera tú. Aunque no puedo replicarlo.

Si solo te preocupa por qué setresuid y setresgid no funcionan correctamente, configúralos en 0 (o cualquier número de uid / gid válido) y observa qué sucede.

Por cierto, debes verificar sus valores de retorno.

    
respondido por el Sas3 25.08.2017 - 06:43
fuente

Lea otras preguntas en las etiquetas