Secret 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 (80,22,3000)

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:

Observation : Le même site web est accessible sur les ports 80 et 3000.

Recherche de répertoires :

Nous utilisons Gobuster pour rechercher des répertoires sur le site:

Enregistrement d'un utilisateur API

Dans la section "docs", nous trouvons des instructions pour enregistrer un utilisateur. Exemple pour l’utilisateur "jordan" :

Authentification API

Pour se connecter :

Cela nous retourne un token d'authentification (auth-token).

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoiam9yZGFuIiwiZW1haWwiOiJqb3JkYW5AaHRiLmNvbSIsImlhdCI6MTczMDI3ODEyM30.z6quBZ6bTMSrkl7NxIfLEL0gUw6Wjvm3HWdnlhZBUoQ

Vérification du Json Body par défaut

email: "[email protected]"

password: "Kekc8swFgD6zU"

Vérification vulnérabilité JSON Web Token

Utilisez un site pour décoder le JWT afin de lire et manipuler son contenu.

Note : Le token JWT devrait être invalide. En modifiant les champs "name" et "email" pour ceux d’un administrateur :

"name": "theadmin",

"email": "[email protected]",

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.yn6hXmpBxrfb5TMDY4_6zirckzlhnQP_L_YWb4wL2Ug

Tentative d'accès à une API privée:

Essai de connexion à une API privée en utilisant le JWT modifié :

Nous recevons un message "invalid token".

Avec notre propre JWT, nous avons un accès en tant qu’utilisateur normal :

Nous recevons un message "You are normal user".

Énumération des routes API avec Wfuzz

Utilisez Wfuzz pour explorer les routes disponibles :

Nouvelle découverte : la route /api/logs.

Analyse du code source

La page web offre une option pour télécharger le code source.

Trouvailles :

  • Un fichier .env contenant un token_secret avec la valeur "secret".

Un dossier .git avec un commit indiquant la suppression du fichier .env.

L’ancien token_secret supprimé est retrouvé:

gXr67TtoQL8TShUc8XYsK2HvsBYfyQSFCFZe4MQp7gRpFuMkKjcM72CNQN4fMfbZEKx4i7YiWuNAkmuTcdEriCMm9vPAYkhpwPTiuVwVhvwE

Utilisez cet ancien token_secret pour signer un JWT avec les informations d'admin, et accédez à l'API privée :

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2NzIxZjE5ZmQ4YWMzZTA0NjMxZjc4NmQiLCJuYW1lIjoidGhlYWRtaW4iLCJlbWFpbCI6InJvb3RAZGFzaXRoLndvcmtzIiwiaWF0IjoxNzMwMjc4MTIzfQ.9YpH72pzpIjqRjc8EYBKhjLgmwjhetzpbDfVgXDzQi8

Résultat : Message de bienvenue en tant qu'admin : "welcome back admin".

Enfin, en exécutant la route /api/logs, le contenu suivant est affiché :

En examinant le fichier privitate.js et en analysant le code, on constate que :

Vulnérabilité RCE:

Ce code présente un problème de sécurité en raison de l'injection de commandes. Étant donné que file provient des paramètres de la requête et est inséré directement dans la commande du terminal, un utilisateur malveillant pourrait modifier file pour exécuter d'autres commandes. La fonction de cette route est d'exécuter la commande git log --oneline [file] sur le système, où [file] est un fichier spécifique demandé dans le paramètre de requête de la demande.

Voici un exemple de commande curl qui tente d’injecter id:

Nous allons exécuter un reverse shell :

  1. Créez un fichier index.html sur notre machine et créez un serveur web avec le contenu suivant :

  1. Ensuite, mettez-vous à l'écoute sur le port 4444 :

Exécutez une injection avec curl sur notre serveur web :

Flag user.txt :)

Traitement du terminal : Une fois que vous avez accès au serveur Linux, voici les commandes à exécuter pour un traitement efficace dans le terminal :

Cela permettra de travailler de manière beaucoup plus efficace et surtout plus confortable.

Élévation de Privilège (SUID)

Avec la commande suivante, nous recherchons si notre utilisateur a des privilèges SUID :

Nous trouvons un fichier rare situé à /opt/count, dont le propriétaire est root.

En exécutant ce binaire, il nous demande de fournir un fichier, puis il nous liste le nombre total de caractères, de mots et de lignes. Ce script va lire le contenu du fichier et ensuite afficher ses propriétés.

Core Dump Binaire

En examinant le code source, nous pouvons observer qu'un core dump est généré, stockant temporairement le contenu en cas d'erreur.

Les erreurs sont enregistrées dans le répertoire /var/crash. Voici comment créer un core dump :

  1. Entrer le nom du fichier ou du répertoire :

    (Clé SSH root)

  2. Sauvegarder les résultats dans un fichier ?

    (Mettre en arrière-plan)

  3. Obtenir le PID :

    (Copier le PID)

  4. Tuer le processus :

  5. Relancer le binaire :

  6. Vérifier le répertoire des core dumps :

    (Un nouveau fichier apparaît : _opt_count.1000.crash)

Nous avons maintenant un core dump en base64 contenant la clé SSH de root.

Apport-umpack

Pour extraire les informations, nous allons utiliser apport-unpack :

Ensuite, nous allons lister le contenu du fichier dans /tmp/ssh/coredump à l'aide de strings :

Nous trouvons ainsi la clé SSH root

Connexion SSH

Une fois que nous avons créé le fichier id_rsa avec les permissions 600, nous pouvons nous connecter via SSH :

Flag root :)

Mis à jour

Ce contenu vous a-t-il été utile ?