MonitorsThree HackTheBox (Writeup)
Skills:
Subdomain Enumeration
SQLI - Manual Time Based Blind Injection (Python Scripting)
Cracking Hashes
Cacti Exploitation (CVE-2024-25642) - Malicious Package Import
Information Leakage
Internal Service Exploitation - Duplicati
Abusing Duplicati - Bypassing Login Authentication with Server Passphrase
Duplicati - Creating a backup for privileged reading and writing of files [Privilege Escalation]
Reconnaissance:
Création de l'espace de travail :
Nous établirons notre espace de travail en créant trois dossiers pour stocker les contenus importants, les exploits et les résultats de la reconnaissance à l'aide de Nmap.

Vérification de la Connectivité VPN
Vérification de la connexion VPN pour assurer une communication stable avec la machine cible.

Recherche des ports ouverts avec Nmap :
Exploration des ports ouverts et exportation dans le fichier "allPorts" dans le répertoire Nmap:

Analyse des ports ouverts avec extractPorts:
Utilisation de la fonction extractPorts pour afficher de manière synthétique les ports ouverts et les copier dans le clipboard.

Scan de la version des ports avec Nmap:
Utilisation de Nmap pour scanner la version des ports et extraction des informations dans le fichier "targeted" :

Pour résoudre les noms de domaine en adresses IP via DNS, on insère dans le fichier /etc/hosts le nom de domaine associé à son adresse IP


Énumération des répertoires:
Recherche uniquement des répertoires

Recherche de fichiers avec extensions spécifiques (PHP, HTML, TXT) dans le répertoire admin :
Nous trouvons le fichier db.php, mais il ne contient aucune donnée.

Injection SQL
Détection de la vulnérabilité
Nous avons identifié une vulnérabilité SQL dans la fonctionnalité "Mot de passe oublié". La payload suivante a été utilisée pour confirmer la vulnérabilité :

Confirmation de la vulnérabilité avec une attaque basée sur le temps
Pour confirmer la vulnérabilité, nous avons utilisé une attaque SQL basée sur le temps :
La réponse a pris 5 secondes, confirmant ainsi la vulnérabilité.

SQL Injection - Time Based
Automatisation de l'exploitation avec un script Python
Nous avons développé un script Python pour automatiser l'extraction des données via l'injection SQL. Le script a permis d'extraire le nom de la base de données, les noms des tables, des colonnes, et finalement les données sensibles comme les noms d'utilisateur et les mots de passe.
Base de données:
Exemple de script pour extraire le nom de la base de données :
Nom de la base de données :
monitorsthree_db

Bases de données:
information_schema, monitorthree_db

Tables:
Tables :
invoices,customers,changelog,tasks,invoice_tasks,users

Colonnes:
Colonnes de la table
users:id,username,email,password,name,position,dob,start_date,salary

Données extraites :

admin:31a181c8372e3afc59dab863430610e8mwatson:c585d01f2eb3e6e1073e92023088a3ddjanderson:1e68b6eb86b45f6d92f8f292428f77acdthompson:633b683cc128fe244b00f176c8a950f5
Crackage des mots de passe
Nous avons utilisé CrackStation pour cracker les mots de passe hashés. Les identifiants suivants ont été obtenus :

Identifiants :
Utilisateur :
adminMot de passe :
greencacti2001

Énumération des sous-domaines:
En utilisant la commande Gobuster pour l'énumération des sous-domaines :
Nous trouvons le sous-domaine cacti.monitorsthree.htb.

Nous ajoutons cette entrée dans /etc/hosts.

Accès au panneau de connexion Cacti :
Le panneau de connexion de Cacti, version 1.2.26, est accessible sur ce sous-domaine. Avec les identifiants admin:greencacti2001, nous réussissons à nous connecter.

Cacti RCE Vulnerability Exploitation
Pour exploiter la vulnérabilité RCE de Cacti, nous allons modifier un fichier PHP et exécuter un script d'exploitation :

Ce script crée un fichier compressé contenant un payload PHP qui sera injecté sur le serveur cible, nous permettant ainsi d'obtenir une reverse shell.

Élévation de privilèges :
En explorant le répertoire web /var/www/html, nous trouvons des fichiers de base de données dans le dossier cacti, notamment le fichier de configuration config.php situé dans /var/www/html/cacti/include/config.php.
Extraits de config.php :

Nous listons ensuite les utilisateurs dans la table user_auth de la base de données cacti :


Nous utilisons john pour cracker les mots de passe récupérés :
Cela nous révèle le mot de passe de l'utilisateur marcus : 12345678910.

Flag user.txt :)

Après cette étape, nous obtenons également la clé SSH de l'utilisateur marcus :

Nous allons d'abord observer les ports ouverts en interne avec la commande suivante :

Nous allons rediriger le port interne 8200 du serveur vers notre machine locale pour y accéder via notre navigateur. Cette redirection peut être réalisée via SSH avec la commande suivante:
Duplicati Explotation:
Duplicati byPass Login Authentication
Lors de l'analyse de la machine cible, un portail web Duplicati a été découvert. Ce portail présentait un panneau d'authentification demandant un mot de passe.

En explorant le système, le répertoire de configuration de Duplicati a été localisé dans /opt/duplicati. Un fichier SQLite nommé Duplicati-server.sqlite a été identifié comme potentiellement contenant des informations sensibles.

Téléchargement du fichier SQLite
Pour analyser ce fichier, il a été téléchargé sur notre machine locale en utilisant un serveur HTTP Python :

Analyse du fichier SQLite
Le fichier a été ouvert avec l'outil sqlite3 pour examiner son contenu :
Les tables ont été listées, et la table option a été sélectionnée pour extraction des données :

server-passphrase
Wb6e855L3sN9LTaCuwPXuautswTIQbekmMAr7BrK2Ho=
server-passphrase-salt
xTfykWV1dATpFZvPhClEJLJzYA5A4L74hX7FK8XmY0I=
server-passphrase-trayicon
ce13157b-a06e-4b60-811d-60d294e8d0ae
server-passphrase-trayicon-hash
L6FxIB9fOxk9uueTx270v9+1OQIJFfV7GfyN3pA83WE=
Conversion de la passphrase
La valeur de server-passphrase est encodée en Base64. Pour la décoder et la convertir en format hexadécimal, on utilise la commande suivante :

Cela a donné la valeur hexadécimale suivante :
Calcul du mot de passe final
Pour générer le mot de passe final, les étapes suivantes ont été exécutées dans la console du navigateur :
Définition de la passphrase salée :
Interception de la requête avec BurpSuite
Nous interceptons la requête et l'envoyons sur do intercept -> response to this request et ensuite nous cliquons sur forward.

Une requête HTTP a été interceptée avec Burp Suite révélant les informations suivantes:

Le champ Salt correspond à la valeur server-passphrase-salt extraite de la base de données
Calcul du mot de passe noncé :
Affichage du résultat :

Le mot de passe généré (noncedpwd) est :
bx8guiLaAag+uz6Ud+HRnu9mAb/kmzQB37Ht6e8WisA=
Injection du mot de passe et exploitation
Copier-coller le mot de passe calculé.
Utiliser Ctrl + U pour l’encoder en URL.

Cliquer à nouveau sur Forward pour finaliser l’exploitation.
Duplicati Backup Reading Files

Maintenant que nous avons accès au panneau d'administration de Duplicati, nous allons créer une nouvelle sauvegarde avec pour objectif d'exfiltrer la clé SSH.

Analyse de la configuration Docker
En observant le fichier docker-compose.yml, nous constatons que les fichiers sont stockés sur le répertoire source du système hôte, monté dans le conteneur.

Sélection du répertoire cible Pour garantir l'accès aux fichiers sensibles, nous définissons la destination du backup sur ce répertoire en sélectionnant:
Dossier source :
/source/home/marcus/

Source Data:
source/root/

Finalisation de la configuration
Enregistrer la configuration.

Lancer la sauvegarde pour récupérer les fichiers ciblés.

Extraction des fichiers sauvegardés
Après l'exécution de la copie de sécurité, trois archives ZIP sont générées.

Accès aux fichiers
Une tentative d’ouverture directe des fichiers échoue en raison de restrictions d’accès.
Cependant, via Duplicati, nous utilisons l’option Restore Files pour récupérer le contenu.

Restauration et exfiltration
Extraction des fichiers du backup.

Sélection du dossier /source/home/marcus/ comme source de restauration.


Flag root.txt :)
Après la restauration, nous explorons les fichiers et découvrons root.txt ! 🎉


Mis à jour
Ce contenu vous a-t-il été utile ?