11 KiB
euid, ruid, suid
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Do you work in a cybersecurity company? Do you want to see your company advertised in HackTricks? or do you want to have access to the latest version of the PEASS or download HackTricks in PDF? Check the SUBSCRIPTION PLANS!
- Discover The PEASS Family, our collection of exclusive NFTs
- Get the official PEASS & HackTricks swag
- Join the 💬 Discord group or the telegram group or follow me on Twitter 🐦@carlospolopm.
- Share your hacking tricks by submitting PRs to the hacktricks repo and hacktricks-cloud repo.
Variáveis de Identificação do Usuário
ruid
: O ID de usuário real denota o usuário que iniciou o processo.euid
: Conhecido como ID de usuário efetivo, representa a identidade do usuário utilizada pelo sistema para determinar os privilégios do processo. Geralmente,euid
espelharuid
, exceto em casos como a execução de um binário SetUID, ondeeuid
assume a identidade do proprietário do arquivo, concedendo permissões operacionais específicas.suid
: Este ID de usuário salvo é fundamental quando um processo de alta privilégio (geralmente em execução como root) precisa temporariamente renunciar aos seus privilégios para realizar determinadas tarefas, apenas para posteriormente recuperar seu status elevado inicial.
Nota Importante
Um processo que não está sendo executado como root só pode modificar seu euid
para corresponder ao ruid
, euid
ou suid
atual.
Compreendendo as Funções set*uid
setuid
: Contrariamente às suposições iniciais,setuid
modifica principalmenteeuid
em vez deruid
. Especificamente, para processos privilegiados, alinharuid
,euid
esuid
com o usuário especificado, frequentemente root, solidificando efetivamente esses IDs devido à substituição desuid
. Informações detalhadas podem ser encontradas na página do manual do setuid.setreuid
esetresuid
: Essas funções permitem o ajuste sutil deruid
,euid
esuid
. 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 deruid
,euid
esuid
. Em contraste, processos root ou aqueles com a capacidadeCAP_SETUID
podem atribuir valores arbitrários a esses IDs. Mais informações podem ser obtidas na página do manual do setresuid e na página do manual do setreuid.
Essas funcionalidades não são projetadas como um mecanismo de segurança, mas sim para facilitar o fluxo operacional pretendido, como quando um programa adota a identidade de outro usuário alterando seu ID de usuário efetivo.
É importante notar que, embora setuid
possa ser comum para a elevação de privilégios para root (pois alinha todos os IDs com root), diferenciar entre essas funções é crucial para entender e manipular os comportamentos de ID de usuário em cenários variados.
Mecanismos de Execução de Programas no Linux
Chamada de Sistema execve
- Funcionalidade:
execve
inicia um programa, determinado pelo primeiro argumento. Ele recebe dois argumentos de array,argv
para argumentos eenvp
para o ambiente. - Comportamento: Mantém o espaço de memória do chamador, mas atualiza a pilha, o heap e os segmentos de dados. O código do programa é substituído pelo novo programa.
- Preservação do ID de 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 deeuid
pós-execução.- Documentação: Informações detalhadas podem ser encontradas na página do manual do
execve
.
Função system
- Funcionalidade: Ao contrário de
execve
,system
cria um processo filho usandofork
e executa um comando dentro desse processo filho usandoexecl
. - Execução do Comando: Executa o comando via
sh
comexecl("/bin/sh", "sh", "-c", comando, (char *) NULL);
. - Comportamento: Como
execl
é uma forma deexecve
, opera de forma semelhante, mas no contexto de um novo processo filho. - Documentação: Mais insights podem ser obtidos na página do manual do
system
.
Comportamento de bash
e sh
com SUID
bash
:- Possui uma opção
-p
que influencia comoeuid
eruid
são tratados. - Sem
-p
,bash
defineeuid
comoruid
se inicialmente forem diferentes. - Com
-p
, oeuid
inicial é preservado. - Mais detalhes podem ser encontrados na página do manual do
bash
. sh
:- Não possui um mecanismo semelhante ao
-p
nobash
. - O comportamento em relação aos IDs de usuário não é mencionado explicitamente, exceto sob a opção
-i
, enfatizando a preservação da igualdade deeuid
eruid
. - Informações adicionais estão disponíveis na página do manual do
sh
.
Esses mecanismos, distintos em sua operação, oferecem uma ampla gama de opções versáteis para executar e transitar entre programas, com nuances específicas na forma como os IDs de usuário são gerenciados e preservados.
Testando Comportamentos de ID de Usuário em Execuções
Exemplos retirados de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, verifique para mais informações
Caso 1: Usando setuid
com system
Objetivo: Compreender o efeito de setuid
em combinação com system
e bash
como sh
.
Código C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
system("id");
return 0;
}
Compilação e Permissões:
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álise:
ruid
eeuid
começam como 99 (nobody) 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
, ajustaeuid
para corresponder aruid
, resultando em ambos sendo 99 (nobody).
Caso 2: Usando setreuid com system
Código C:
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setreuid(1000, 1000);
system("id");
return 0;
}
Compilação e Permissões:
oxdf@hacky$ gcc b.c -o /mnt/nfsshare/b; chmod 4755 /mnt/nfsshare/b
Execução e Resultado:
bash-4.2$ $ ./b
uid=1000(frank) gid=99(nobody) groups=99(nobody) context=system_u:system_r:unconfined_service_t:s0
Análise:
setreuid
define tanto o ruid quanto o euid como 1000.system
invoca o bash, que mantém os IDs de usuário devido à sua igualdade, operando efetivamente como frank.
Caso 3: Usando setuid com execve
Objetivo: Explorar a interação entre setuid e execve.
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/usr/bin/id", NULL, NULL);
return 0;
}
Execução e 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álise:
ruid
permanece 99, maseuid
é definido como 1000, de acordo com o efeito dosetuid
.
Exemplo de Código C 2 (Chamando o Bash):
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
int main(void) {
setuid(1000);
execve("/bin/bash", NULL, NULL);
return 0;
}
Execução e 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álise:
- Embora
euid
seja definido como 1000 porsetuid
, obash
redefine o euid pararuid
(99) devido à ausência de-p
.
Exemplo 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;
}
Execução e Resultado:
bash-4.2$ $ ./e
bash-4.2$ $ id
uid=99(nobody) gid=99(nobody) euid=100
Referências
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Gostaria de ver sua empresa anunciada no HackTricks? ou gostaria de ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Confira os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe seus truques de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.