strace para descobrir a localização de persistência da senha sudo

1

strace / dtrace / ltrace ... útil para muitas coisas, desde encontrar violações de acesso ocultas até rastreamento de soquete de rede, mas talvez não seja possível ver tudo.

Eu não consegui descobrir usando strace (ele surgiu novamente enquanto eu tentava responder a outra pergunta hoje) onde o sudo aloca e persiste senhas de texto simples na memória do sistema. A questão relacionada está relacionada se isso é novidade para você.

O mais próximo que eu cheguei, com traços como este (isso pode ser um mau exemplo, usando um sudo empilhado; eu tentei algumas coisas):

$ sudo strace -ff -o mem sudo -s
Enter password...

são linhas como esta:

mem.14471:stat("/etc/profile.d/gnome-ssh-askpass.sh", {st_mode=S_IFREG|0644, st_size=70, ...}) = 0
mem.14471:access("/etc/profile.d/gnome-ssh-askpass.sh", R_OK) = 0
mem.14471:open("/etc/profile.d/gnome-ssh-askpass.sh", O_RDONLY) = 3
mem.14471:read(3, "SSH_ASKPASS=/usr/libexec/openssh"..., 70) = 70

e acredito que tentei rastreá-los individualmente, mesmo substituindo a variável env em / usr / libexec / openssh-askpass por sua própria strace, sem sucesso.

Eu sei ler e decodificar straces; Eu posso seguir as alças atribuídas, códigos de retorno e alocações de memória. O que não consigo encontrar é um fork que aloque e persista a senha do sudo (até 7 vezes) na memória, enquanto o sudo está ativo. A prova de residente da senha é através do LiME Forensics aplicado ao CentOS.

Alternativamente, haveria uma abordagem melhor, como iterar alocações de memória de processo?

    
por ǝɲǝɲbρɯͽ 29.04.2015 / 06:20

1 resposta

3

strace não mostrará nada tão específico quanto isso. O mais próximo que você pode obter são as chamadas brk() ou mmap(MAP_ANONYMOUS) que a glibc usa para capturar toda uma nova região de memória. O resto não usa chamadas do sistema, apenas direciona o acesso à memória.

Você pode tentar ltrace para chamadas da biblioteca de espaço do usuário.

Ou apenas encontre o prompt de senha no código-fonte e veja o que acontece com seus resultados. Adicione alguns printf() para exibir os endereços de memória.

    
por 29.04.2015 / 07:13