Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 0xDani en 28 Agosto 2012, 13:37 pm



Título: Saber si un usuario es root en linux.
Publicado por: 0xDani en 28 Agosto 2012, 13:37 pm
Bueno mi duda es: cuando te identificas como administrador en linux, tu ID cambia a 0, o pasas a formar parte del grupo de root? Es decir, bastaria con hacer esto para saber si alguien es root?:
Código
  1. #include <unistd.h>
  2.  
  3. int main()
  4. {
  5.  while(1)
  6.  {
  7.    if(!geteuid())
  8.     {
  9.      //Codigo aqui
  10.     }
  11.    else sleep(15);
  12.  }
  13. return 0;
  14. }
  15.  

O habria que hacer algo mas?

Saludos.


Título: Re: Saber si un usuario es root en linux.
Publicado por: WIитX en 28 Agosto 2012, 16:48 pm
No entiendo bien tu pregunta, pero creo que para crear un usuario con privilegios en linux es este código.

Código:
useradd -u 0 -o -g 0 "nombre_de_usuario"


Título: Re: Saber si un usuario es root en linux.
Publicado por: tremolero en 28 Agosto 2012, 16:58 pm
yo no tengo ni idea de como se hace, pero sino me equivoco lo que el quiere saber es como puede comprobar si el usuario que esta usando es root.

Saludos...


Título: Re: Saber si un usuario es root en linux.
Publicado por: 0xDani en 28 Agosto 2012, 17:33 pm
Esta bien, voy a matizar un poco la cuestion, lo que yo quiero es que el programa pueda saber cuando el usuario tiene privilegios de root, la cuestion es, ¿si yo tengo ese programa funcionando, y el usuario se loguea como root, por ejemplo para instalar actualizaciones, una llamada subsiguiente a geteuid() devolvera 0, y mi proceso obtendra privilegios de root? ¿O eso seria demasiado facil, y hay que liarla mas?


Título: Re: Saber si un usuario es root en linux.
Publicado por: 0xDani en 28 Agosto 2012, 18:41 pm
¿Este codigo serviria, o es estupido hacer algo asi?

Código
  1. #include <unistd.h>
  2. #include <signal.h>
  3. #include <stdio.h>
  4.  
  5. void pass();
  6. int check_root();
  7.  
  8. int main()
  9. {
  10.  if(check_root());
  11.   {
  12.    //Codigo privilegiado.
  13.   }
  14.  else
  15.   {
  16.    sleep(30);
  17.    pass();
  18.   }
  19.  exit(0);
  20. }
  21.  
  22. void pass()
  23. {
  24. int childpid = fork();
  25.  if(childpid==-1)
  26.  {
  27.    perror("fork");
  28.  }
  29.  if(!childpid)
  30.  {
  31.    int ppid = getppid();
  32.    kill(ppid, SIGQUIT);
  33.    if(check_root())
  34.     {
  35.      //Codigo privilegiado.
  36.     }
  37.    else pass();
  38.  }
  39.  else sleep(10);
  40. }
  41.  
  42. int check_root();
  43. {
  44.  if(!geteuid()) return 1;
  45.  else return 0;
  46. }
  47.  

Basicamente lo que se supone que deberia hacer es comprobar si el usuario es root, si lo es, ejecuta codigo privilegiado, si no, espera y crea otro proceso que hace lo mismo y mata al padre.

Si esto no funciona siempre puedo tener otro ejecutable que haga esta comprobacion, ejecutarlo con execve(), si funciona ejecuto codigo y si no lo mato y lo vuelvo a llamar a los 30 segundos o asi.

El problema es que no se si alguno de estos metodos es valido para obtener privilegios, es decir, si yo tengo este proceso corriendo, y voy a hacer actualizaciones, para ello me logueo como root, entonces ese proceso obtendria permisos de root?

Si no es asi, como se suele obtener privilegios en entornos *nix??

Saludos.


Título: Re: Saber si un usuario es root en linux.
Publicado por: Foxy Rider en 28 Agosto 2012, 20:01 pm
Effective vs Real UID → http://www.lst.de/~okir/blackhats/node23.html
Si geteuid() es 0, tenés los privilegios de root (yo usaría getuid, honestly) ... por que ése es el UID que identifica SIEMPRE a root, no importa cuál sea el nombre de usuario.

Y dicho sea de paso, podés tener varias cuentas con diferentes nombres de usuario, pero que sean "root", siempre que su uid sea 0.

Saludos.

P.S → Es una a tres líneas verificar si se es root ...


Título: Re: Saber si un usuario es root en linux.
Publicado por: 0xDani en 28 Agosto 2012, 20:40 pm
@Alex Mtx, he visto mas de un ejemplo para comprobar si se es root, y ciertamente es de 1 a 3 lineas, pero esto es mas complejo, es algo asi como tener un proceso en segundo plano esperando a que el usuario sea root para escalar privilegios, y poder ejecutar codigo que requiera de estos privilegios, entre otras cosas asegurarse una forma de mantenerlos.

Si no es viable hacerlo de esta forma, ¿como se suele ganar privilegios en entornos *nix?


Título: Re: Saber si un usuario es root en linux.
Publicado por: Foxy Rider en 31 Agosto 2012, 03:19 am
Bien ... lo primero sería que no crees OTRO proceso, sino un hilo.
Acordate que fork() crea OTRO proceso que hereda los privilegios del proceso padre al momento de llamar a la syscall (y de ahí en adelante, lo que cada proceso haga con sus privilegios, le compete a cada proceso)

Si cambian los privilegios del proceso padre, no es algo de lo que el nuevo proceso (hijo) se entere.
Por lo que deberías correr el código este de verificación DENTRO del proceso que vá a escalar privilegios, y los hilos son la respuesta si no querés bloquear (igual, me la pensaría si usaría hilos y no un main loop tradicional) → http://www.thegeekstuff.com/2012/03/linux-threads-intro/

Pensá que cada proceso tiene sus privilegios, sus archivos abiertos y todo lo demás PROPIO y separado de los demás procesos (más allá de que algunas cosas las heredes con fork, las heredás al momento de la llamada nada más)

Si el proceso padre (A), crea dos hijos B y C ... y luego A escala privilegios, B y C quedan con los privilegios viejos.
Y si A es root, B y C pueden abandonar esos privilegios dejando al padre (A) con privilegios root.

¿Respecto a escalar privilegios? Tenés un montón de maneras (dependiendo si querés privilegios granulares o full, de manera gráfica o no .. de manera "legal" o no)


Saludos.

P.S → No abuses fork(), que degrada la performance !!


Título: Re: Saber si un usuario es root en linux.
Publicado por: 0xDani en 31 Agosto 2012, 14:42 pm
Cita de: Alex Mtx
¿Respecto a escalar privilegios? Tenés un montón de maneras (dependiendo si querés privilegios granulares o full, de manera gráfica o no .. de manera "legal" o no)

Ese punto me gustaria que lo ampliaras, que son privilegios granulares o full, de manera grafica o no, de manera "legal" o no...

He estado indagando sobre escalar privilegios, he visto que se puede hacer con exploits, pero los fallos son rapidamente solucionados. La opcion mas viable que veo es crackear el /etc/passwd, y me estoy mirando el codigo del john para ver como lo hace.

Saludos.


Título: Re: Saber si un usuario es root en linux.
Publicado por: Foxy Rider en 1 Septiembre 2012, 22:14 pm
Citar
Ese punto me gustaria que lo ampliaras, que son privilegios granulares o full, de manera grafica o no, de manera "legal" o no...

Privilegios granulares son básicamente privilegios parciales y no totales ... ponele, privilegios "extra" sólo para una tarea concreta y nada más.
En Linux lo más usado es PolicyKit, pero hay otras formas de lograr lo mismo *en definitiva*
Los privilegios "full" es lo que tiene root (salvo que apliques algún framework de seguridad que corra en modo kernel, como los secure levels de FreeBSD), privilegio de todo y para TODO (a diferencia del granular, que es específico para una tarea)
Tenés un montón de modalidades para manejar tus privilegios, y esto depende de la aplicación en cuestión.

De manera gráfica sería usar alguna de las interfaces para lo que mencioné antes (kdesu/kdesudo, gksu, algún editor de la config de policykit, etc)
Y de manera legal o no, sería si usar algún fallo de seguridad en software (preferentemente de propio descubrimiento o que no esté liberado de manera pública) o usar mecanismos de "escalado de privilegio" legales como sudo, su, bit suid, etc ...

Saludos.



Título: Re: Saber si un usuario es root en linux.
Publicado por: farresito en 2 Septiembre 2012, 00:25 am
Esta bien, voy a matizar un poco la cuestion, lo que yo quiero es que el programa pueda saber cuando el usuario tiene privilegios de root, la cuestion es, ¿si yo tengo ese programa funcionando, y el usuario se loguea como root, por ejemplo para instalar actualizaciones, una llamada subsiguiente a geteuid() devolvera 0, y mi proceso obtendra privilegios de root? ¿O eso seria demasiado facil, y hay que liarla mas?
Échale una ojeada al libro que publiqué hace tiempo. Es básicamente todas las bibliotecas y funciones de Linux. Absolutamente todo. De hecho, ahora mismo es el libro oficial. Estoy seguro que encontrarás lo que buscas. Ah, y está muy bien organizado. Una maravilla. Lo uso muy a menudo.

http://foro.elhacker.net/gnulinux/pdf_the_linux_programming_interface-t336641.0.html


Título: Re: Saber si un usuario es root en linux.
Publicado por: 0xDani en 2 Septiembre 2012, 14:50 pm
Muchas gracias por el libro, farresito. Se ve bueno. Creo que yo tambien voy a usarlo a menudo.

Alex Mtx, ¿crackear el etc/passwd se considera "legal" o no?

Saludos.


Título: Re: Saber si un usuario es root en linux.
Publicado por: farresito en 2 Septiembre 2012, 16:28 pm
Yo tambien iría directamente con una biblioteca. Así, te ahorras tiempo y errores.


Título: Re: Saber si un usuario es root en linux.
Publicado por: 0xDani en 2 Septiembre 2012, 23:46 pm
Yo tambien iría directamente con una biblioteca. Así, te ahorras tiempo y errores.

¿Que has querido decir? No lo pillo xD

Tambien se podria usar fuerza bruta sobre su, sudo, suid... lo he pensado pero eso requeriria llamar a system() constantemente y seria muy lento no?

Saludos.