[CTF] HTB Tabby write-up walkthrough
- Write Ups
- by Jacob Riggs
- 03-07-2020
This is my write-up and walkthrough for the Tabby (10.10.10.194) box user flag. Tabby is a Linux machine with some interesting web app CVEs to play with. I enjoyed using the Pwnbox feature in my last hackthebox write-up so decided I'd give it another go on this one. When commencing this engagement, Tabby was listed in HTB (hackthebox) with an easy difficulty rating.
Walkthrough
I spun up a new Pwnbox instance from the HTB dashboard and installed my VPN server key for my region.
Once the VPN server key was installed, I then pinged the target 10.10.10.194 to check if my instance could reach the Tabby machine.
To make things easier moving forward, I always opt to add the target machine IP address to my /etc/hosts file.
To do this I navigated to the /etc/hosts file.
And I added the target IP address and assigned it an identifier label tabby
Now this was set, I could begin some basic recon.
As part of my standard recon routine I used Nmap, which is an open-source network scanner designed to discover hosts, services, and open ports. My objective was to identify what ports might be open on the target machine.
I ran Nmap with the flags sudo nmap -sS -sC -sV tabby -oN scan
These flags told Nmap to do the following:
-sS
- Instructs Nmap to not complete the three-way handshake so the connection attempt is not logged on the target.
-sC
- Instructs Nmap to scan with default NSE scripts, which is useful and safe for discovery.
-sV
- Instructs Nmap to determine the version of any services running on the ports.
The Nmap scan results indicated ports 22
, 80
, and 8080
were open. This confirmed the server was running a web service and SSH.
I visited the IP address in my browser (port 80).
I had a look around and noticed that the statement at the bottom of the landing page relating to a data breach hyperlinked to the address http://megahosting.htb/news.php?file=statement
As this was unreachable, I added the domain to my existing hosts file for 10.10.10.194 so I could also reach it at tabby
I was unable to find anything of interest in the page content for the issued statement, but noticed the requested statement was being passed in the file
parameter. I wondered if it might be vulnerable to path traversal or SQLi.
I decided to use Burp to automate a fuzzing technique demonstrated in my previous path traversal attack tutorial. This fires a list of common path traversal attack strings as requests and compiles a list of the HTTP status code responses. After reviewing this list, I could see there were some anomalies indicating traversal was possible.
The first location I reached was the /etc/passwd located at http://tabby/news.php?file=../../../../../../../../etc/passwd
I could see at the bottom of the file, the users tomcat and ash existed.
The next location I reached was the /etc/hosts located at http://tabby/news.php?file=../../../../../../../../etc/hosts
This confirmed information I already knew and concluded my port 80
recon so I moved on to port 8080
and visited http://tabby:8080
to see if it was reachable.
This confirmed the server was running Apache Tomcat 9 and at the bottom indicated more user information might be present at http://tabby/news.php?file=../../../../../../../../etc/tomcat9/tomcat-users.xml
However, when I tried this file location it didn’t exist. I was also conscious at this point that my earlier path traversal fuzzing had not enumerated this path and file location in the results. I then tried manually amending the path until I reached a blank page at http://tabby/news.php?file=../../../../../usr/share/tomcat9/tomcat-users.xml
Viewing the source of this page then gave me the XML file markup.
This file provided user credential information for the user tomcat
with password $3cureP4s5w0rd123!
I got stuck at this point for a while so ended up looking back at my notes and searching on Google to see if there were any vulnerabilities in Apache Tomcat 9 that might help me get a shell.
My research showed me that Apache Tomcat 9 uses WAR (Web Application Archive) files to deploy web apps via servlets. These are a bit like JAR files, but contain everything the web app needs (such as JavaScript, CSS, etc), and according to Apache Tomcat 9 support documentation are controlled via commands from the manager application located here:
There was evidence in the public domain that Apache Tomcat 9 was previously vulnerable to a malicious WAR file upload vulnerability, but I had no idea if the specific version running on this server was patched or not. I decided to try anyway.
My first step was to search for a module I could use in Metasploit, then see if I could leverage that to craft and upload a tailored WAR file backdoor. I went for the java/jsp_shell_reverse_tcp
module and configured a reverse shell to listen for a connection from my machine 10.10.14.62
on port 1338
.
I then used curl
to push the newly generated WAR file to the Apache Tomcat 9 manager application using the credentials I had found before.
However, before I executed this, I needed to setup a listener using netcat on my own machine to listen for connection requests on the desired port 1338
Now I could execute the reverse shell.
netcat confirmed the reverse shell was active and I could see I was connected as the user tomcat
I then spawned a tty shell to help me navigate and interact.
I had a look around and moved into the /var/www/html/files
directory which listed what appeared to be a backup file.
I converted the compressed file to base64 and copied the verbose output, then used echo
to rebuild the file locally on my machine.
When I attempted to access the file I could see it was password protected.
I fired up frackzip and ran it against the famous rockyou.txt wordlist to see if I could bruteforce the password.
After about 15 seconds, frackzip found the password admin@it
Recognising that passwords are sometimes shared, I then went back to my shell and tried to use this password for privilege escalation.
I found it worked successfully on the user ash. I then listed the contents within the directory and opened the file user.txt which gave me the user flag.
ABOUT THE AUTHOR