--- tags: Pwn, Brigitte_Friang --- # Write-up "Alone Muks", Pwn, Opération Brigitte Friang, DGSE, 2020 ###### tags: **`Pwn`**, **`Brigitte_Friang`** ## Présentation du challenge ### Énoncé *Lors de votre récent séjour à Evil Country, vous êtes parvenu à brancher un dispositif sur le camion effectuant la livraison. Il faut maintenant trouver une faille sur le système pour pouvoir prendre le contrôle du camion autonome de la marque Lates et le rediriger vers un point d'extraction. Un agent a posé un dispositif nous permettant d'accéder au système de divertissement du véhicule. A partir de ce dernier, remontez jusqu'au système de navigation.* *Connectez-vous en SSH au camion* ### Données *Identifiants: user:user* *Port : 5004* ## Connexion et analyse de l'environnement ### Login On se connecte en ssh au challenge avec la commande `ssh -p 5004 user@challengecybersec.fr`. On arrive sur une interface signée *LATES Motors Inc*, et on nous demande d'entrer nos identifiants. On tente alors la combinaison `user:user` qui nous a servi à nous connecter au challenge, ainsi que différentes combinaisons de mots de passe classiques comme `admin:admin` ou `username:password`, qui se révèlent toutes infructueuses. ![login](https://i.imgur.com/EBIMzl0.png) On tente alors un ***KeyboardInterrupt (`Ctrl + C`)***, et pouf, on sort du script d'authentification et on se retrouve avec un invite de commande de shell. ### Restricted shell On se rend cependant rapidement compte que l'on a accès à quasiment aucune des commandes de bases (`ls`, `sudo`, `cat`, `whoami`...). ![command_not_found](https://i.imgur.com/sjwNntX.png) L'utilisation d'un chemin absolu ne donne pas plus de résultat car l'utilisation de slash `/` dans les noms de commandes est également interdite. ![slash](https://i.imgur.com/lYWQpSD.png) La commande `cd`, elle, est accessible mais cependant inutilisable car restreinte. ![cd_restricted](https://i.imgur.com/O0piSaK.png) Cela nous permet toutefois de nous rendre compte que l'on se trouve sur une **shell restreinte** de type **`rbash`**, ce qui est confirmé par l'affichage de la variable d'environnement `SHELL`. ![rbash](https://i.imgur.com/FANrJav.png) Enfin même si la commande `cd` est restreinte on peut tout de même utiliser l'auto-complétion (*`Tab`*) pour afficher les dossiers et sous-dossiers présents dans notre répertoire actuel, et ainsi faire un petit tour du propriétaire. ![autocompletion](https://i.imgur.com/He28Srj.png) On remarque alors que les seules commandes actives dont on dispose sont les commandes `python` et `date`. ## Sortie de la shell restreinte Plusieurs moyens existent pour sortir d'une shell restreinte, par exemple en se connectant directement au challenge à l'aide de la commande `ssh -p 5004 user@challengecybersec.fr -t "bash --noprofile"`. On va toutefois ici essayer de se servir strictement des moyens mis à notre disposition, et l'élement le plus pertinent pour parvenir à nos fins semble alors être la commande `python`. Cette dernière nous permet d'observer que le script `login.py` est celui qui se lance à la connexion du challenge, et nous permet également d'afficher son contenu à l'aide d'un `open('login.py')`. ![login.py](https://i.imgur.com/E7IJK4x.png) On trouve alors les identifiants requis pour l'authentification au lancement : **`dev:Sup3rStr0ngP4ssw0rd!!`**. Cependant cela ne nous avance pas car l'authentification réussie déclenche seulement l'exécution de la commande `exit()` qui nous renvoie sur la shell restreinte : retour à la case départ. L'un des avantages pertinents ici de l'interface python est que l'on peut exécuter des commandes systèmes en bypassant les restrictions de la restricted shell, et notamment celle nous empêchant d'utiliser des chemins absolus dans les commandes. On peut alors exécuter la commande **`bash`** en rentrant **`import os`** puis **`os.system('/bin/bash')`** pour lancer une shell bash classique. Victoire, nous voilà libéré de nos chaînes. ## Recherche du flag Maintenant que l'on se trouve dans une shell bash classique on peut utiliser la commande `cd` comme bon nous semble, mais on n’a toujours pas accès aux autres commandes de base. On peut régler cela en modifiant la variable`PATH` vers `/bin` qui nous donne accès notamment à `ls` et `cat`, ou vers `/usr/bin`, qui nous permet d'utiliser `sudo` ou encore `whoami`. Nous sommes maintenant paré pour partir à l'aventure. Il ne faut pas énormément de temps pour tomber sur notre coffre au trésor, un joli **`flag.txt`** au sein du répertoire `/home/navigationSystem`. L'euphorie est toutefois de courte durée car on se rend rapidement compte que le fichier est bloqué en lecture pour nous, et un rapide check des permissions nous apprend qu'il est seulement accessible en lecture pour l'user **navigationSystem**. ![flag.txt](https://i.imgur.com/mfEFOo9.png) La stratégie la plus pertinente semble être alors de réaliser une **élévation de privilèges**. ## Élévation de privilèges ### Première promotion : globalSystem La commande `sudo -l` nous apprend que l'on peut lancer **Vim** en tant que ***globalSystem*** sans besoin de mot de passe. ![sudo-l_vim](https://i.imgur.com/v8ldAd7.png) On comprend alors que l'élévation de privilèges va probablement se réaliser en 2 temps : *user* -> *globalSystem* -> *navigationSystem*. On rentre donc la commande `/usr/bin/sudo -u globalSystem /usr/bin/vim`, puis depuis l'éditeur Vim, on relance une shell bash en tant que *globalSystem* avec la commande `:!/bin/bash`. ![vim](https://i.imgur.com/M1v1aqK.png) Bingo, un check de la commande `whoami` confirme que l'on a bien été promu au niveau supérieur. ![whoami-GS](https://i.imgur.com/BdGgoQa.png) ### Seconde promotion : navigationSystem Une seconde utilisation de la commande `sudo -l` nous faire savoir que l'on a un droit d'éxécution en tant que `navigationSystem` sur un certain fichier **`update`**. ![sudo-l_update](https://i.imgur.com/VN21oYQ.png) Exécuter ce dernier à l'aide du mot de passe `AloneIsTheBest` entraîne l'éxécution d'une soit disante mise à jour sur le camion autonome effectuant la livraison pour Evil Gouv, qui reste malheureusement bloquée à 8%. Cela paraît intéressant à première vu, mais n'a pourtant pas l'air de nous avancer dans notre quête du flag. ![upgrade](https://i.imgur.com/yIv47dH.png) Cependant à l'aide d'un `ls -l` on se rend compte que l'on a le **droit d'écriture** sur ce fichier en tant que *globalSystem*. ![writing_right](https://i.imgur.com/VuSFudE.png) Ça commence à sentir le flag à plein nez cette histoire ! On modifie alors le contenu du fichier `update` à l'aide de la commande `echo` en remplaçant le script original par notre propre script qui va nous permettre d'ouvrir une shell bash de la même manière que ce qu'on avait fait pour sortir de la shell restreinte, sauf que cette fois-ci on pourra l'éxecuter en tant que *navigationSystem* :`#! /usr/bin/python` puis `import os` et enfin `os.system('/bin/bash')`. ![change_update](https://i.imgur.com/19xHAtd.png) On l'execute donc en tant que *navigationSystem* : `/usr/bin/sudo -u navigationSystem /usr/bin/update`. Un dernier `whoami` pour nous confirmer que nous avons bien reçu notre promotion finale : ![whoami_NS](https://i.imgur.com/8ekLklx.png) ## Affichage du flag Maintenant que plus rien ne peut nous résister il ne nous reste plus qu'à aller ouvrir notre coffre au trésor. On a finalement accès au flag tant recherché que l'on affiche simplement avec la commande `cat` : **DGSESIEE{44adfb64ff382f6433eeb03ed829afe0}**. ![FLAG](https://i.imgur.com/I65Y9mA.png) --- ###### -- *MrR0bot*