# RootMe App-Script/Bash-System-1

Lien: [https://www.root-me.org/fr/Challenges/App-Script/Bash-System-1](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é.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1749295956943/ea8ebba4-a52b-407a-82d1-dd150b7e8bad.png align="center")

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.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1749298227565/97eff00a-cd6a-4fa0-b3cd-d6f2b32d32b0.png align="center")

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`.

```plaintext
#!/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

```plaintext
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.

```plaintext
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`.  

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1749302925810/90aa4d76-d5c8-49af-be91-888885ce9b5c.png align="center")
