Health HTB

Health HTB

Une box Linux de difficulté Medium créée par irogir qui demande une analyse pointilleuse de code, une imunité aux migraines dues à la cryptographie et beaucoup d'organisation pour regrouper toutes les éléments à chaque étapes.

Enumeration

NMAP

Premièrement, on lance un scan Nmap de la machine hôte avec les scripts de détection par défaut pour trouver des ports TCP ouverts.

Nmap Scan

3 services:

  • SSH sur le port 22
  • HTTP sur le port 80
  • PPP sur le port 3000

Le port 3000 est filtré mais nous pourrons y accéder d'une autre manière...

Concentrons-nous sur l'application Web qui tourne sur le port 80.

Web Application

On arrive sur une application d'observation de la santé de services HTTP. Elle semble créer des tâches (programmable avec un système CRON) pour envoyer les informations de santé d'un service HTTP à une autre URL.

Callback

La box n'a normalement accès qu'au réseau local. Voyons si l'application peut nous envoyer les informations de santé de notre machine attaquante à nous-même.

Callback Response

On voit bien qu'elle vient faire une requête GET mais échoue dans l'envoi de la requête POST.

Le script python qu'on va utiliser pour recevoir les informations gère les GET et les POST. Il écoute par défaut sur le port 8080.

Post Server

Malheureusement, le pare-feu semble empêcher de faire des requêtes vers la cible directement via le WebHook.

Test Trigger

Un autre script python va servir d'intermédiaire et rediriger les requêtes de notre machine vers port 3000 de la cible, auquel nous ne sommes pas censés avoir accès.

Redirect Server

Maintenant, en observant notre port 80 et en envoyant (*/1 * * * * -> toutes les minutes) les infos sur notre port 8080...

Setup Webhook

La requête est bien redirigée...

Redirect Confirm

On obtient une page HTML et on apprend que le service qui tourne sur le port 3000 de la cible est, en fait, un service d'auto-hébergement Git développé en Go: Gogs pour Go Git Service.

Post Response

On essaye de formatter tout ça pour y voir un peu plus clair avec jq.

Response Format

En supprimant au maximum les caractères en trop et en isolant le HTML, c'est beaucoup plus lisible.

Response HTML

On est face à une version obsolète du projet (Gogs v0.5.5) qui a une vulnérabilité connue, une Injection SQL. Modifions l'URL de redirection de notre serveur et essayons l'exploit tel quel pour voir...

Test Payload

Rien...

Test Response

EXPLOIT

Bon, il est temps de se plonger dans de la lecture de code (puisqu'il est opensource) pour comprendre la nature et la structure de la base de données dans le projet, puis de contourner les filtres sur les caractères d'espacement avec /**/.

L'API a un endpoint /users sur lequel appliquer l'injection.

Après beaucoup de tatonnements, on s'approche enfin des données dans la table user.

Injection Redirect

Finalement, on arrive à retrouver des informations sur une utilisatrice susanne.

Injection Response

Le hash de son mot de passe.

Injection Format

Puis le grain de sel nécessaire au calcul du hash.

Salt Redirect

Salt Response

Maintenant, il faut mettre au bon format (utilisateur, hash, sel) pour permettre à hashcat de le cracker.

Le hash du mot de passe devra être passé de l'hexadécimal au binaire puis encodé en base 64.

echo '[HASH]' | xxd -ps -r | base64

Et le salt encodé en base64.

Pour hashcat, le hash doit être au format: sha256:[ITERATION]:[BASE64_SALT]:[BASE64_HASH]

Cracking Hash

Et finalement, on arrive à obtenir le mot de passe de susanne.

SSH Foothold

On se connecte en SSH avec ses identifiants. A ce stade, on peut récupérer le flag user.txt qu'on a bien mérité.

User Flag

On continue à chercher sur la machine cible des fichiers intéressants et on tombe sur des identifiants pour se connecter à un service MySQL.

Database Creds

On s'y connecte et on regarde ce que contiennent les bases de données.

PRIVILEGE ESCALATION

MySQL Connection

On y retrouve les tâches créées via l'interface Web de monitoring.

MySQL Tasks

N'étant plus dépendants des filtres durant la création d'une tâche, on peut en modifié une existante pour exfiltrer des fichiers.

MySQL Update

On change donc la valeur du champ monitoredUrl par le chemin du fichier de configuration SSH du compte root contenant la clé privée.

Get Key

On la récupère via le serveur en écoute qu'on a mis en place au début

Get Root

Le flag root est enfin à nous.

La partie inspection du code de Gogs et de documentation sur les différentes méthodes d'injection suivie du casse-tête crypto pour trouver le bon format m'ont largement sorti de ma zone de confort.

Merci à irogir pour cette box qui met la lumière sur des vulnérabilités qui commencent à dater sans être encore suffisamment documentées.

N'hésitez pas à aller lui donner du "respect" sur son profil si elle vous a plu.

Liens: