Introduction
Dans les systèmes Linux, la commande sudo permet aux utilisateurs standard d'exécuter des programmes avec les privilèges de sécurité d'un autre utilisateur, généralement l'administrateur root. Les administrateurs système configurent souvent le fichier /etc/sudoers pour permettre à des utilisateurs spécifiques d'exécuter certaines commandes en tant que root sans avoir besoin de mot de passe. Cela est généralement fait par souci de commodité, par exemple pour permettre à un développeur de redémarrer un serveur web ou de rechercher des fichiers sur l'ensemble du système.
La leçon de sécurité ici est que les règles sudo sont en réalité une délégation de confiance. Si le binaire délégué est plus puissant que ce que l'administrateur imagine, la règle peut effectivement accorder un shell plutôt qu'une simple action sécurisée.
Cependant, ces raccourcis administratifs bien intentionnés peuvent introduire de graves vulnérabilités de sécurité. Si un utilisateur est autorisé à exécuter un binaire capable d'exécuter d'autres commandes ou de lancer un shell (comme find, vim ou awk), un attaquant peut abuser de cette permission pour sortir de la commande restreinte et obtenir un shell root complet. Cette technique est communément appelée "évasion de shell" (shell escape) ou exploitation "GTFOBins".
Dans ce laboratoire, vous vous mettrez dans la peau d'un auditeur de sécurité. Vous énumérerez les permissions sudo de votre utilisateur actuel, identifierez un binaire autorisé mal configuré et l'exploiterez pour élever vos privilèges jusqu'au niveau root.
Vérification des permissions Sudo (sudo -l)
Dans cette étape, vous apprendrez à énumérer les privilèges sudo attribués à votre compte utilisateur actuel.
Lors de l'évaluation d'un système Linux pour identifier des opportunités d'élévation de privilèges, l'une des premières vérifications consiste à voir quelles commandes l'utilisateur actuel peut exécuter en tant que root. La commande sudo fournit un indicateur intégré, -l (list), qui affiche les commandes autorisées et interdites pour l'utilisateur appelant.
Il s'agit d'une vérification prioritaire, car les mauvaises configurations de sudo peuvent permettre une élévation directe et facile, sans nécessiter beaucoup de conjectures.
Pour garder une trace de nos découvertes, nous redirigerons la sortie de cette commande vers un fichier texte dans notre répertoire de projet.
Exécutez la commande suivante pour lister vos privilèges sudo et enregistrer la sortie dans un fichier nommé sudo_privs.txt :
sudo -l > /home/labex/project/sudo_privs.txt
Maintenant, visualisons le contenu du fichier que vous venez de créer pour analyser les permissions :
cat /home/labex/project/sudo_privs.txt
Vous devriez voir une sortie similaire à celle-ci :
Matching Defaults entries for labex on this host:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User labex may run the following commands on this host:
(root) NOPASSWD: /usr/bin/find
Certains environnements peuvent afficher des entrées sudo supplémentaires en plus de la règle find. Pour ce laboratoire, concentrez-vous sur la ligne qui autorise explicitement labex à exécuter /usr/bin/find en tant que root sans fournir de mot de passe (NOPASSWD). C'est cette configuration spécifique que nous ciblerons dans les étapes suivantes.
Analyse des binaires autorisés pour les évasions de shell
Dans cette étape, vous analyserez le binaire /usr/bin/find pour comprendre comment il peut être détourné pour exécuter des commandes arbitraires.
La commande find est un utilitaire puissant utilisé pour rechercher des fichiers et des répertoires dans une hiérarchie. Cependant, elle inclut un paramètre très flexible appelé -exec. L'indicateur -exec permet à l'utilisateur d'exécuter une commande spécifiée sur chaque fichier trouvé par find.
Le problème n'est pas que find soit malveillant. Le problème est qu'il est expressif. Tout binaire capable d'être exécuté en tant que root et possédant des fonctionnalités étendues est un candidat à l'évasion de shell s'il n'est pas strictement limité.
La faille de sécurité critique survient lorsque find est exécuté avec sudo. Si find s'exécute en tant que root, toute commande passée au paramètre -exec sera également exécutée en tant que root.
Testons cette théorie en utilisant le paramètre -exec pour exécuter la commande whoami. La commande whoami affiche simplement le nom d'utilisateur effectif de l'utilisateur actuel. Nous redirigerons la sortie vers un fichier pour vérifier notre contexte d'exécution.
Exécutez la commande suivante :
sudo find . -exec whoami \; -quit > /home/labex/project/whoami.txt
Analysons cette commande. La partie sudo find . exécute la commande find en tant que root, en commençant la recherche dans le répertoire actuel (.). Le segment -exec whoami \; indique à find d'exécuter la commande whoami, où \; est nécessaire pour terminer l'instruction -exec. Enfin, l'indicateur -quit demande à find de quitter immédiatement après avoir traité la première correspondance, ce qui l'empêche d'exécuter whoami plusieurs fois pour chaque fichier du répertoire.
Maintenant, vérifiez le contenu du fichier de sortie :
cat /home/labex/project/whoami.txt
Vous devriez voir la sortie suivante :
root
Cela confirme que la commande passée à -exec a été exécutée avec succès avec les privilèges root.
Exécution d'un binaire avec Sudo
Dans cette étape, vous exploiterez la vulnérabilité -exec pour accéder à des fichiers système sensibles qui sont normalement restreints à l'utilisateur root.
L'un des fichiers les plus sensibles sur un système Linux est /etc/shadow. Ce fichier contient les hashs de mots de passe chiffrés de tous les comptes utilisateurs du système. Les utilisateurs standard n'ont pas les permissions de lecture pour ce fichier. Si un attaquant peut lire ce fichier, il peut tenter de casser les hashs de mots de passe hors ligne.
Puisque nous avons prouvé que nous pouvons exécuter des commandes arbitraires en tant que root en utilisant sudo find, nous pouvons utiliser cette technique pour lire le contenu de /etc/shadow.
Nous utiliserons la commande head dans notre instruction -exec pour lire uniquement la première ligne du fichier shadow (qui contient généralement le hash de l'utilisateur root) et l'enregistrer dans notre répertoire de projet.
Exécutez la commande suivante :
sudo find /etc/shadow -exec head -n 1 {} \; -quit > /home/labex/project/shadow_head.txt
Dans cette commande, {} agit comme un espace réservé que find remplace par le nom du fichier qu'il traite actuellement (dans ce cas, /etc/shadow).
Vérifiez que vous avez extrait avec succès les informations sensibles en lisant le fichier de sortie :
cat /home/labex/project/shadow_head.txt
Vous devriez voir une sortie similaire à celle-ci, affichant l'entrée de l'utilisateur root provenant du fichier shadow :
root:*:19711:0:99999:7:::
Vous avez réussi à contourner les permissions du système de fichiers en abusant de l'entrée sudo mal configurée.
Lancement d'un shell Root
Dans cette étape, vous effectuerez l'action finale pour obtenir un compromis complet du système en lançant un shell root.
Bien que la lecture de fichiers sensibles soit dangereuse, l'objectif ultime de l'élévation de privilèges est d'obtenir un shell interactif s'exécutant en tant que root. Cela accorde à l'attaquant un accès illimité à l'ensemble du système.
Pour y parvenir, au lieu de passer une commande simple comme whoami ou head au paramètre -exec, nous pouvons passer le chemin vers un exécutable de shell, tel que /bin/bash.
Dans un scénario réel, un attaquant exécuterait sudo find . -exec /bin/bash \; -quit pour accéder directement à un terminal root interactif. Cependant, pour les besoins de cet environnement de laboratoire automatisé, l'accès à un shell interactif mettrait en pause l'exécution du laboratoire.
Au lieu de cela, nous lancerons un shell bash root en mode non interactif en utilisant l'indicateur -c. Cela nous permet de passer une commande directement au nouveau shell root, de l'exécuter et d'enregistrer la preuve de notre compromission totale du système. Nous utiliserons la commande id, qui fournit des informations détaillées sur l'identité de l'utilisateur actuel et ses appartenances à des groupes.
Exécutez la commande suivante pour lancer un shell root et enregistrer votre identité :
sudo find . -exec /bin/bash -c "id > /home/labex/project/pwned.txt" \; -quit
Enfin, lisez le fichier pwned.txt pour vérifier votre élévation de privilèges ultime :
cat /home/labex/project/pwned.txt
La sortie doit clairement montrer que le shell s'exécutait avec les identifiants utilisateur et groupe root :
uid=0(root) gid=0(root) groups=0(root)
Félicitations ! Vous avez réussi à exploiter un fichier sudoers mal configuré pour élever vos privilèges d'un utilisateur standard à root.
Résumé
Dans ce laboratoire, vous avez exploré les risques de sécurité associés aux fichiers sudoers mal configurés dans les environnements Linux. Vous avez commencé par énumérer les privilèges sudo de votre compte utilisateur et avez identifié que le binaire find pouvait être exécuté en tant que root sans mot de passe. En comprenant la fonctionnalité du paramètre -exec de la commande find, vous avez pu exécuter des commandes arbitraires avec les privilèges root. Vous avez démontré l'impact de cette vulnérabilité en lisant des fichiers système restreints et, finalement, en lançant un shell root pour obtenir une compromission complète du système. Cet exercice souligne l'importance de respecter le principe du moindre privilège et d'auditer soigneusement les configurations sudo pour prévenir toute élévation de privilèges non autorisée.



