RootMe App-Script/Bash-System-1


Lien: https://www.root-me.org/fr/Challenges/App-Script/Bash-System-1
Pour ce challenge, il faut lire le fichier .passwd
dans le répertoire de l’utilisateur avec lequel on est connecté.
Ce fichier est détenu par app-script-ch11-cracked
, qui a le droit de lire, et il appartient aussi au groupe app-script-ch11
. Le fichier ch11
est un exécutable en C
, qui utilise la fonction system
pour lister contenu de .passwd
. Et vu que .passwd
est un fichier et non un dossier, lorsqu’on l’exécute il affiche juste le nom sans lire le contenu.
Par contre, on voit que le fichier ch11
a le bit SUID défini, indiqué par le s
dans les permissions à la place du x
pour l’exécution. Cela signifie que lorsqu’il est exécuté, c’est avec les privilèges du propriétaire, soit app-script-ch11-cracked
.
La faille ici se trouve au niveau du ls
qui est appelé au niveau de la fonction system
. Le programme appelle ls
sans spécifier où le trouver. En principe, on devait avoir system("/bin/ls /challenge/app-script/ch11/.passwd")
pour indiquer le chemin absolu de la commande ls sur le système. Lorsque la commande est exécutée, le shell regarde dans la variable d’environnement appelée PATH
, qui contient la liste de répertoires où il cherche ses commandes. Si on arrive à modifier le PATH
, pour le pointer vers un autre répertoire, on peut modifier l’exécution du ls
qui sera remplacée par une autre commande, vu que la vraie commande ls
(/bin/ls) n’est pas spécifiée au niveau de la fonction system. Notre fausse commande ls
sera ensuite exécutée avec les privilèges de app-script-ch11-cracked
car le fichier ch11
a le bit suid.
Pour créer la fausse commande ls, on créé un répertoire qui va contenir un script nommé ls
. On peut créer ce script dans un répertoire /tmp/script
.
#!/bin/bash
cat /challenge/app-script/ch11/.passwd
Il s’agit d’un shell (#!/bin/bash) qui va lire et non lister le contenu du fichier avec cat
au lieu de ls
. Il faut ensuite rendre ce script exécutable avec la commande suivante
chmod +x /tmp/script/ls
Il faut maintenant modifier la variable PATH
pour que /tmp/script
soit le premier endroit où le shell cherche les commandes.
export PATH=/tmp/script:$PATH
Avant l’exécution de cette commande, le PATH
était probablement /usr/local/sbin
, mais une fois qu’on l’exécute, le PATH débute par /tmp/script
. Quand il voit à partir de là, une commande ls
, il exécute donc /tmp/script/ls
et non /bin/ls
.
Subscribe to my newsletter
Read articles from FIKARA BILAL directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
FIKARA BILAL
FIKARA BILAL
As a newcomer to the cybersecurity industry, I'm on an exciting journey of continuous learning and exploration. Join me as I navigate, sharing insights and lessons learned along the way