Write-Up
Step-by-step guide on the approach taken to pwn the machine.
Objective
The goal of this machine is to "find the flag."
Reconnaissance
We start by scanning the open ports of the target machine using nmap:
sudo nmap -F -T5 -sCV <ip_target>
-F
scans the 100 most common ports-T5
performs a fast, aggressive scan-sC
runs default scripts for common vulnerabilities-sV
provides service version information
The open ports are:
22 - SSH
80 - HTTP
Accessing the Web Application
We first navigate to port 80:
http://<ip_target>:80
The website redirects us to titanic.htb
, so we need to add this to our /etc/hosts
file:
sudo vim /etc/hosts
After editing the hosts file, we retry accessing the website.
Website Navigation
On the website, we quickly realize that the only functional buttons are "book your trip" and "book now," both of which lead to the same form. When we fill and submit the form, a JSON file is downloaded.
At this point, we decide to explore the directories on the server. For this, we use gobuster:
gobuster dir -u http://titanic.htb -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
We find two interesting directories:
/download
/book
(this leads to the JSON form)
Let's check out /download
.
Local File Inclusion (LFI) and Discovery of User
In the /download
directory, we notice that the ticket
parameter is required. We try performing Local File Inclusion (LFI) by modifying the URL:
http://titanic.htb/download?ticket=../../../../etc/passwd
We successfully download the file and save it as passwd.titanic.json
. Let's use grep
to find user information:
cat passwd.titanic.json | grep home/
We discover the developer
user. Next, we attempt to brute-force the SSH login using hydra:
hydra -l developer -P /usr/share/wordlists/rockyou.txt ssh://titanic.htb
However, we encounter a "connection refused" error. Despite this, we now have LFI, so let's explore other files.
Discovering a Subdomain
We attempt to access /etc/hosts
using LFI:
http://titanic.htb/download?ticket=../../../../etc/hosts
This reveals a subdomain: dev.titanic.htb
. We add this to our /etc/hosts
and navigate to it.
Accessing Gitea
The subdomain leads us to Gitea, a self-hosted Git service. We see a login page, so we try logging in with developer:developer
, but we get an error. To verify if "developer" is a valid username, we create a new user, developer
.
We can confirm that "developer" is already taken. Now, we create a new user, developer1
.
We navigate through the "Explore" section and find the docker-config repository under the developer
user.
Inside the repository, we explore the mysql
folder and discover database credentials for the ticketing system. We try connecting via MySQL using DBeaver, but we don't get access.
Investigating the Gitea Repository
The docker-config
repo contains a README.md
file with information on how the ticketing system works. We also see an app.py
file that contains route definitions, but nothing out of the ordinary. The static
folder contains a .css
file, and the templates
folder contains an .html
file. The only remaining folder is tickets
.
We explore the tickets
folder and find ticket data, but there's nothing immediately useful. However, based on Gitea's documentation, we learn that it stores the database at:
%(APP_DATA_PATH)/gitea.db
Using LFI to Access the Database
We go back to the /download
directory and modify the URL to access the Gitea database file:
http://titanic.htb/download?ticket=/home/developer/gitea/data/gitea/gitea.db
We open the database and navigate to the user
table.
Here, we find the hash and salt for the developer
user. To crack this, we use the gitea2hashcat Python script to extract the hash and salt, then run hashcat to brute-force the password:
hashcat -m 10900 hashdeveloper.txt /usr/share/wordlists/rockyou.txt
After a while, we successfully recover the password and log into SSH as developer
.
Privilege Escalation
Now that we have SSH access, we attempt to escalate privileges. We first check for sudo permissions and SUID binaries, but nothing useful comes up. We decide to investigate manually.
We navigate to the /opt
directory, where third-party software is stored. Here, we find a script named identify_images.sh
. After examining the script, we notice it uses ImageMagick.
Running magick --version
reveals that the version of ImageMagick installed is 7.1.1-35. We search for known vulnerabilities in this version and find CVE-2024-41817, which allows arbitrary code execution.
Exploiting ImageMagick Vulnerability
We create a shared library in the current directory to obtain root privileges and run cat root.txt
to capture the flag.
With a simple cat root.txt
the flag is our.
Last updated