Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
- 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 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.
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 é crucial 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.
Um processo que não está sendo executado como root só pode modificar seu euid
para corresponder ao ruid
, euid
ou suid
atual.
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.
- 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, heap e 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
.
- Funcionalidade: Ao contrário de
execve
,system
cria um processo filho usandofork
e executa um comando dentro desse processo filho usandoexecl
. - Execução de 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
.
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.
Exemplos retirados de https://0xdf.gitlab.io/2022/05/31/setuid-rabbithole.html#testing-on-jail, verifique para mais informações
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).
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.
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 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
Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!
- 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.