經過六天的實戰演練,我們已經從環境建置走到了橫向移動,今天要做一個完整的回顧與整合,並補充一些重要但還未深入探討的觀念。更重要的是,我們要從「攻擊者思維」轉換到「防禦者視角」,建構一個全面的 AD 安全防護體系。
我們這六天實際上走完了一個標準的 AD 滲透測試流程:
Day 1: 環境準備(GOAD)
↓
Day 2: 偵察與枚舉(CME、Nmap、DNS)
↓
Day 3: 初始立足點(ASREPRoasting、弱密碼)
↓
Day 4: 權限提升(Kerberoasting)
↓
Day 5: 路徑分析(BloodHound)
↓
Day 6: 橫向移動(LLMNR/NTLM Relay)
攻擊階段 | 技術手段 | 所需條件 | 防禦難度 | 偵測難度 | 影響範圍 |
---|---|---|---|---|---|
偵察 | |||||
網段掃描 | CME/Nmap | 網路存取 | 易 | 易 | 低 |
DNS 枚舉 | SRV 查詢 | DNS 存取 | 難 | 中 | 低 |
RPC 枚舉 | RPCClient | 空連線 | 易 | 中 | 中 |
攻擊階段 | 技術手段 | 所需條件 | 防禦難度 | 偵測難度 | 影響範圍 |
---|---|---|---|---|---|
初始存取 | |||||
ASREPRoasting | GetNPUsers | 無 | 中 | 難 | 高 |
密碼噴灑 | CME | 使用者列表 | 難 | 易 | 中 |
LLMNR 投毒 | Responder | 網路位置 | 中 | 中 | 高 |
攻擊階段 | 技術手段 | 所需條件 | 防禦難度 | 偵測難度 | 影響範圍 |
---|---|---|---|---|---|
憑證存取 | |||||
Kerberoasting | GetUserSPNs | 有效憑證 | 難 | 中 | 高 |
NTLM Relay | ntlmrelayx | SMB未簽章 | 中 | 中 | 極高 |
攻擊階段 | 技術手段 | 所需條件 | 防禦難度 | 偵測難度 | 影響範圍 |
---|---|---|---|---|---|
橫向移動 | |||||
Pass-the-Hash | CME/psexec | NTLM Hash | 難 | 中 | 高 |
委派攻擊 | getST | 委派權限 | 難 | 難 | 極高 |
前面我們提到了 Kerberos 的基本流程,但沒有深入探討其安全機制:
# 檢查時間偏差
w32tm /query /status
# 強制同步時間
w32tm /resync /rediscover
為什麼重要?
AES256-CTS-HMAC-SHA1-96 (etype 18) ← 最安全
↓
AES128-CTS-HMAC-SHA1-96 (etype 17)
↓
RC4-HMAC (etype 23) ← 最弱但最常見
↓
DES-CBC-CRC (etype 3) ← 已棄用
特性 | NTLM | Kerberos |
---|---|---|
認證流程 | Challenge-Response | 票證式 |
相互認證 | ❌ 單向 | ✅ 雙向 |
委派支援 | ❌ | ✅ |
時間敏感 | ❌ | ✅ (5分鐘) |
網路效率 | 低(每次認證) | 高(票證重用) |
加密強度 | RC4/MD5 | AES/SHA |
中繼攻擊 | 易受攻擊 | 較安全 |
每個 AD 物件都有安全描述符,包含:
Security Descriptor
├── Owner (擁有者 SID)
├── Group (主要群組 SID)
├── DACL (Discretionary Access Control List)
│ └── ACE (Access Control Entry)
│ ├── Access Mask (權限遮罩)
│ ├── ACE Type (允許/拒絕)
│ └── Trustee (受託者 SID)
└── SACL (System Access Control List)
└── 稽核設定
關鍵權限解析:
SMBv1 (已棄用,極度危險)
├── 無加密
├── 易受中間人攻擊
└── WannaCry/NotPetya 利用此版本
SMBv2 (Windows Vista/2008)
├── 支援簽章
├── 改善效能
└── 減少往返次數
SMBv3 (Windows 8/2012)
├── 端對端加密
├── 安全方言協商
└── 透明故障轉移
# 檢查 SMBv1 狀態
Get-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
# 停用 SMBv1
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol
# 透過登錄檔停用
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" `
-Name SMB1 -Type DWORD -Value 0 -Force
LDAP 有三種安全等級:
1. LDAP (Port 389) - 明文傳輸
2. LDAPS (Port 636) - SSL/TLS 加密
3. StartTLS - 在 389 埠升級至加密
# 設定 LDAP 簽章要求
New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\NTDS\Parameters" `
-Name "LDAPServerIntegrity" -Value 2 -PropertyType DWORD -Force
# 啟用 LDAP 通道繫結
New-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\NTDS\Parameters" `
-Name "LdapEnforceChannelBinding" -Value 2 -PropertyType DWORD -Force
# 啟用 DNSSEC
Add-DnsServerSigningKey -ZoneName "domain.local" -CryptoAlgorithm RsaSha256
# 簽署區域
Start-DnsServerZoneSign -ZoneName "domain.local"
# 啟用 DNS Socket Pool
dnscmd /config /socketpoolsize 5000
# 啟用快取鎖定
Set-DnsServerCache -LockingPercent 100
傳統服務帳號的問題:
gMSA 的優勢:
# 建立 gMSA
New-ADServiceAccount -Name SQLService `
-DNSHostName SQLService.domain.local `
-PrincipalsAllowedToRetrieveManagedPassword SQLServers$
# 安裝 gMSA
Install-ADServiceAccount -Identity SQLService
# 設定服務使用 gMSA
Set-Service -Name MSSQLSERVER -Credential domain\SQLService$
AdminSDHolder 是保護特權群組的機制:
# 受保護的群組(預設)
- Domain Admins
- Enterprise Admins
- Schema Admins
- Administrators
- Account Operators
- Server Operators
- Print Operators
- Backup Operators
- Replicator
SDProp 執行每 60 分鐘執行:
信任類型 | 方向 | 傳遞性 | 風險等級 | 攻擊向量 |
---|---|---|---|---|
Parent-Child | 雙向 | 傳遞 | 低 | SID History |
Forest | 雙向 | 傳遞 | 中 | 跨林委派 |
External | 單/雙向 | 非傳遞 | 高 | 弱信任密碼 |
Shortcut | 單/雙向 | 傳遞 | 低 | 效能最佳化 |
# 檢查 SID Filtering 狀態
netdom trust domain1.local /domain:domain2.local /quarantine
# 啟用 SID Filtering
netdom trust domain1.local /domain:domain2.local /quarantine:yes
Tier 0 (控制層)
├── Domain Controllers
├── AD 管理系統
└── PKI/ADCS
Tier 1 (伺服器層)
├── 應用程式伺服器
├── 資料庫伺服器
└── Web 伺服器
Tier 2 (工作站層)
├── 使用者工作站
├── VDI
└── 終端設備
實施原則:
Event ID | 描述 | 嚴重性 | 回應措施 |
---|---|---|---|
4624 | 登入成功 | 低 | 記錄分析 |
4625 | 登入失敗 | 中 | 閾值告警 |
4648 | 明確憑證登入 | 高 | 即時告警 |
4672 | 特權登入 | 高 | 審查驗證 |
4768 | Kerberos TGT 請求 | 低 | 異常分析 |
4769 | Kerberos TGS 請求 | 中 | Kerberoasting 偵測 |
4776 | NTLM 認證 | 中 | 降級偵測 |
# 監控可疑的 Kerberoasting 活動
Get-WinEvent -FilterHashtable @{LogName='Security';ID=4769} |
Where-Object {$_.Message -match 'Ticket Encryption Type: 0x17'} |
Group-Object -Property {$_.Properties[0].Value} |
Where-Object {$_.Count -gt 5}
結合紅隊攻擊與藍隊防禦:
紫隊演練循環:
1. 威脅建模 → 識別關鍵資產
2. 攻擊模擬 → 執行 TTP
3. 偵測驗證 → 確認告警
4. 回應改善 → 優化流程
5. 知識轉移 → 團隊培訓
# AD-SecurityBaseline.ps1
function Test-ADSecurity {
Write-Host "=== AD Security Baseline Check ===" -ForegroundColor Cyan
# 檢查 SMB 簽章
$SMBSigning = Get-SmbServerConfiguration | Select RequireSecuritySignature
if ($SMBSigning.RequireSecuritySignature -eq $false) {
Write-Host "[!] SMB Signing is disabled" -ForegroundColor Red
} else {
Write-Host "[+] SMB Signing is enabled" -ForegroundColor Green
}
# 檢查 LDAP 簽章
$LDAPSigning = Get-ItemProperty -Path "HKLM:\System\CurrentControlSet\Services\NTDS\Parameters" -Name "LDAPServerIntegrity" -ErrorAction SilentlyContinue
if ($LDAPSigning.LDAPServerIntegrity -ne 2) {
Write-Host "[!] LDAP Signing is not enforced" -ForegroundColor Red
} else {
Write-Host "[+] LDAP Signing is enforced" -ForegroundColor Green
}
# 檢查不需預認證的帳號
$ASREPRoastable = Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true}
if ($ASREPRoastable) {
Write-Host "[!] Found ASREPRoastable accounts:" -ForegroundColor Red
$ASREPRoastable | ForEach-Object { Write-Host " - $($_.SamAccountName)" }
} else {
Write-Host "[+] No ASREPRoastable accounts found" -ForegroundColor Green
}
# 檢查服務帳號 SPN
$SPNAccounts = Get-ADUser -Filter {ServicePrincipalName -like '*'} -Properties ServicePrincipalName
Write-Host "[i] Found $($SPNAccounts.Count) accounts with SPNs (Kerberoastable)" -ForegroundColor Yellow
}
Test-ADSecurity
# Deploy-HoneyAccount.ps1
function New-HoneyAccount {
param(
[string]$Username = "svc_backup",
[string]$Password = "Complex!P@ssw0rd123"
)
# 建立誘餌帳號
New-ADUser -Name $Username `
-UserPrincipalName "$Username@$env:USERDNSDOMAIN" `
-SamAccountName $Username `
-AccountPassword (ConvertTo-SecureString $Password -AsPlainText -Force) `
-Enabled $true `
-Description "Backup Service Account" `
-PasswordNeverExpires $true
# 設定 SPN 使其可被 Kerberoasting
Set-ADUser $Username -ServicePrincipalNames @{Add="MSSQLSvc/honeypot.domain.local:1433"}
# 啟用稽核
$User = Get-ADUser $Username
$ACL = Get-Acl "AD:$($User.DistinguishedName)"
$Everyone = [System.Security.Principal.SecurityIdentifier]"S-1-1-0"
$AuditRule = New-Object System.DirectoryServices.ActiveDirectoryAuditRule(
$Everyone,
"ReadProperty",
"Success",
[Guid]::Empty,
"All"
)
$ACL.AddAuditRule($AuditRule)
Set-Acl "AD:$($User.DistinguishedName)" $ACL
Write-Host "[+] Honey account $Username created successfully" -ForegroundColor Green
Write-Host "[!] Monitor Event ID 4662 for access attempts" -ForegroundColor Yellow
}
ADCS (AD Certificate Services) 攻擊
Advanced Persistence
Evasion Techniques
場景設定:
你是新加入的安全顧問,客戶剛遭受勒索軟體攻擊。調查發現攻擊者透過以下路徑入侵:
問題:
參考答案架構:
防禦層級:
1. 郵件安全閘道 + 安全意識培訓
2. 停用 LLMNR/NBT-NS + 網路分段
3. gMSA + 25字元密碼政策
4. SMB 簽章 + LDAP 簽章
5. 權限最小化 + 監控 Event 4662
6. krbtgt 定期輪換 + 監控異常票證
經過這七天的旅程,我們從零開始建立了 AD 攻防的完整知識體系,可以持續學習:
接下來我們會持續針對進階技術進行講解。
偵察:nmap, crackmapexec, ldapsearch, rpcclient
枚舉:bloodhound, powerview, adexplorer
憑證:responder, rubeus, mimikatz, secretsdump
橫向:psexec, wmiexec, evil-winrm, proxychains
持久:covenant, empire, metasploit
Responder: /usr/share/responder/Responder.conf
Proxychains: /etc/proxychains4.conf
BloodHound: ~/.config/bloodhound/config.json
Impacket: ~/.local/bin/
# 立即鎖定可疑帳號
Disable-ADAccount -Identity "suspicious_user"
# 強制所有使用者變更密碼
Get-ADUser -Filter * | Set-ADUser -ChangePasswordAtLogon $true
# 重設 krbtgt 密碼(執行兩次)
$krbtgt = Get-ADUser krbtgt
Set-ADAccountPassword -Identity $krbtgt -Reset
# 清除所有快取憑證
klist purge -li 0x3e7