euid, ruid, suid
Reading time: 8 minutes
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.
Variables de Identificaci贸n de Usuario
ruid
: El ID de usuario real denota al usuario que inici贸 el proceso.euid
: Conocido como el ID de usuario efectivo, representa la identidad del usuario utilizada por el sistema para determinar los privilegios del proceso. Generalmente,euid
reflejaruid
, salvo en instancias como la ejecuci贸n de un binario SetUID, dondeeuid
asume la identidad del propietario del archivo, otorgando as铆 permisos operativos espec铆ficos.suid
: Este ID de usuario guardado es fundamental cuando un proceso de alto privilegio (normalmente ejecut谩ndose como root) necesita renunciar temporalmente a sus privilegios para realizar ciertas tareas, solo para luego recuperar su estado elevado inicial.
Nota Importante
Un proceso que no opera bajo root solo puede modificar su euid
para que coincida con el ruid
, euid
o suid
actuales.
Entendiendo las Funciones set*uid
setuid
: Contrario a las suposiciones iniciales,setuid
modifica principalmenteeuid
en lugar deruid
. Espec铆ficamente, para procesos privilegiados, alinearuid
,euid
ysuid
con el usuario especificado, a menudo root, solidificando efectivamente estos IDs debido alsuid
que prevalece. Se pueden encontrar detalles en la p谩gina del manual de setuid.setreuid
ysetresuid
: Estas funciones permiten el ajuste matizado deruid
,euid
ysuid
. Sin embargo, sus capacidades dependen del nivel de privilegio del proceso. Para procesos que no son root, las modificaciones est谩n restringidas a los valores actuales deruid
,euid
ysuid
. En contraste, los procesos root o aquellos con la capacidadCAP_SETUID
pueden asignar valores arbitrarios a estos IDs. Se puede obtener m谩s informaci贸n de la p谩gina del manual de setresuid y de la p谩gina del manual de setreuid.
Estas funcionalidades no est谩n dise帽adas como un mecanismo de seguridad, sino para facilitar el flujo operativo previsto, como cuando un programa adopta la identidad de otro usuario al alterar su ID de usuario efectivo.
Notablemente, aunque setuid
puede ser un recurso com煤n para la elevaci贸n de privilegios a root (ya que alinea todos los IDs a root), diferenciar entre estas funciones es crucial para entender y manipular los comportamientos del ID de usuario en diferentes escenarios.
Mecanismos de Ejecuci贸n de Programas en Linux
Llamada al Sistema execve
- Funcionalidad:
execve
inicia un programa, determinado por el primer argumento. Toma dos argumentos de matriz,argv
para argumentos yenvp
para el entorno. - Comportamiento: Retiene el espacio de memoria del llamador pero actualiza la pila, el mont贸n y los segmentos de datos. El c贸digo del programa es reemplazado por el nuevo programa.
- Preservaci贸n del ID de Usuario:
ruid
,euid
y los IDs de grupo suplementarios permanecen inalterados.euid
puede tener cambios matizados si el nuevo programa tiene el bit SetUID establecido.suid
se actualiza desdeeuid
despu茅s de la ejecuci贸n.- Documentaci贸n: Se puede encontrar informaci贸n detallada en la p谩gina del manual de
execve
.
Funci贸n system
- Funcionalidad: A diferencia de
execve
,system
crea un proceso hijo utilizandofork
y ejecuta un comando dentro de ese proceso hijo utilizandoexecl
. - Ejecuci贸n de Comandos: Ejecuta el comando a trav茅s de
sh
conexecl("/bin/sh", "sh", "-c", command, (char *) NULL);
. - Comportamiento: Como
execl
es una forma deexecve
, opera de manera similar pero en el contexto de un nuevo proceso hijo. - Documentaci贸n: Se pueden obtener m谩s detalles de la p谩gina del manual de
system
.
Comportamiento de bash
y sh
con SUID
bash
:- Tiene una opci贸n
-p
que influye en c贸mo se trataneuid
yruid
. - Sin
-p
,bash
estableceeuid
aruid
si inicialmente difieren. - Con
-p
, se preserva eleuid
inicial. - Se pueden encontrar m谩s detalles en la p谩gina del manual de
bash
. sh
:- No posee un mecanismo similar a
-p
enbash
. - El comportamiento respecto a los IDs de usuario no se menciona expl铆citamente, excepto bajo la opci贸n
-i
, enfatizando la preservaci贸n de la igualdad entreeuid
yruid
. - Informaci贸n adicional est谩 disponible en la p谩gina del manual de
sh
.
Estos mecanismos, distintos en su operaci贸n, ofrecen una gama vers谩til de opciones para ejecutar y transitar entre programas, con matices espec铆ficos en c贸mo se gestionan y preservan los IDs de usuario.
Pruebas de Comportamientos de ID de Usuario en Ejecuciones
Ejemplos tomados de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, cons煤ltalo para m谩s informaci贸n
Caso 1: Usando setuid
con system
Objetivo: Entender el efecto de setuid
en combinaci贸n con system
y bash
como sh
.
C贸digo C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Compilaci贸n y Permisos:
oxdf@hacky$ gcc a.c -o /mnt/nfsshare/a;
oxdf@hacky$ chmod 4755 /mnt/nfsshare/a
bash-4.2$ $ ./a
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
An谩lisis:
ruid
yeuid
comienzan como 99 (nadie) y 1000 (frank) respectivamente.setuid
alinea ambos a 1000.system
ejecuta/bin/bash -c id
debido al symlink de sh a bash.bash
, sin-p
, ajustaeuid
para que coincida conruid
, resultando en que ambos sean 99 (nadie).
Caso 2: Usando setreuid con system
C贸digo C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Compilaci贸n y Permisos:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
Ejecuci贸n y Resultado:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
An谩lisis:
setreuid
establece tanto ruid como euid a 1000.system
invoca bash, que mantiene los IDs de usuario debido a su igualdad, operando efectivamente como frank.
Caso 3: Usando setuid con execve
Objetivo: Explorar la interacci贸n entre setuid y execve.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
Ejecuci贸n y Resultado:
bash-4.2$ $ ./c
uid=99(nobody) gid=99(nobody) euid=1000(frank) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
An谩lisis:
ruid
permanece en 99, pero euid se establece en 1000, en l铆nea con el efecto de setuid.
Ejemplo de C贸digo C 2 (Llamando a Bash):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
Ejecuci贸n y Resultado:
bash-4.2$ $ ./d
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
An谩lisis:
- Aunque
euid
se establece en 1000 porsetuid
,bash
restableceeuid
aruid
(99) debido a la ausencia de-p
.
Ejemplo de c贸digo C 3 (Usando bash -p):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
char *const paramList[10] = {"/bin/bash", "-p", NULL};
setuid(1000);
execve(paramList[0], paramList, NULL);
return 0;
}
Ejecuci贸n y Resultado:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Referencias
tip
Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apoya a HackTricks
- Revisa los planes de suscripci贸n!
- 脷nete al 馃挰 grupo de Discord o al grupo de telegram o s铆guenos en Twitter 馃惁 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a HackTricks y HackTricks Cloud repos de github.