#Gestion des objets Active Directory avec PowerShell - ADSI Edit FR v1
Dates des Modifications
Intervenants
Twitter
Remarques
9 Octobre 2020
Huy KHA
@DebugPrivilege
Version Anglaise
9 Octobre 2020
Przemysław Kłys
@PrzemyslawKlys
Expertise LDAP / PowerShell
23 Octobre 2020
Olivier MATHIEU
-
Expertise LDAP
23 Octobre 2020
Florian MICHAUX
-
Conseils
23 Octobre 2020
Corentin LE BIVIC
-
Pandoc
25 Novembre 2020
mudpak
-
Version Française
Février 2023
Olivier MATHIEU
-
Intégration sur blog
#0. Avant-propos
#0.1 Important
Ce document est une traduction française du document orignal rédigé en anglais par Huy KHA.
L’auteur se réserve le droit
D’ajouter
De modifier
Supprimer
Le contenu sans préavis.
Tous les liens ont étés vérifiés et sont fonctionnels au moment de la rédaction du document, cependant certains ne semblent pas fonctionner lorsqu'on essaie un copié / collé (problème d'encodage) je suis en train de chercher une solution pour pallier à ce problème.
Ce document est la propriété exclusive de Huy KHA, il le met cependant à disposition du public pour que tout le monde puisse prendre connaissance et conscience de ce qui est possible de faire via l'éditeur ADSI tant au point de vue d'un Administrateur Système qu'au point de vue du domaine Offensif et Défensif.
Les documents originaux (en version Anglaise) se trouvent aux adresses ci-dessous :
je (mudpak) tiens à souligner le côté bénévole de l'auteur originale du document, cependant il est toujours appréciable de recevoir des dons pour nous récompenser et inciter à continuer à continuer ce genre de projets.
Przemysław Kłys : Aide et conseils grace à son expertise en PowerShell / LDAP.
Matthieu BILLAUX : L'idée d'avoir des document en français concernant le sujet de la sécurité vient de Matthieu, merci d'avoir lancé cette initiative et à inspiré d'autres personnes.
Avis personnel (mudpak) : Si vous souhaitez échanger un interlocuteur Francophone sur le sujet, je vous recommande de le contacter car il dispose d'une extertise importante sur LDAP.
le document peut comporter des erreurs, de traduction ou d'interprétation, vous êtes libres de contacter les auteurs et nous vous en remerciant d'avance.
vous pouvez également contribuer à l'amélioration du projet en proposant vos suggestions sur la page GitLab dédiée - https://gitlab.com/mudpak/adsi-edit-fr.
les commandes sont listées ligne par ligne pour une meilleure lisibilité, vous pouvez évidemment les lancer tels des blocs de scripts.
#0.3 Prérequis
Il est recommandé
d'avoir des connaissances sur l'environnement Microsoft Windows Active Directory
d'avoir des connaissances sur le langage PowerShell
Même si vous n'avez pas les connaissances sur ces sujets, vous pourrez néanmoins vous servir du document en approfondissant les connaissances selon vos besoins.
#0.4 Remerciements
Nous tenons à remercier Przemysław Kłys de nous avoir aidé PowerShell, notamment sur les questions liées aux filtres de recherche LDAP.
Przemysław est certifié MVP Microsoft dans le domaine de la gestion du cloud et des centres de données.
Son site web traite les sujets suivants
PowerShell
Active Directory
Office 365
Son site est disponible à l'adresse suivante :
https://evotec.xyz/
Mudpak tiens à remercier Huy de m'avoir accordé sa confiance en me sollicitant pour la traduction du document, merci pour les connaissances que j'ai acquises en travaillant sur le projet, you the best bro !
#0.5 Résumé
Le but de ce document est d'avoir une meilleure compréhension de l'ADSI et d'apprendre comment gérer l'Active Directory.
L'éditeur ADSI est un utilitaire qui fais partie de des outils RSAT.
Il permet aux administrateurs de gérer et voir les objets et attributs dans une forêt AD.
Quoiqu'il en soit l'éditeur ADSI est installé sur tous les postes ayant rejoint un domaine AD, que les outils RSAT soient installés ou non.
Ce qui le rend d'un côté plus intéressant pour l'administration mais d'un autre côté d'un point de vue Offensif.
Si nous regardons d'un point de vue de l'administration, ADSI offre les mêmes possibilités que les outils RSAT PowerShell ce qui le rend bien meilleur sur ses performances, ce qui ne requiert pas d'installation pour gérer un serveur AD.
Si nous regardons d'un point de vue Offensif, puisque ADSI est disponible sur toutes les machines appartenant à un domaine, les attaquants pourraient l'utiliser pour effectuer une reconnaissance sur une cible.
#1. Introduction
Il est très important de préciser que ceci n'est pas un cours de PowerShell, cependant nous allons énormément utiliser ce langage tout au long de ce document.
#Résumé
J'ai commencé en tant qu'administrateur Windows et Active Directory avant de continuer en sécurité.
A cette époque je ne savais pas grand-chose sur l'AD, et me souviens même d'une personne ayant dit que "qu'elle n'avait pas suffisamment de droits pour gérer un AD" car elle ne pouvait pas lancer la console Utilisateurs et Ordinateurs Active Directory.
Vous pouvez imaginer que cette personne qui posait cette question est devenue Administrateur du Domaine pour se connecter au contrôleur de domaine et lancer la console Utilisateur et ordinateurs active directory.
Je ne me souciais guère de la sécurité, mais j'ai compris que ce n'était pas une bonne idée que de donner des privilèges d'Administrateur du Domaine à tout le monde.
La plus-part d'entre eux n'en ont pas besoin, notamment pour utiliser la console Utilisateurs et ordinateurs active directory présente sur tous les contrôleurs du domaine.
J'ai commencé à utiliser l'interface graphique (Console Utilisateurs et ordinateurs active directory) et je continue de l'utiliser, mais j'ai réalisé que ce n'est pas une manière efficiente lorsque j'ai des tâches à automatiser.
Alors j'ai décidé d'utiliser ADSI en ligne de commande dans le but de gérer l'AD.
J'ai documenté chaque requête et j'ai essayé de comprendre comment je pourrais l'utiliser via la ligne de commande.
Le document a commencé à être rédigé en 2016, je l'ai mis à jour en ajoutant une couche "Sécurité" dans le but de vous le partager.
Dans ce document vous allez principalement apprendre comment énumérer les informations dans un AD et comment effectuer les tâches d'administration que chaque administrateur doit effectuer.
Différents exemples sont montrés pour garder le document claire et simple.
#1.1 Présentation de ADSI
#Résumé
ADSI ou Active Directory Service Interface est un utilitaire qui permet aux administrateurs de voir et gérer les objets et leurs attributs dans l'AD.
ADSI fais partie des outils RSAT (Remote Server Administration Toolkit), qui se trouvent dans le répertoire system32 lorsqu'ils sont installés.
Voici un aperçu de la console graphique ADSI :
Nous pouvons voir qu'il est possible de gérer les objets et leurs attributs comme vu précédemment.
Nous pouvons également voir les propriétés LDAP ci-dessous.
Dans l'exemple, l'attribut ms-DS-MachineAccountQuota permet de définir le nombre de comptes d'ordinateur un utilisateur est autorisé à créer dans le domaine.
#1.2 Propriétés LDAP
#Résumé
L'AD a des objets et attributs. Chaque objet contient différents attributs et les attributs peuvent être
un nom
un email
numéro de téléphone
...
Ci-dessous nous pouvons voir les attributs LDAP, il est possible de les "lire" pour tous les utilisateurs authentifiés.
Puisque ces attributs sont disponibles en "lecture" pour tous les utilisateurs authentifiés, il n'est pas nécessaire d'avoir des privilèges pour connaitre ces informations.
#1.3 Propriétés LDAP d'horodatage
#Résumé
Nous allons effectuer une requête LDAP sur une propriété qui existe dans le DNC (Domain Naming Context).\
Le DNC contient tous les objets qui sont répertoriés (ou stockés) dans un domaine.
Ci-dessous nous pouvons voir l'attribut minPwdLength qui spécifie le nombre de caractères minimum qu'un mot de passe peut contenir.
Nous obtenons le même résultat, et nous n'avons pas besoin de saisir le "distinguishedName".
Remarque : Chaque fois que vous voyez quelque chose de semblable à "", la valeur originale peut être un horodatage.
ADSI dispose d'une méthode nommée ConvertLargeIntegerToInt64 qui permet de convertir n'importe quel horodatage en attribut.
Nous allons maintenant voir quand est-ce que le mot de passe du compte KRBTGT a été réinitialisé pour la dernière fois.
La première chose à faire est de savoir où se trouve ce compte dans l'AD.
Par défaut le compte se trouve dans le container Utilisateurs.
Il est important de savoir que les filtres LDAP sont
objectClass
objectCategory
objectClass est un composant du schéma AD, ce qui peut être par exemple
un ordinateur
une OU (Unité d'Organisation)
un container
une GPO (Stratégie de Groupe)
...
Il n'y a pas de grande différence entre objectClass et objectCategory.
Cependant il est recommandé d'utiliser objectCategory pour les filtres, car objectCategory est à la fois une valeur unique et indexée tandis que objectClass est à valeurs multiples et non indexée.
En d'autres termes les requêtes LDAP avec objectCategory seront plus efficientes contrairement à celles avec objectClass.
Ci-dessous nous pouvons voir que l'attribut objectCategorty sur un objet, dans notre cas un ordinateur.
Modifions notre commande pour nous intéresser uniquement aux contrôleurs de domaine.
Comme vous devez surement le savoir, lorsqu'un poste est promu Contrôleur de Domaine, il devient membre du groupe "Contrôleurs de domaine".
Ce groupe se trouve dans le container "Utilisateurs" et son objectSID se termine par 516.
Ce qui signifie si vous souhaitez trouver tous les contrôleurs de domaine dans votre réseau, il faut saisir la commande suivante :
Comme vous pouvez le constater dans la commande, nous utilisons l'opérateur logique ET : "&".
C'est dû au fait que nous effectuons deux opérations en même temps, d'une part
nous cherchons tous les postes du domaine
D’autre part
nous cherchons les postes qui sont des contrôleurs de domaine
Nous obtenons tous les contrôleurs de domaine de notre réseau :
Vous vous demandez sans doute pourquoi on filtre sur l'attribut primaryGroupID=516 ?
Ci-dessous nous pouvons voir l'attribut primarygroupID sur une machine dans l'AD.
A l'attribut objectCategory nous constatons qu'il s'agit d'un ordinateur.
A l'attribut primaryGroupID nous constatons qu'il se termine par 516 et comme précisé précédemment l'attribut objectSID pour les contrôleurs de domaine se termine par 516.
Ajoutons d'autres paramètres dans la requête LDAP, nous allons filtrer tous les postes qui sont contrôleurs de domaine mais dont le système d'exploitation est Windows Server 2019.
Puisque nous cherchons des serveurs 2019, nous pouvons faire une recherche via l'attribut operatingSystem qui existe sur tous les comptes d'ordinateur.
Nous obtenons deux résultats :
Saisir la commande suivante :
([adsisearcher]'(&(objectCategory=computer)(operatingSystem=Windows Server 2019*)(primaryGroupID=516))').FindAll()
Dans la commande ci-dessus nous avons inclus 3 attributs qui sont
objectCategory
operatingSystem
primaryGroupID
Désormais nous n'avons qu'un seul résultat qui correspond à notre critère de recherche :
Pour ce dernier exemple nous allons effectuer une requête LDAP pour obtenir la liste de tous les utilisateurs qui sont dans le groupe Administrateur du domaine.
Tous les groupes AD ont un attribut spécial nommé memberOf.
Cet attribut permet de savoir à quel groupe appartient un utilisateur.
Voici un exemple :
Nous allons effectuer une requête pour énumérer les membres du groupe Administrateur du domaine.
Nous obtenons la liste de tous les utilisateurs appartenants au groupe Administrateur du domaine.
Nous allons désormais effectuer une requête pour afficher tous les comptes ayant un SPN et ensuite afficher l'attribut pwdLastSet pour ceux qui en ont un également.
Voici mes quelques requêtes LDAP que je n'avais pas encore posté sur internet.
Les intitulés des commandes en \textcolor, signifient que les commandes peut être intéressantes pour les Pentesters (Red Team) et aussi pour les équipes de sécurité \textcolor{(Blue Team)}.
Vous devez comprendre les opérateurs logiques pour optimiser vos requêtes LDAP.
Nous allons voir par la suite les opérateurs logiques avec des exemples détaillés.
Il n'y a rien de bien compliqué mais cela requiert simplement la logique qui est derrière.
Pour obtenir tous les utilisateurs du domaine, nous allons utiliser l'opérateur égal "=".
Pour obtenir la liste de tous les ordinateurs du domaine, saisir la commande suivante :
([adsisearcher]'(objectClass=user)').FindAll()
Maintenant nous allons modifier la commande pour obtenir la liste de tous les utilisateurs qui sont protégés par AdminSDHolder.
Pour les voir nous allons utiliser l'attribut "adminCount=1".
Puisque nous allons utiliser la commande précédente et ajouter des paramètres supplémentaires, nous allons utiliser l'opérateur "&" pour cumuler les recherches, d'une part
Maintenant nous allons faire l'inverse de ce qu'on nous avons fait précédemment, c'est à dire utiliser l'opérateur "!" pour dire qu'on souhaite exclure des résultats les utilisateurs ayant comme attribut "adminCount" et valeur à cet attribut "1".
Nous allons chercher les utilisateurs qui se sont trompés de mots de passe 5 fois ou plus.
Nous pouvons voir qu'il y a seulement 3 utilisateurs.
#2. Les tâches d'administration
#2.1 Créer un compte utilisateur
#Résumé
Dans cette section nous allons créer un compte utilisateur avec ADSI.
Nous n'utiliserons pas l'interface graphique de ADSI, mais tout se fera à l'aide du terminal.
Nous allons prendre le temps de vous expliquer chaque étape pour que vous compreniez la logique.
Dans notre cas, nous allons créer un compte pour "Anthony Smith" dans l'OU nommée "LHW".
Nous pouvons voir le chemin LDAP de l'OU :
Pour créer le nouveau compte, saisir les commandes suivantes :
[ADSI]$OU = "LDAP://OU=LHW,DC=contoso,DC=com"
$new = $OU.Create("user","CN=Anthony Smith")
$new.put("samaccountname","AnthonySmith")
$new.setinfo()
$new.put("userAccountControl",805306368)
$new.put("pwdLastSet",0)
$new.setpassword("MyShitPassw0rd!")
$new.setinfo()
$new.put("Description","UFC Figher at LHW")
$new.setinfo()
La commande à la première ligne permet de cibler l'OU dans laquelle nous souhaitons créer l'utilisateur "Anthony Smith", dans notre cas le chemin LDAP de l'OU est : LDAP://OU=LHW,DC=contoso,DC=com
Dans les deux prochaines lignes nous avons créé l'utilisateur et lui attribué le nom prénom (Anthony Smith).
L'attribut CN (Common Name) est le nom qui s'affichera pour le compte.
L'attribut samAccountName contient l'identifiant de connexion sur l'AD pour l'utilisateur.
La méthode SetInfo() met à jour les objets qui existent déjà dans le répertoire ou créez une nouvelle entrée d’annuaire pour les objets nouvellement créés
805306368 est la valeur de l'attribut samAccountType pour l'utilisateur, nous n'avons besoin que de cette information pour la création du compte.
Nous avons défini la valeur "0" de l'attribut pwdLastSet pour que l'utilisateur change son mot de passe à la prochaine connexion.
#2.2 Changer les propriétés LDAP
#Résumé
Dans le chapitre précédent nous avons simplement crée le compte utilisateur "Anthony Smith".
Maintenant nous souhaitons ajouter quelques informations dans ses propriétés LDAP, tels que
son numéro de téléphone
son adresse email
Pour faire cela nous pouvons utiliser les attributs
Comme vous pouvez le constater ce n'est pas bien difficile.
Dans un premier temps nous sélectionnons le chemin LDAP de l'utilisateur.
Dans un second temps nous utilisons la méthode "put() " pour ajouter des valeurs aux attributs
mail
telephoneNumber
Et pour appliquer nous utilisons la méthode "setinfo()".
Voici le résultat obtenu :
Voici un autre exemple dans lequel nous activons l'option "Le mot de passe n'expire jamais".
65336 est la valeur de l'attribue userAccountControl, et elle signifie "DONT_EXPIRE_PASSWORD", ce qui est équivalent à "Le mot de passe n'expire jamais".
Voici le résultat obtenu :
#2.3 Create computer account
#Résumé
Dans ce chapitre nous allons créer un compte d'ordinateur dans l'AD, ce qui ne diffère pas énormément de la création d'un compte utilisateur.
Nous avons ajouté un ordinateur au container "Computers" et crée un compte d'ordinateur nommé "TestPC".
Vous remarquerez que le nom du compte se termine par le symbole "$", en effet ce symbole est requis sinon vous ne pourrez pas créer un compte pour une machine.
Nous avons aussi ajouté la valeur 4096 à l'attribue userAccountControl, ce qui est équivalent à "WORKSTATION_TRUST_ACCOUNT".
Nous pouvons voir que le compte d'ordinateur a bien été créer dans le container "Computers".
Nous allons maintenant configurer le compte d'ordinateur pour de la délégation sans contrainte.
Il n'est pas recommandé d'avoir une telle configuration dans un environnement de production, nous le faisons juste pour des fins de démonstrations sur des serveurs de tests.
Nous pouvons voir que le compte de notre machine est bien configuré pour de la délégation sans contrainte.
#2.4 Créer une nouvelle OU - Unité d'Organisation
#Résumé
Dans ce chapitre nous allons voir comment créer une nouvelle OU.
Pour créer une nouvelle OU, nous devons spécifier le domaine dans lequel la créer, et le nom à donner à l'OU.
Dans notre exemple nous allons créer une OU nommée "CyberSecurity".
Nous venons d'ajouter l'utilisateur "Covington" au groupe administrateur local du la machine nommée "server".
#2.7 Afficher les administrateurs locaux sur une machine distante
#Résumé
Dans cette section nous allons voir comment afficher les administrateurs locaux sur une machine distante, en d'autres termes comment voir les membres du groupe administrateur local sur un poste distant.
Comme vous pouvez le constater, nous affichons les membres du groupe administrateur sur la machine distante nommée "server".
Dans le chapitre précédent nous avons ajouté l'utilisateur "Covington" au groupe administrateur local sur la machine nommée "server" et ci-dessous nous avons bien la confirmation qu'il faut bien parti du groupe.
#2.8 Créer un compte sur un poste local et sur une machine distante
#Résumé
Dans ce chapitre nous allons voir comment créer un compte sur un poste local et sur une machine distante.
Pour créer un compte sur un poste local, saisir les commandes suivantes en tant qu'administrateur :
Nous venons de créer le compte nommé "LocalAdmin", ayant comme mot de passe "Password01" et la valeur "65536" de l'attribut UserFlags, ce qui signifie que le mot de passe n'expire jamais.
Pour créer un compte local sur une machine distante, saisir les commandes suivantes :
Dans cet exemple, nous venons de créer un compte local sur la machine distante nommée "server".
Le mot de passe du compte est "Password01" et l'attribue UserFlags a pour valeur "65536 & 64" ce qui signifie que le mot de passe ne peut pas être changé.
#2.9 Afficher les comptes locaux sur un poste local et distant
#Résumé
Dans cette section nous allons voir comment afficher les comptes locaux sur un poste local, mais aussi sur un poste distant.
Pour afficher les comptes locaux sur une machine locale, saisir les commandes distantes :
$adsi = [ADSI]"WinNT://localhost"
$adsi.Children | where {$_.SchemaClassName -eq 'user'}
Nous pouvons voir les comptes locaux, dont celui que nous avons créés quelques chapitres plus haut.
Pour afficher les comptes locaux d'une machine distante, saisir les commandes suivantes :
$adsi = [ADSI]"WinNT://server"
$adsi.Children | where {$_.SchemaClassName -eq 'user'}
Nous avons la liste de tous les comptes locaux se trouvant sur la machine distante nommée "server".
Pour obtenir ces résultats nous devons être administrateur local sur le poste distant.
Nous pourrions ajouter le cmdlet "Format-List" pour obtenir les valeurs de lastlogin et userflags pour les comptes également.
Nous spécifions le chemin LDAP de l'OU où se trouve l'utilisateur ainsi que le chemin LDAP de l'OU vers laquelle nous souhaitons déplacer l'objet "utilisateur".
Nous constatons que l'utilisateur a bien changé d'OU :
#2.15 Modifier les propriétés LDAP sur plusieurs comptes utilisateurs
#Résumé
Il se peut que vous ayez besoin de changer les informations pour plusieurs utilisateurs se trouvant dans la même OU.
Il est tout à fait possible de le faire utilisateur par utilisateur mais cela peut prendre un certain temps, nous allons voir comment automatiser ce processus.
Supposons qu'on souhaite ajouter la description suivante "170lbs Fighter" à tous les utilisateurs se trouvant dans l'OU nommée "WW".
Saisir les commandes suivantes :
$OU = [ADSI]"LDAP://ou=WW,dc=contoso,dc=com"
$Child = $OU.Get_Children()
ForEach ($User In $Child)
{
If ($User.Class -eq "user")
{
$User.Put("Description", "170lbs Fighter")
$User.SetInfo()
}
}
Nous pouvons constater que la description a bien changée pour tous les utilisateurs se trouvant dans l'OU nommée "WW".
Si nous souhaitons changer le mot de passe pour tous les utilisateurs se trouvant de l'OU, saisir les commmandes suivantes :
Si nous souhaitons supprimer tous les utilisateurs de l'OU, saisir les commandes suivantes :
$OU = [ADSI]"LDAP://ou=LW,dc=contoso,dc=com"
$Child = $OU.Get_Children()
ForEach ($User In $Child)
{
If ($User.Class -eq "user")
{
$User.DeleteTree()
$User.SetInfo()
}
}
#2.16 Trouver les utilisateurs qui ne se sont pas connectés dans les 7 jours
#Résumé
Il arrive qu'on nous demande de fournir une liste des utilisateurs ne s'étant pas connectés dans un intervalle de 7 jours ou bien les utilisateurs n'ayant pas changé leur mot de passe durant les 30 derniers jours.
Pour obtenir ces informations nous pouvons utiliser la méthode PowerShell "ToFileTime".
Pour avoir la liste des utilisateurs ne s'étant pas connectés les 7 derniers jours, saisir la commande suivante :
Dans notre cas, nous obtenons 3 utilisateurs correspondant à nos critères de recherche :
Pour avoir la liste des utilisateurs n'ayant pas changé de mot de passe depuis 7 jours, il suffit de changer l'attribut lastlogonTimestamp par pwdLastSet.
Nous obtenons cette fois uniquement 3 résultats correspondant à nos deux critères de recherche :
#2.17 Sélectionner des attributs d'horodatage des utilisateurs situés dans une OU spécifique
#Résumé
Dans le chapitre précédent nous nous sommes intéressés au cas où les utilisateurs qui n'avaient pas changé de mot de passe depuis les 7 derniers jours.
Dans le cas présent nous allons nous intéresser aux utilisateurs se trouvant dans une OU précise, nommée "LHW".
Nous obtenons bien les ACE avec les permisisons "GenericAll" :
Exchange s'implémente profondément dans l'AD, donc l'exploitation des groupes administrateurs Exchange peut mener à une compromossions totale d'un Active Directory.
Concentrons-nous sur les ACE qui ont les permissions "GenericAll", outre les administrateurs de domaine et les administrateurs d'entreprise.
Nous pouvons voir à qui appartient le groupe Domain Admins :
#3.3 Prendre possession d'un objet AD
#Résumé
Dans ce chapitre nous allons voir comment prendre possession d'un objet AD, en nous attribuant les droits de celui-ci.
Nous allons prendre possession du groupe Domain Admins.
Supposons que nous soyons membre du groupe Domain Admins, mais pour s'assurer de la persistance, nous souhaitions prendre le contrôle des droits de ce groupe.
Dans l'exemple nous allons rendre Jones propriétaire du groupe.
Nous pouvons voir que Organization Management possède les droits "GenericAll" sur Exchange Windows Permissions :
Prenons le cas où l'utilisateur Jon Jones est membre des groupes
Exchange Admin
Organization Management
Le groupe Organization Management a tous les droits sur le groupe Exchange, ce qui signifie que nous pouvons nous mêmes nous ajouter au groupe Exchange Windows Permissions.
Nous pouvons constater que le groupe Exhcange Windows Permissions possède les droits "WriteDacl" (Modifier les permissions) sur Domain Naming Context.
Avoir autant de droits, assure à l'utilisateur le pouvoir de s'attribuer soi-même des permissions sur un objet.
Nous allons désormais nous attribuer les droits "ExtendedRight", ce qui signifie qu'on pourra notamment avoir les droits de réplication sur les secrets AD.
Nous pouvons constater que l'utilisateur Jon Jones possède bien les droits de réplication :
Replicating Directory Changes
Replicating Directory Changes All
Nous pouvons ainsi utiliser des outils tel que Mimikatz pour lancer une attaque DCSync dans le but d'obtenir le hash NT du compte KRBTGT par exemple.
#4. Énumération
#4.1 Énumération des serveurs avec une délégation sans contrainte
#Résumé
Comme nous le savons ce type de serveurs supportent une configuration peu sécurisée, ainsi si un attaquant prend le contrôle de ce type de serveur il peut s'en servir pour ses besoins futurs.
Pour obtenir la liste des serveurs qui sont configurés avec une délégation sans contrainte, saisir la commande suivante :
Remarque : nous avons exclus les contrôleurs de domaine de la recherche, car ils doivent être configurés pour de la délégation sans contrainte.
Supposons qu'on souhaite obtenir les comptes de services avec un SPN qui peut être utilisé pour obtenir leur TGS afin d'effectuer un bruteforce du mot de passe.
Nous allons chercher des comptes qui ont un SPN dont la valeur "adminCount=1".
#4.6 Énumération des comptes qui ne requièrent pas de mot de passe
#Résumé
Dans l'AD il est possible de spécifier de ne pas requérir de mot de passe pour un compte, toutefois cela ne signifie pas que le compte ne possède pas de mot de passe, cela autorise simplement l'utilisation d'un mot de passe "vide".
Pour obtenir les comptes correspondants à ces critères, saisir la commande suivante :
Nous obtenons la liste des membres du groupe Domain Admins :
Pour cet exemple cherchons plutôt les Enterprise Admins (Administrateurs de l'entreprise).
Puisque ce groupe également présent dans le container Users nous avons juste besoin de modifier la commande en remplaçant "Domain Admin" par "Enterprise Admin".
$ADSI.psbase.get_ObjectSecurity().getAccessRules($true, $true,[system.security.principal.NtAccount]) |? ActiveDirectoryRights - Match "GenericAll"
Ici nous avons un exemple d'utilisateur qui ne devrait pas avoir ces permissions :
Remarque : pour trouver les utilisateurs qui ont les droits d'écriture sur l'objet, dans la commande il faut remplacer la valeur "GenericAll" par "GenericWrite".
#4.10 Conclusion
Comme vous avez pu le voir tout au long du document, l'utilisation de ADSI n'est pas compliquée et par moments préférables aux outils RSAT.
En plus de cela, pourquoi ajouter des outils supplémentaires alors que vous pouvez administrer de manière native l'AD.
La compréhension de l'ADSI est bénéfique pour les Administrateurs, pour deux raisons principales
on peut l'utiliser sur toutes les machines
c'est rapide à l'utiliser, tout comme les outils RSAT
Connaitre et apprendre à utiliser ADSI n'est pas forcément réservé aux Administrateurs, qui que vous soyez cela va pour permettre de gagner en compétences.
Même si vous travaillez dans une équipe Sécurité (Blue Team, Red Team ...) il peut vous être utile de savoir utiliser l'ADSI, pour des opérations de sécurité sur l'AD notamment.
Certaines requêtes vous aideront même à avoir plus de détails sur l'installation, la configuration des éléments.
Pour les Red Team il peut être intéressant de maitriser l'ADSI, pour des besoins d'énumération tout en restant cachés des EDR (Endpoint Detection and Response) et SIEM (security Information and Event Management).
PS : Pour cette raison il est fortement recommandé d'activer la journalisation PowerShell.