iT邦幫忙

2025 iThome 鐵人賽

DAY 7
0
Security

資安這條路:AD 攻防實戰演練系列 第 7

AD 攻防實戰演練 Day 7:前六天知識整合與進階防禦策略

  • 分享至 

  • xImage
  •  

經過六天的實戰演練,我們已經從環境建置走到了橫向移動,今天要做一個完整的回顧與整合,並補充一些重要但還未深入探討的觀念。更重要的是,我們要從「攻擊者思維」轉換到「防禦者視角」,建構一個全面的 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 委派權限 極高

第二部分:基礎知識深化

1. Kerberos 協定完整解析

前面我們提到了 Kerberos 的基本流程,但沒有深入探討其安全機制:

Kerberos 時間同步的重要性

# 檢查時間偏差
w32tm /query /status

# 強制同步時間
w32tm /resync /rediscover

為什麼重要?

  • Kerberos 票證有 5 分鐘的時間容錯
  • 時間偏差超過 5 分鐘會導致認證失敗
  • 攻擊者可利用時間偏差進行重放攻擊

Kerberos 加密類型優先順序

AES256-CTS-HMAC-SHA1-96 (etype 18) ← 最安全
   ↓
AES128-CTS-HMAC-SHA1-96 (etype 17)
   ↓
RC4-HMAC (etype 23) ← 最弱但最常見
   ↓
DES-CBC-CRC (etype 3) ← 已棄用

2. NTLM vs Kerberos 深度對比

特性 NTLM Kerberos
認證流程 Challenge-Response 票證式
相互認證 ❌ 單向 ✅ 雙向
委派支援
時間敏感 ✅ (5分鐘)
網路效率 低(每次認證) 高(票證重用)
加密強度 RC4/MD5 AES/SHA
中繼攻擊 易受攻擊 較安全

3. AD 物件的安全描述符(Security Descriptor)

每個 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)
    └── 稽核設定

關鍵權限解析:

  • GenericAll (0x10000000):完全控制
  • WriteDacl (0x00040000):修改 ACL
  • WriteOwner (0x00080000):變更擁有者
  • ExtendedRight:特殊權限(如 DCSync)

第三部分:協定安全深化

1. SMB 協定版本與安全性

SMBv1 (已棄用,極度危險)
├── 無加密
├── 易受中間人攻擊
└── WannaCry/NotPetya 利用此版本

SMBv2 (Windows Vista/2008)
├── 支援簽章
├── 改善效能
└── 減少往返次數

SMBv3 (Windows 8/2012)
├── 端對端加密
├── 安全方言協商
└── 透明故障轉移

停用 SMBv1 的方法:

# 檢查 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

2. LDAP 通道繫結與簽章

LDAP 有三種安全等級:

1. LDAP (Port 389) - 明文傳輸
2. LDAPS (Port 636) - SSL/TLS 加密
3. StartTLS - 在 389 埠升級至加密

強制 LDAP 簽章和通道繫結:

# 設定 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

3. DNS 安全性增強

DNSSEC (DNS Security Extensions)

# 啟用 DNSSEC
Add-DnsServerSigningKey -ZoneName "domain.local" -CryptoAlgorithm RsaSha256

# 簽署區域
Start-DnsServerZoneSign -ZoneName "domain.local"

DNS 快取投毒防護

# 啟用 DNS Socket Pool
dnscmd /config /socketpoolsize 5000

# 啟用快取鎖定
Set-DnsServerCache -LockingPercent 100

第四部分:補充知識點

1. 群組受管理服務帳號(gMSA)

傳統服務帳號的問題:

  • 密碼不輪換
  • 手動管理
  • 容易被 Kerberoasting

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$

2. AdminSDHolder 與權限持久化

AdminSDHolder 是保護特權群組的機制:

# 受保護的群組(預設)
- Domain Admins
- Enterprise Admins
- Schema Admins
- Administrators
- Account Operators
- Server Operators
- Print Operators
- Backup Operators
- Replicator

