Журналювання доступу користувачів (UAL)¶
Що таке UAL¶
Журналювання доступу користувачів (User Access Logging, UAL) — це функція Windows Server, яка встановлена й увімкнена за замовчуванням починаючи з Windows Server 2012 і агрегує в базах даних ESE запити клієнтів до ролей сервера. Для кожної ролі, адреси клієнта й облікового запису UAL зберігає, коли клієнта вперше та востаннє було помічено протягом року, загальну кількість запитів і лічильник для кожного дня року. Серед ролей — File Server (SMB), Active Directory Domain Services, Active Directory Certificate Services, DHCP Server, Print and Document Services, Remote Access, Web Server (IIS) і Windows Server Update Services.
UAL цінний для розслідувань латерального переміщення: його рядки клієнтів показують, які адреси й облікові записи використовували сервер і в які дні, — часто ще довго після того, як журнали подій було перезаписано.
Найобґрунтованіший висновок: клієнт із записаною адресою, автентифікований під записаним обліковим записом, використовував роль у кожен день, для якого є лічильник.
Розташування та збирання¶
C:\Windows\System32\LogFiles\Sum\Current.mdb
C:\Windows\System32\LogFiles\Sum\{GUID}.mdb (one per year)
C:\Windows\System32\LogFiles\Sum\SystemIdentity.mdb
C:\Windows\System32\LogFiles\Sum\Svc*.log, Svc.chk (transaction logs)
Current.mdb містить найновішу активність. SystemIdentity.mdb описує сервер, містить назви ролей і вказує
файл {GUID}.mdb, у якому зберігається кожен рік (CHAINED_DATABASES). Служба UAL тримає бази даних
відкритими: збирайте весь каталог Sum за допомогою криміналістичного збирача або зі знімка тому.
«Брудні» бази даних
Current.mdb, зібраний із працюючого сервера, часто «брудний». Juntei читає його в зібраному вигляді та
повідомляє про це, але не відтворює Svc*.log: активність, що існує лише в журналах транзакцій,
відсутня.
Застереження для аналітика¶
- UAL підраховує запити за день і не журналює кожен запит окремо. Єдині часові позначки рядка клієнта —
InsertDateіLastAccess. - Дні в
DailyAccesses— це дні за UTC. Address— це адреса, яку бачив сервер: між ним і справжнім клієнтом може стояти шлюз NAT, проксі або VPN.::1і127.0.0.1— це сам сервер.- Аналізуйте всі бази даних каталогу
Sum: той самий клієнт може мати рядки і вCurrent.mdb, і в{GUID}.mdbсвого року. - Відсутність рядків не доводить, що ніхто не підключався: UAL можна вимкнути (
Disable-Ualабо зупинивши службу User Access Logging), а в «брудній» базі даних бракує її найновіших змін. - Без
SystemIdentity.mdbзначенняRoleNameбереться з назв, які Windows Server дає своїм ролям. - Нульовий або некоректний
LastAccessне визначає рік. Juntei тоді використовує коректнийInsertDate, а далі метадані річної бази; без коректного року зберігаєтьсяDayOfYear. - Підсумки додають усі вихідні рядки.
Current.mdb, річні бази та знімки можуть містити ту саму активність; це не кількість з’єднань чи входів після усунення дублікатів.
Аналіз за допомогою Juntei¶
Usage: juntei parse-ese ual <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find Current.mdb, {GUID}.mdb and SystemIdentity.mdb
-f, --file <FILE> Parse one UAL database
Output:
-o, --output <PATH> Directory of CSV tables, or JSON/JSONL file
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ese ual -d Sum -o ual-csv
juntei parse-ese ual -d Sum -t jsonl \
| jq 'select(.Table == "CLIENTS") | {Address, AuthenticatedUserName, RoleName, LastAccess}'
Таблиці виводу¶
CSV створює по одному файлу на таблицю; якщо таблиця порожня, файл містить лише заголовок. Рядки JSON і JSONL
містять SourceFile (базу даних) і Table (назву таблиці в базі даних).
| Файл CSV | Таблиця | Вміст |
|---|---|---|
UAL-Clients.csv |
CLIENTS |
Клієнти кожної ролі: адреса, обліковий запис, перший і останній доступ за рік, загальна кількість запитів і кількість за кожен день. |
UAL-RoleAccess.csv |
ROLE_ACCESS |
Коли кожну роль було використано вперше та востаннє. |
UAL-DNS.csv |
DNS |
Пари адреси та імені хоста з часом, коли кожну з них було помічено востаннє. |
UAL-VirtualMachines.csv |
VIRTUALMACHINES |
Віртуальні машини Hyper-V: ідентифікатори, серійний номер, час створення та останньої активності. |
UAL-SystemIdentity.csv |
SYSTEM_IDENTITY |
Сервер: ім'я, домен, версія Windows, тип продукту, обладнання, часовий пояс і останнє завантаження; новий рядок може свідчити про перейменування, приєднання до домену або підвищення до контролера домену. |
UAL-ChainedDatabases.csv |
CHAINED_DATABASES |
Файл {GUID}.mdb кожного року. |
UAL-Roles.csv |
ROLE_IDS |
GUID ролей з їхніми назвами. |
UAL-<table>.csv |
Інша таблиця | Усі стовпці таблиці, якої Juntei не знає. |
Поля¶
| Поле | Інтерпретація |
|---|---|
SourceFile |
База даних, з якої прочитано рядок. |
RoleGUID, RoleName |
Роль і її назва з SystemIdentity.mdb, що лежить поруч із базою даних (за його відсутності — вбудовані назви). |
TenantID |
GUID орендаря (tenant) клієнта, якщо роль його повідомляє. |
TotalAccesses |
Запити клієнта за рік бази даних; сума DailyAccesses. |
InsertDate |
Коли створено рядок: перший запит клієнта за рік у цій базі даних (UTC). |
LastAccess |
Останній запит клієнта (UTC). |
Address |
IPv4- або IPv6-адреса клієнта. |
AuthenticatedUserName |
Обліковий запис, під яким автентифікувався клієнт (DOMAIN\user; імена облікових записів комп'ютерів закінчуються на $). |
ClientName |
Ім'я клієнта, якщо роль його повідомляє. |
DailyAccesses |
Дні із запитами та їхня кількість зі стовпців Day1 … Day366, датовані роком LastAccess: 2023-01-12: 5, 2023-01-13: 2 у CSV, об'єкти з Date і Accesses у JSON. День, рік якого невідомий, має DayOfYear замість Date. |
FirstSeen, LastSeen |
Перше й останнє використання ролі (ROLE_ACCESS), остання поява пари DNS (DNS), за UTC. |
CreationTime, LastSeenActive |
Коли було створено віртуальну машину або рядок SYSTEM_IDENTITY і коли віртуальна машина була активна востаннє, за UTC. |
OS-ProductType, OS-ProductTypeName |
1 Workstation, 2 Domain Controller, 3 Server. |
OS-CurrentTimeZone |
Зміщення сервера відносно UTC у хвилинах (-420 — це UTC-07:00). |
OS-LastBootUpTime |
Останнє завантаження сервера за UTC (якщо його не вдається прочитати — текст WMI у збереженому вигляді). |
| Інші стовпці | Усі інші стовпці таблиці під мітками полів Juntei у PascalCase, наприклад SystemDNS-HostName, SystemDomainName, OS-BuildNumber і SystemSerialNumber. |
Автоматичний аналіз¶
auto-parse записує таблиці до LateralMovement як UAL-Clients.csv, UAL-RoleAccess.csv тощо (один файл
UAL.json або UAL.jsonl з -t json чи -t jsonl) разом із LateralMovement/UAL-logs.txt. Об'єднана
хронологія -j містить кожен рядок, із Comp та ідентифікатором Artifact ual. -Z перетворює
InsertDate, LastAccess, FirstSeen, LastSeen, CreationTime, LastSeenActive і
OS-LastBootUpTime.