Blog/Portoflio cybersécurité

Overpass

Write-up de la room Overpass : analyse d'une authentification côté client, accès SSH et abus d'une tâche cron.

Objectif : Obtenir l'accès avec un user lambda pour ensuite élever nos privilèges.


1. Reconnaissance initiale

Tout d'abord on va lancer un scan nmap pour trouver potentiellement des services exposés ou technos vulnérables.

sudo nmap -sSV --top-port=1000 -Pn --disable-arp-ping -O 10.130.161.179 -oN Overpass-
Résultat du scan nmap
Résultat du scan nmap

Analyse : Ici on peut voir seulement deux ports ouverts.

  • 22 SSH qui semble être à jour
  • 80 Golang sans forcément de version trouvée, on va donc devoir chercher plus loin.

2. Énumération Web

Avant de lancer l'énumération on va se rendre sur la page HTTP :

Page d'accueil de l'application
Page d'accueil de l'application

On peut naviguer un petit peu pour trouver quelque choses de pertinent, le code source qui pourrait nous être utile. Une fois téléchargé on peut un peu analyser :

Code Source Overpass
Code Source Overpass

On voit que le password manager utilise du ROT47. Ensuite dans le restant du code il n'y a rien de particulier.

On peut passer à l'énumération :

gobuster dir -u http://10.130.161.179/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -o gobuster.txt

Découvertes :

  • /IMG/Overpass
  • /downloads
  • /aboutus
  • /admin
  • /css

Analyse : Formulaire de log in (potentiellement brute-forçable ?)

Fomulaire Log In
Fomulaire Log In

Une fois toutes ces pages listées avant de faire quoi que ce soit de manière active on va inspecter le code source qui semble le même sur toutes les pages sauf...

Script Log In Source
Script Log In Source
  • Ici on a un script qui n'apparaît pas sur toutes les autres pages : /login.js
Analyse Log In
Analyse Log In

En y jetant un oeil on se rends compte qu'il y a la fonction login à la fin. En analysant un peu plus on peut se rendre compte qu'il y a un souci :

    if (statusOrCookie === "Incorrect credentials") {
        loginStatus.textContent = "Incorrect Credentials"
        passwordBox.value=""
    } else {
        Cookies.set("SessionToken",statusOrCookie)
        window.location = "/admin"
    }
}

On a si le status ou le cookie n'est pas correct on aura "credential" sinon on a une autre manière de se connecter avec le SessionToken qui sans surprise est manipulable en revanche cela fonctionne que sur /admin.


3. Point d’entrée / Exploitation

  • Type : Mauvaise config
  • Endroit : Script /admin/login.js

On va donc utiliser cURL pour ajouter des cookies à notre requête :

curl "http://10.130.161.179/admin/" --cookie "SessionToken=ABCD"
Cle SSH en clair
Cle SSH en clair

On reçoit une réponse qui nous est plutôt intéressante. Une clé privée SSH. On va donc essayer de l'utiliser directement, un nom nous est fourni dans la même page : James. On copie donc la clé privée SSH sur notre machine, on lui attribue les bons droits (chmod 600) puis on tente de se connecter.

PassPhrase à cracker
PassPhrase à cracker

On se rends compte qu'il y a une passphrase qu'on ne connaît pas. On peut donc tenter de la cracker avec john.

ssh2john id_rsa > id_rsa.hash

Cela nous permet de récupérer le hash.

Ensuite on peut utiliser john :

Crack Hash JohnTheRipper
Crack Hash JohnTheRipper

On peut donc se connecter à la machine

ssh -i id_rsa james@IP 

Une fois connecté on peut récuperer le flag user. Avec un peu d'énumération locale on remarque donc que le user a un .overpass (le password manager que les étudiants ont créé) on va y jeter un oeil :

Fichier Overpass James
Fichier Overpass James

On obtient donc une suite de caractères. Souvenez vous au début on a pu analyser que le password manager utilise du ROT47. On peut donc tenter ceci sur CyberChef :

Rotation MDP Cyberchef
Rotation MDP Cyberchef

Bingo ! On a donc le mdp du user james.


4. Post-exploitation / Élévation de privilèges

On peut passer l'énumération locale plus poussée avec des banalités comme :

hostname
id
whoami
sudo -l
find / -perm -4000 2>/dev/null
cat /etc/crontab

Analyse :

  • Tâche cron lancée par root toutes les minutes.
  • Pas d'IP mais un nom : overpass.thm
  • Analyse de /etc/hosts
  • Vulnérabilité / mauvaise config : <SUID, sudo mal configuré, kernel exploit, etc.>
  • Explication du raisonnement.
Permission Hosts
Permission Hosts

Si on regarde les permissions on s'aperçoit qu'on a les droits d'écrire dans le /etc/hosts. On va donc pouvoir remplacer 127.0.0.1 par notre IP puis servir un script qui nous permettra d'exfiltrer des données du dossier root.

On va donc recréer l'arborescence identique au script :

Arborescence Script
Arborescence Script
Script
Script

Ensuite le script sera simple on va envoyer la sorte de root.txt vers un fichier texte dans le home du user sur lequel on est.

Il nous reste plus qu'a ouvrir un serveur HTTP avec python (attent il faut faire ça dans webroot pour que lorsque ça partage on ait ceci : overpass.thm/downloads/src/buildscript.sh et ici overpass.thm sera notre machine)

Flag Root
Flag Root

On a donc récupéré le flag root !