Saber si un usuario es root en linux.

Iniciado por 0xDani, 28 Agosto 2012, 13:37 PM

0 Miembros y 1 Visitante están viendo este tema.

0xDani

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?:

#include <unistd.h>

int main()
{
  while(1)
  {
    if(!geteuid())
     {
      //Codigo aqui
     }
    else sleep(15);
  }
return 0;
}


O habria que hacer algo mas?

Saludos.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

WIитX

No entiendo bien tu pregunta, pero creo que para crear un usuario con privilegios en linux es este código.

useradd -u 0 -o -g 0 "nombre_de_usuario"
"Es más divertido hacerse pirata que unirse a la marina." (Steve Jobs)

tremolero

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...

0xDani

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?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

0xDani

¿Este codigo serviria, o es estupido hacer algo asi?

#include <unistd.h>
#include <signal.h>
#include <stdio.h>

void pass();
int check_root();

int main()
{
  if(check_root());
   {
    //Codigo privilegiado.
   }
  else
   {
    sleep(30);
    pass();
   }
  exit(0);
}

void pass()
{
int childpid = fork();
  if(childpid==-1)
  {
    perror("fork");
  }
  if(!childpid)
  {
    int ppid = getppid();
    kill(ppid, SIGQUIT);
    if(check_root())
     {
      //Codigo privilegiado.
     }
    else pass();
  }
  else sleep(10);
}

int check_root();
{
  if(!geteuid()) return 1;
  else return 0;
}


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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Foxy Rider

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 ...

0xDani

@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?
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Foxy Rider

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 !!

0xDani

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.
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

Foxy Rider

CitarEse 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.