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
: O ID do usuário real denota o usuário que iniciou o processo.
euid
: Conhecido como o ID do usuário efetivo, representa a identidade do usuário utilizada pelo sistema para determinar os privilégios do processo. Geralmente, euid
reflete ruid
, exceto em casos como a execução de um binário SetUID, onde euid
assume a identidade do proprietário do arquivo, concedendo assim permissões operacionais específicas.
suid
: Este ID do usuário salvo é fundamental quando um processo de alto privilégio (normalmente executado como root) precisa temporariamente renunciar a seus privilégios para realizar certas tarefas, apenas para depois recuperar seu status elevado inicial.
Um processo que não opera sob root pode apenas modificar seu euid
para corresponder ao ruid
, euid
ou suid
atuais.
setuid
: Ao contrário das suposições iniciais, setuid
modifica principalmente euid
em vez de ruid
. Especificamente, para processos privilegiados, alinha ruid
, euid
e suid
com o usuário especificado, frequentemente root, solidificando efetivamente esses IDs devido ao suid
que sobrepõe. Informações detalhadas podem ser encontradas na página do manual setuid.
setreuid
e setresuid
: Essas funções permitem o ajuste sutil de ruid
, euid
e suid
. No entanto, suas capacidades dependem do nível de privilégio do processo. Para processos não-root, as modificações são restritas aos valores atuais de ruid
, euid
e suid
. Em contraste, processos root ou aqueles com a capacidade CAP_SETUID
podem atribuir valores arbitrários a esses IDs. Mais informações podem ser obtidas na página do manual setresuid e na página do manual setreuid.
Essas funcionalidades não são projetadas como um mecanismo de segurança, mas para facilitar o fluxo operacional pretendido, como quando um programa adota a identidade de outro usuário alterando seu ID de usuário efetivo.
Notavelmente, enquanto setuid
pode ser uma escolha comum para elevação de privilégios para root (já que alinha todos os IDs a root), diferenciar entre essas funções é crucial para entender e manipular comportamentos de ID de usuário em diferentes cenários.
execve
Funcionalidade: execve
inicia um programa, determinado pelo primeiro argumento. Ele aceita dois argumentos de array, argv
para argumentos e envp
para o ambiente.
Comportamento: Retém o espaço de memória do chamador, mas atualiza a pilha, heap e segmentos de dados. O código do programa é substituído pelo novo programa.
Preservação do ID do Usuário:
ruid
, euid
e IDs de grupo suplementares permanecem inalterados.
euid
pode ter mudanças sutis se o novo programa tiver o bit SetUID definido.
suid
é atualizado a partir de euid
após a execução.
Documentação: Informações detalhadas podem ser encontradas na página do manual execve
.
system
Funcionalidade: Ao contrário de execve
, system
cria um processo filho usando fork
e executa um comando dentro desse processo filho usando execl
.
Execução de Comando: Executa o comando via sh
com execl("/bin/sh", "sh", "-c", command, (char *) NULL);
.
Comportamento: Como execl
é uma forma de execve
, opera de maneira semelhante, mas no contexto de um novo processo filho.
Documentação: Mais informações podem ser obtidas na página do manual system
.
bash
e sh
com SUIDbash
:
Tem uma opção -p
que influencia como euid
e ruid
são tratados.
Sem -p
, bash
define euid
para ruid
se eles inicialmente diferirem.
Com -p
, o euid
inicial é preservado.
Mais detalhes podem ser encontrados na página do manual bash
.
sh
:
Não possui um mecanismo semelhante ao -p
em bash
.
O comportamento em relação aos IDs de usuário não é explicitamente mencionado, exceto sob a opção -i
, enfatizando a preservação da igualdade entre euid
e ruid
.
Informações adicionais estão disponíveis na página do manual sh
.
Esses mecanismos, distintos em sua operação, oferecem uma gama versátil de opções para executar e transitar entre programas, com nuances específicas em como os IDs de usuário são gerenciados e preservados.
Exemplos retirados de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, consulte para mais informações
setuid
com system
Objetivo: Compreender o efeito de setuid
em combinação com system
e bash
como sh
.
Código C:
Compilação e Permissões:
Análise:
ruid
e euid
começam como 99 (ninguém) e 1000 (frank), respectivamente.
setuid
alinha ambos para 1000.
system
executa /bin/bash -c id
devido ao symlink de sh para bash.
bash
, sem -p
, ajusta euid
para corresponder a ruid
, resultando em ambos sendo 99 (ninguém).
Código C:
Compilação e Permissões:
Execução e Resultado:
Análise:
setreuid
define tanto ruid quanto euid para 1000.
system
invoca bash, que mantém os IDs de usuário devido à sua igualdade, operando efetivamente como frank.
Objetivo: Explorar a interação entre setuid e execve.
Execução e Resultado:
Análise:
ruid
permanece 99, mas euid é definido como 1000, de acordo com o efeito do setuid.
Exemplo de Código C 2 (Chamando Bash):
Execução e Resultado:
Análise:
Embora euid
esteja definido como 1000 por setuid
, bash
redefine euid para ruid
(99) devido à ausência de -p
.
Exemplo de Código C 3 (Usando bash -p):
Execução e Resultado:
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)