MonitorsThree HackTheBox (Writeup)

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:31a181c8372e3afc59dab863430610e8

  • mwatson:c585d01f2eb3e6e1073e92023088a3dd

  • janderson:1e68b6eb86b45f6d92f8f292428f77ac

  • dthompson: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 : admin

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

Duplicati est un client de sauvegarde qui stocke de manière sécurisée des sauvegardes à distance encryptées, incrémentielles et compressées de fichiers locaux sur des services de stockage en nuage et des serveurs de fichiers

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 :

Clé
Valeur

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

  1. Copier-coller le mot de passe calculé.

  2. Utiliser Ctrl + U pour l’encoder en URL.

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