Élévation de privilèges admin sur Ubuntu 20.04
Sommaire
Salut les makers !
Ça faisait longtemps qu'on n'avait pas parlé hacking et sécurité, du coup je vous propose un hack permettant de passer root
à partir d'un compte utilisateur sans privilèges sur Ubuntu 20.4
1. Étapes d'exploitation
Tout d'abord, ouvrez un terminal et créez un lien symbolique dans votre home :
ln -s /dev/zero ~/.pam_environment
Si le fichier existe déjà, renommez-le temporairement pour le restaurer après la manip'
Ensuite, ouvrez "Pays et langues" dans les paramètres systèmes et changez de langue.
La boite de dialogue doit alors freezer. Ignorez-la et retournez sur votre terminal. À ce niveau, le processus accounts-daemon
va commencer à charger le CPU et vous devriez entendre le ventillo s'emballer.
Dans le terminal, supprimez le symlink.
rm .pam_environment
N'oubliez pas cette étape sans quoi vous vous retrouverez bloqué
L'étape suivante consiste à envoyer le signal SIGSTOP
au process accounts-daemon
pour qu'il arrête de charger le CPU. Pour faire ça, il faut d'abord connaître son identifiant (PID) qu'on obtient grâce à la commande suivante :
pidof accounts-daemon
472
À partir de là, on peut utiliser la commande kill
pour envoyer le signal SIGSTOP
:
kill -SIGSTOP 597
On arrive maintenant à l'étape cruciale de ce hack. Vous allez fermer votre session mais avant ça vous devez initialiser un timer qui va reset le service accounts-daemon
après que vous vous soyez déconnecté. Sinon vous serez juste bloqué sans possibilité de vous connecter à nouveau.
Si ça arrive, pas de panique, il vous suffit de redémarrer normalement votre PC
nohup bash -c "sleep 30s; kill -SIGSEGV 597; kill -SIGCONT 597"
L'utilitaire nohup
est un moyen simple de laisser un script tourner même après que vous vous soyez déconnecté. Cette commande fait 3 choses :
- Attend 30 secondes (juste le temps de se déconnecter)
- Envoie le signal
SIGSEGV
àaccounts-daemon
ce qui va le faire crasher - Envoie le signal
SIGCONT
àaccounts-daemon
pour désactiverSIGSTOP
envoyé précédemment. Le signalSIGSEGV
ne prendra effet que lorsqueSIGCONT
est reçu
Une fois la commande exécutée, déconnectez-vous et attendez quelques secondes le temps que le SIGSEGV
soit envoyé. Si l'exploit réussi, une série de boites de dialogue apparaissent vous laissant alors la possibilité de créer un nouvel utilisateur administrateur.
Tada !
2. Comment ça marche ?
Il y a deux bugs impliqués dans ce hack. Le premier est accountsservice qui gère les compte utilisateurs. Le second est GNOME Display Manager (gdm3) qui, entre autres, gère l'écran de login.
2.1 Déni de service de accountsservice
Le démon accountsservice
est un service système qui gère les compte utilisateurs. Il peut créer un nouveau compte, change le mot de passe d'un utilisateur mais aussi des actions moins sensibles comme changer l'icône d'un utilisateur ou sa langue préférée.
Les démons sont des programmes qui s'exécutent en arrière-plan et n'ont pas leur propre interface utilisateur. Cependant, la boîte de dialogue des paramètres système peut communiquer avec le démon de comptes via un système de messagerie appelé D-Bus
.
Dans l'exploit, j'utilise la boîte de dialogue des paramètres pour changer la langue. Un utilisateur standard est autorisé à modifier ce paramètre sur son propre compte - les privilèges d'administrateur ne sont pas requis. Sous le capot, la boîte de dialogue des services système envoie la commande org.freedesktop.Accounts.User.SetLanguage
à accounts-daemon
, via D-Bus
.
Il s'avère qu'Ubuntu utilise une version modifiée du service de comptes qui inclut du code supplémentaire qui n'existe pas dans la version maintenue par freedesktop. Le patch d'Ubuntu ajoute une fonction nommée is_in_pam_environment
, qui recherche un fichier nommé .pam_environment
dans le répertoire personnel de l'utilisateur et le lit. La vulnérabilité de service fonctionne en faisant de .pam_environment
un lien symbolique vers /dev/zero
. /dev/zero
est un fichier spécial qui n'existe pas réellement sur le disque. Il est fourni par le système d'exploitation et se comporte comme un fichier infiniment long dans lequel chaque octet vaut zéro. Lorsque is_in_pam_environment
essaie de lire .pam_environment
, il est redirigé vers /dev/zero
par le lien symbolique, puis tombe dans une boucle infinie car /dev/zero
est infiniment long.
Il y a une deuxième partie à ce bug. L'exploit consiste à faire planter le démon en lui envoyant le signal SIGSEGV
. Un utilisateur standard ne devrait pas être autorisé à planter une service système, mais accounts-daemon
l'autorise par inadvertance en supprimant les privilèges juste avant de lire le fichier
de l'utilisateur. La suppression des privilèges signifie que le démon perd temporairement ses privilèges .pam_environment
root
, adoptant à la place les privilèges inférieurs de l'utilisateur.
Ironiquement, il s'agit d'une précaution de sécurité dont le but est de protéger le démon d'un utilisateur malveillant qui tenterait de créer un lien symbolique de son .pam_environment
vers /etc/shadow
qui est un fichier très sensible que les utilisateurs standards ne sont pas autorisés lire. Malheureusement, il accorde également à l'utilisateur l'autorisation d'envoyer les signaux au démon, c'est pourquoi nous sommes en mesure d'envoyer un SIGSEGV
au service.
2.2 Élévation de privilèges gdm3
GNOME Display Manager (gdm3) est un composant fondamental de l'interface utilisateur d'Ubuntu. Il permet de démarrer/arrêt des sessions utilisateurs lorsqu'ils se (dé)connectent. Il gère également l'écran de login.
Une autre chose gérée par gdm3 c'est la configuration initiale d'un nouveau PC. Quand vous installez Ubuntu sur un nouveau PC, la première chose que vous devez faire c'est vous créer un compte. L'utilisateur initial doit être un admin, ainsi vous pouvez continuer à configurer la machine, comme configurer le Wifi et installer des applications.
La boite de dialogue qu'on a vu lors de l'exploit est une application séparée appelée gnome-initial-setup
. Elle est déclenchée par gdm3 quand il n'y a aucun compte utilisateur sur le système, ce qui est le scénario attendu pendant une installation vierge.
Comment gdm3 vérifie le nombre d'utilisateurs sur le système ?
Vous l'avez peut-être deviné : en demandant à accounts-daemon
!
Et que se passe-t-il si accounts-dameon
ne répond plus ?
La réponse se trouve dans ce code.
Il utilise D-Bus
pour demander à accounts-daemon
combien de comptes utilisateurs il y a. Mais si accounts-daemon
ne répond plus, le D-Bus tombe en timeout. En conséquence, aucune valeur n'est affectée à priv->have_existing_user_accounts
. Malheureusement, la valeur affectée par défaut est false
. Du coup, gdm3 pense qu'il n'y a aucun compte utilisateur et il lance gnome-initial-setup
😁.
3. Comment s'en protéger
Pour l'instant il s'agit d'une faille 0-day c'est-à-dire une faille sans correctif connu.
Il va donc falloir attendre et surveiller la sortie d'un correctif.
D'ici là portez-vous bien et à bientôt sur Fire-DIY !
Sources: [1]
Autres articles dans la catégorie Informatique :
Vos réactions (0) :
- Sois le/la premier(e) à commenter cet article !