Como iniciar (ou encontrar) um processo com RUID diferente do EUID?

3

Inspirado por uma das perguntas anteriormente respondidas , tentei executar um programa por um usuário que não era seu proprietário - e o RUID e o EUID do processo permaneceram os mesmos. (A menos que eu leia a resposta errada e não é assim que você pode conseguir a diferença.)

Então eu tentei abrir um programa como outro usuário via sudo - e ainda nada.

Eu examinei todos os processos já existentes (eu acho) via ps axo euid,ruid,comm -e g , e nenhum deles tinha diferentes RUIDs e EUIDs.

Como posso alcançar (ou encontrar os processos com) a diferença? Alguns comandos específicos ajudariam, porque eu poderia ter cometido alguns erros em algumas etapas.

    
por dziadek1990 08.05.2015 / 23:14

2 respostas

6

Invocar um executável que você não possui não é nada notável. A maioria dos executáveis no sistema pertence ao root, e executá-los não dá ao usuário nenhum privilégio extra.

São apenas executáveis setuid que começam com UID efetivo definido como o proprietário do executável enquanto o UID real continua sendo o verdadeiro UID do processo de invocação.

sudo é root setuid, então ele é executado com o UID 0 efetivo e seu UID real. Mas quando invoca outro comando, ele define o UID efetivo e o UID real para o usuário de destino. Você teria que pegar o sudo para observar um EUID que difere do RUID. Isso será rápido demais para ver a menos que sudo solicite uma senha.

Você pode observar facilmente os diferentes UIDs executando o comando passwd como um usuário não raiz. Enquanto o prompt estiver sendo exibido, execute ps em outro temporário:

ps -o user,ruser -C passwd

Para encontrar todos os processos em execução com diferentes EUID e RUID, você pode usar

ps -e -o user= -o ruser= | awk '$1 != $2'

É normal não encontrar nenhum, a maioria dos processos setuid são de curta duração.

    
por 09.05.2015 / 03:25
0

Se alguém quiser apenas fazer com que o comando id mostre o diferente euid do uid (que é o comportamento da man page), uma forma é executá-lo dentro do programa temp c:

$ sudo gcc -o test.bin -xc - <<EOF
     #include <stdlib.h>
     #include <unistd.h>
     int main() { seteuid(0); system("id"); }
EOF
$ sudo chmod +s test.bin && ./test.bin && sudo rm test.bin

e o resultado é assim:

uid=1000(user) gid=1000(user) euid=0(root) egid=0(root) groups=0(root),1000 ...
    
por 20.10.2017 / 15:46