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 攻防實戰演練 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言