Élévation de privilèges admin sur Ubuntu 20.04

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.

Selecteur 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ésactiver SIGSTOP envoyé précédemment. Le signal SIGSEGV ne prendra effet que lorsque SIGCONT 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.

Gnome initial setup 1
Gnome initial setup 1

Tada !

Liste des utilisateurs

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 .pam_environment de l'utilisateur. La suppression des privilèges signifie que le démon perd temporairement ses privilèges 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]

Vos réactions (0) :

  1. Sois le/la premier(e) à commenter cet article !
Tu as besoin d'aide ? Utilise le Forum plutôt que les commentaires.

Un commentaire ?

* Champs obligatoires
Utilisation des données

Afin d'améliorer ton expérience utilisateur, nous utilisons des cookies 🍪