SDProp 執行每 60 分鐘執行:

  1. 檢查受保護群組成員
  2. 將 AdminSDHolder 的 ACL 複製到成員
  3. 啟用繼承保護

3. 信任關係的安全風險

信任類型與風險等級:

信任類型 方向 傳遞性 風險等級 攻擊向量
Parent-Child 雙向 傳遞 SID History
Forest 雙向 傳遞 跨林委派
External 單/雙向 非傳遞 弱信任密碼
Shortcut 單/雙向 傳遞 效能最佳化

SID Filtering 設定:

# 檢查 SID Filtering 狀態
netdom trust domain1.local /domain:domain2.local /quarantine

# 啟用 SID Filtering
netdom trust domain1.local /domain:domain2.local /quarantine:yes

第五部分:進階防禦策略

1. 分層管理模型(Tiering Model)

Tier 0 (控制層)
├── Domain Controllers
├── AD 管理系統
└── PKI/ADCS

Tier 1 (伺服器層)
├── 應用程式伺服器
├── 資料庫伺服器
└── Web 伺服器

Tier 2 (工作站層)
├── 使用者工作站
├── VDI
└── 終端設備

實施原則:

  • 永不向下:高層帳號不登入低層系統
  • 專用管理站:PAW (Privileged Access Workstation)
  • Just Enough Admin (JEA):最小權限原則

2. 監控與威脅獵捕

關鍵事件 ID 監控矩陣:

Event ID 描述 嚴重性 回應措施
4624 登入成功 記錄分析
4625 登入失敗 閾值告警
4648 明確憑證登入 即時告警
4672 特權登入 審查驗證
4768 Kerberos TGT 請求 異常分析
4769 Kerberos TGS 請求 Kerberoasting 偵測
4776 NTLM 認證 降級偵測

PowerShell 監控腳本:

# 監控可疑的 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}

3. 紫隊演練架構

結合紅隊攻擊與藍隊防禦:

紫隊演練循環:
1. 威脅建模 → 識別關鍵資產
2. 攻擊模擬 → 執行 TTP
3. 偵測驗證 → 確認告警
4. 回應改善 → 優化流程
5. 知識轉移 → 團隊培訓

第六部分:實用防禦腳本集

1. AD 安全基準檢查腳本

# 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

2. 蜜罐帳號部署腳本

# 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
}

第七部分:未來學習路線圖

進階攻擊技術

  1. ADCS (AD Certificate Services) 攻擊

    • ESC1-ESC8 憑證範本濫用
    • PetitPotam + ADCS relay
    • Golden Certificate
  2. Advanced Persistence

    • DCShadow
    • Skeleton Key
    • DSRM 密碼濫用
  3. Evasion Techniques

    • AMSI 繞過
    • AppLocker 繞過
    • Constrained Language Mode 突破

防禦技術深化:

  1. Microsoft Defender for Identity
    • 行為分析
    • 橫向移動偵測
    • 異常登入偵測
  2. Azure AD 整合安全
    • Conditional Access
    • PIM (Privileged Identity Management)
    • Identity Protection
  3. 零信任架構
    • 微分段
    • 持續驗證
    • 最小權限存取

實戰練習題

情境題:綜合攻防演練

場景設定:
你是新加入的安全顧問,客戶剛遭受勒索軟體攻擊。調查發現攻擊者透過以下路徑入侵:

  1. 釣魚郵件 → 初始立足點
  2. LLMNR 投毒 → 取得憑證
  3. Kerberoasting → 服務帳號密碼
  4. NTLM Relay → 橫向移動
  5. DCSync → 取得 krbtgt
  6. Golden Ticket → 持久化

問題:

  1. 設計一個防禦策略,阻斷每個攻擊階段
  2. 提出監控指標和告警規則
  3. 制定事件回應計畫

參考答案架構:

防禦層級:
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

上一篇
AD 攻防實戰演練 Day 6:LLMNR 投毒與 NTLM Relay 實戰
下一篇
AD 攻防實戰演練 Day 8:MSSQL 滲透測試 - 從資料庫到系統權限
系列文
資安這條路:AD 攻防實戰演練9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言