Introduction

Salut tout le monde ! Aujourd'hui, je vais vous partager mon write-up du Cheese CTF sur TryHackMe. Si vous aimez résoudre des défis en cybersécurité, celui-ci est vraiment intéressant pour tester vos compétences. Je vais vous guider étape par étape à travers ce CTF, en vous montrant comment j'ai découvert les failles et obtenu les drapeaux. Rien de trop complexe, juste un bon mix entre apprentissage et fun ! Prêt à plonger dans l'univers de Cheese CTF ? Suivez-moi !

image d'un hacker avec son animal de compagnie qui est un fennec

On commence par un simple scan Nmap pour explorer le réseau.

image détaillé du ctf

Tous les ports sont ouverts, ça promet ! Je ne cherche pas plus loin. Allons voir s'il y a un site web sur le port 80 pour HTTP ou le port 443 pour HTTPS.

image détaillé du ctf

On tombe sur un site où l'on peut commander du fromage. Je ne sais pas vous, mais ça me donne faim !

Cherchons s'il y a d'autres pages sur le site web ! Pour cela, j'utilise Gobuster, et pendant que ça tourne, j'explore le site manuellement.

image détaillé du ctf

Nous avons trouvé manuellement seulement la page login.php

Nous ne pouvons pas nous connecter, même après avoir essayé (admin/admin) et (admin/password).
Avant de passer à la recherche d'une faille SQL, explorons un maximum de pages trouvées sur le site web.
Nous arrivons finalement sur la page messages.html.

image détaillé du ctf

En cliquant sur le lien messages, on découvre une faille LFI, accompagnée d'un petit message sympa qui nous indique qu'on est sur la bonne piste. C'est comme si une grosse flèche pointait en disant : 'C'est ici, t'inquiète, tu peux y aller !' 😂

image détaillé du ctf
image détaillé du ctf

Ici, on voit un php://filter/resource qui lui permet d'accéder à un fichier appelé supersecretmessageforadmin. Cela signifie qu'on peut clairement exploiter cette faille pour accéder au fichier /etc/passwd !

image détaillé du ctf

Bingo ! Nous avons identifié deux utilisateurs : comte et root. Maintenant, j’aimerais récupérer un mot de passe dans login.php. Étant donné que ce fichier est censé gérer la connexion, il devrait contenir des informations permettant d'accéder à la base de données, que ce soit sous forme de mot de passe en clair ou via l'inclusion d'un autre fichier. Allons-y !

Pour cela, nous allons d’abord encoder le contenu du fichier en base64. En effet, si nous l'affichons tel quel, le code PHP s'exécutera et nous ne pourrons pas voir les informations que nous recherchons. Une fois que nous avons le contenu encodé, nous pourrons le décoder pour y accéder.

image détaillé du ctf

Nous avons trouvé notre fameux utilisateur comte et son mot de passe : VeryCheesyPassword. C'est le code d'accès à la base de données. Avec un peu de chance, il a réutilisé ce mot de passe pour se connecter en SSH ou sur le site web.

Malheureusement, ce n'est pas le cas. Que ce soit pour SSH ou sur le site web, le mot de passe ne fonctionne pas.

image détaillé du ctf

Question : peut-on obtenir une exécution de code à distance (RCE) à partir d'une injection de fichier local (LFI) ? Je fais quelques recherches et je tombe sur un outil appelé php_filter_chain_generator.py

image détaillé du ctf

Cet outil permet de créer une chaîne php://filter pour générer une exécution de code à distance (RCE) sans avoir besoin de télécharger de fichiers, à condition que le paramètre soit passé dans une fonction require ou include en PHP.

Pour en être certain, je récupère le fichier secret-script.php, qui m'a jusqu'à présent permis d'accéder à des fichiers comme /etc/passwd, etc. Comme précédemment, nous allons encoder le fichier en base64 puis le décoder.

image détaillé du ctf
image détaillé du ctf

Nous constatons qu'il n'y a pas de filtre et que le paramètre passe correctement dans la fonction include de PHP. Nous pouvons donc utiliser le script php_filter_chain_generator.py pour générer un reverse shell.

PS : N'oubliez pas d'encoder en base64 s'il y a des caractères spéciaux, car ils peuvent être mal interprétés dans l'URL.

image détaillé du ctf

Nous plaçons un écouteur sur le port approprié, et nous avons un shell !

image détaillé du ctf

Je fouille un peu partout, mais je ne trouve rien ! Cependant, j'ai remarqué une chose : j'ai accès au dossier /home/comte/.ssh et j'ai même les droits d'écriture sur le fichier authorized_keys.

image détaillé du ctf

Je génère une paire de clés SSH sur ma machine attaquante.

image détaillé du ctf

Ensuite, je colle ma clé publique dans le fichier authorized_keys sur la machine victime.

image détaillé du ctf

On modifie les permissions de la clé privée, puis on se connecte en SSH avec l'utilisateur comte.

image détaillé du ctf
image détaillé du ctf

Nous récupérons enfin le flag user.

image détaillé du ctf

Sympa, ce petit fromage !

image détaillé du ctf

En route vers ROOT

Maintenant, en route vers le flag root !
Premier réflexe sous Linux : vérifier si nous avons des droits sudo.

image détaillé du ctf

On voit qu'on peut démarrer quelque chose appelé exploit.timer. Voyons le statut de ce service, peut-être que nous pourrons obtenir plus d'infos

image détaillé du ctf

OK, le service ne fonctionne pas. Partons à la recherche d'un fichier appelé exploit.timer.

image détaillé du ctf

Super, on trouve un seul fichier. En listant le contenu du dossier /etc/systemd/system/, on voit qu'il y a notre fichier exploit.timer, mais aussi exploit.service. On peut écrire dans exploit.timer, mais pas dans exploit.service. Par contre, on peut voir ce qu'il fait.

image détaillé du ctf

En regardant exploit.service, on voit qu'il copie le binaire xxd dans le dossier /opt et le rend SUID. Nous pouvons exploiter cette faille pour élever nos privilèges et obtenir root.

image détaillé du ctf

Mais pour l'instant, il faut réparer exploit.timer.

image détaillé du ctf

Nous constatons que la variable OnBootSec doit être modifiée. Il suffit d'ajouter 0 pour que cela fonctionne.

image détaillé du ctf

On recharge le deamon, puis on active exploit.timer et enfin, on redémarre le service exploit.timer.

image détaillé du ctf

Et hop ! Un nouveau Pokémon apparaît : le fameux binaire XXD en SUID !
On se rend sur GTFOBins pour explorer ce que l'on peut faire. On découvre qu'on peut lire ou écrire des fichiers dans des emplacements où seul root a le droit d'agir.

image détaillé du ctf

Il existe plusieurs techniques. Je pourrais faire fuité directement le fichier root.txt, mais imaginons que nous ne sachions pas comment le fichier s'appelle. Dans ce cas, il nous faudrait un accès root. Pour cela, je choisis d'ajouter ma clé publique dans authorized_keys de root, puis de me connecter en tant que root.

image détaillé du ctf

Et maintenant, nous pouvons nous connecter en tant que root avec la clé privée.

image détaillé du ctf

Et ainsi, obtenir le flag root !

image détaillé du ctf

Conclusion

Merci d'avoir suivi ce write-up, et j'espère que vous avez pris autant de plaisir à le lire que j'en ai eu à le rédiger. N'hésitez pas à partager vos pensées ou questions, et à bientôt pour de nouvelles aventures dans le monde de la cybersécurité ! 🚀

image détaillé du ctf