euid, ruid, suid
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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
refleja ruid
, salvo en instancias como la ejecución de un binario SetUID, donde euid
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.
Un proceso que no opera bajo root solo puede modificar su euid
para que coincida con el ruid
, euid
o suid
actuales.
setuid
: Contrario a las suposiciones iniciales, setuid
modifica principalmente euid
en lugar de ruid
. Específicamente, para procesos privilegiados, alinea ruid
, euid
y suid
con el usuario especificado, a menudo root, solidificando efectivamente estos IDs debido al suid
que prevalece. Se pueden encontrar detalles en la página del manual de setuid.
setreuid
y setresuid
: Estas funciones permiten el ajuste matizado de ruid
, euid
y suid
. Sin embargo, sus capacidades dependen del nivel de privilegio del proceso. Para procesos no root, las modificaciones están restringidas a los valores actuales de ruid
, euid
y suid
. En contraste, los procesos root o aquellos con la capacidad CAP_SETUID
pueden asignar valores arbitrarios a estos IDs. Se puede obtener más información de la página del manual de setresuid y 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.
Cabe destacar que, aunque setuid
puede ser una opción 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 de los IDs de usuario en diferentes escenarios.
execve
Funcionalidad: execve
inicia un programa, determinado por el primer argumento. Toma dos argumentos de matriz, argv
para argumentos y envp
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 adicionales permanecen sin cambios.
euid
puede tener cambios matizados si el nuevo programa tiene el bit SetUID establecido.
suid
se actualiza desde euid
después de la ejecución.
Documentación: Se puede encontrar información detallada en la página del manual de execve
.
system
Funcionalidad: A diferencia de execve
, system
crea un proceso hijo usando fork
y ejecuta un comando dentro de ese proceso hijo usando execl
.
Ejecución de Comandos: Ejecuta el comando a través de sh
con execl("/bin/sh", "sh", "-c", command, (char *) NULL);
.
Comportamiento: Como execl
es una forma de execve
, 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
.
bash
y sh
con SUIDbash
:
Tiene una opción -p
que influye en cómo se tratan euid
y ruid
.
Sin -p
, bash
establece euid
a ruid
si inicialmente difieren.
Con -p
, se preserva el euid
inicial.
Se pueden encontrar más detalles en la página del manual de bash
.
sh
:
No posee un mecanismo similar a -p
en bash
.
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 entre euid
y ruid
.
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.
Ejemplos tomados de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, consúltalo para más información
setuid
con system
Objetivo: Entender el efecto de setuid
en combinación con system
y bash
como sh
.
Código C:
Compilación y Permisos:
Análisis:
ruid
y euid
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
, ajusta euid
para que coincida con ruid
, resultando en que ambos sean 99 (nadie).
Código C:
Compilación y Permisos:
Ejecución y Resultado:
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.
Objetivo: Explorar la interacción entre setuid y execve.
Ejecución y Resultado:
Análisis:
ruid
permanece en 99, pero euid se establece en 1000, de acuerdo con el efecto de setuid.
Ejemplo de Código C 2 (Llamando a Bash):
Ejecución y Resultado:
Análisis:
Aunque euid
se establece en 1000 por setuid
, bash
restablece euid a ruid
(99) debido a la ausencia de -p
.
Ejemplo de código C 3 (Usando bash -p):
Ejecución y Resultado:
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE)