--- title: 'CYBERSEC 2024 臺灣資安大會 「AD 已經防不完了,怎麼還有個 Azure AD?」(Steven Meow)' disqus: hackmd --- CYBERSEC 2024 臺灣資安大會 「AD 已經防不完了,怎麼還有個 Azure AD?」(Steven Meow) === # Table of Contents [TOC] # Conference Info **Conference Title**: CYBERSEC 2024 臺灣資安大會\ **Date**: 2024.05.16\ **Location**: 臺北南港展覽二館 7F 701G **Presentation Title**: AD 已經防不完了,怎麼還有個 Azure AD?\ **Speaker**: 游照臨 (Steven Meow) | 趨勢科技 Threat Researcher, CoreTech Red Team\ **Description**:\ >在這場議程中,我們將深入探討 Active Directory 和 Azure Active Directory (Entra ID) 的核心差異,揭示 Azure, Entra ID 內所含的資安威脅。我們將以從紅隊角度出發,分析 Entra ID 的潛在風險,並以實例方式展現如何使用特定工具來執行 Enumerate 及 Exploitation, Exfiltration 手法,甚至是 Bypass 2FA 的攻擊方式。此外,我們也會詳述橫向移動的 Hybrid Identity 攻擊手法,包括從本地到雲端,甚至從雲端反打回本地 Active Directory 的技術,例如 Password Hash Sync, Pass-Through Authentication, AD Federation Golden SAML 等。 # Presentation Technical Content >[!Note] > 內容也包含自己不太懂,上網 research 的補充知識   > 當初聽這場演講時,對 AD 一竅不通。但認為 AD 是藍隊幾乎都會用到的服務,先聽藍隊的內容(雖然講者是 Red Team Threat Researcher),對往後打 AD & AAD 應該會有幫助。 ## Introduction to AAD >[!Note] > **Microsoft Entra ID (先前稱為 Azure Active Directory):**\ > 微軟提供的雲端身份驗證和授權服務,用於管理使用者身份、訪問權限和企業資源的解決方案。它是Azure雲端平台的一部分,為企業提供了安全、可擴展和可信賴的身份管理功能。 Azure AD的主要功能包括身份驗證、單一登入(Single Sign-On,SSO)、多因素驗證(Multi-Factor Authentication,MFA)、應用程式管理和訪問控制等。透過Azure AD,企業可以集中管理使用者帳戶、組織架構和訪問策略,並將其應用到各種雲端和本地應用程式。 ([medium/Sean Chou](https://medium.com/chouhsiang/1-azure-ad%E7%B0%A1%E4%BB%8B-%E7%B0%A1%E5%96%AE%E5%85%A5%E9%96%80azure-ad-e769108ca18a))   / | Azure AD (Entra ID) | Azure | :------:|:---------------------:|:---------------------:| 定位 | 身分識別與存取管理解決方案 | 雲端平台 | 主要功能 | 使用者驗證、應用程式存取管理、多重驗證 (MFA)、SSO | 虛擬機、儲存裝置、資料庫、AI 等服務 使用範圍 | 身分識別和安全性管理 | 建置、部署及管理雲端應用程式和基礎設施 主要元素 | 使用者、群組、應用程式註冊、條件式存取 | 虛擬機、Azure SQL、Blob Storage 等等 重點功能 | 提供單一登入、多重驗證、條件式存取、密碼重設 | 全球資料中心、彈性擴展能力  ### Azure Role-Based Access Control (RBAC) [Azure RBAC](https://learn.microsoft.com/en-us/azure/role-based-access-control/overview) 是一種用於管理 Azure 資源存取權的授權系統,基於 「最小權限原則」,只允許使用者取得工作所需最低權限,從而提升安全性並簡化存取管理。  1. 指派 User 角色  2. 定義角色權限  3. 角色分配 將角色附加到特定範圍內的 user, group, service principal, or managed identity  ### Azure Attribute-Based Access Control (ABAC) [Azure ABAC](https://learn.microsoft.com/zh-tw/azure/role-based-access-control/conditions-overview) 一種授權系統,可根據與安全性主體、資源和存取要求環境相關聯的屬性定義存取權。 使用 ABAC 可以根據屬性授與對資源的安全性主體存取權。  功能 | RBAC | ABAC | :------:|:---------------------:|:---------------------:| 授權 | 角色 (Role) | 角色 + 屬性 (Attributes) | 管理控制 | 基本角色控制 | 支援條件式控制,提供權限管理更細緻 情境 | 管理整體角色存取 | 基於資源屬性或使用者屬性實現動態授權 ABAC 相較 RBAC 多了一層「條件式控制」,可以根據資源的屬性或請求的條件來設定更細緻的存取規則。 ### **Azure / AAD 常用工具** #### Azure AD PowerShell (最主要 Azure AD 工具) - 開啟 PowerShell 安裝 Azure AD 模組 ```PowerShell Install-Module AzureAD.Standard.Preview ``` #### Azure Powershell (可存取 Azure 資源) - 開啟 PowerShell 安裝 Azure PowerShell 模組 ```PowerShell Install-Module -Name Az -AllowClobber -Scope CurrentUser ``` #### [Az Cli](https://learn.microsoft.com/zh-tw/cli/azure/install-azure-cli) (跨平台,可支援Bash) #### [Hacker Tool] [AAD Internals](https://aadinternals.com/aadinternals/) - 列出 Azure AD user、驗證 user 密碼、PasswordSpray - 開啟 PowerShell 安裝 AAD Internals ```PowerShell Install-Module -Name AADInternals -Force ``` #### [Hacker Tool] [MicroBrust](https://github.com/NetSPI/MicroBurst) - 列出 Azure Resource Groups - 檢查 Azure Storage Keys - 列出角色指派與權限 - 掃描未使用的 Subdomain ## Enumeration ### Tenant 通常對應於一個公司或組織的 Azure 雲端環境。 Unique Identifier (Tenant ID)  - Tenant Enumeration 公開可訪問 Azure AD 端點或功能  - Tenant ID - 租戶名稱(domain) - 公開的 user 或 group - Application 端點 ### Brute-Force / Password Spraying - [MSOL Spary](https://github.com/dafthack/MSOLSpray) 用於 Microsoft Online Services (MSOL) 帳號密碼 - 針對 Azure AD / Microsoft 365 帳號 Password Spraying - 支援 PowerShell Module - Evasion - 更換 IP / VPN / Proxy ### Authenticated Enumeration 當取得帳號與密碼後,利用該帳號連接到 Azure AD 或 Azure 環境 - Connect-AzureAD (AAD Module) - Get-AzureADUser –SearchString "admin" 搜尋與 “admin” 相關的使用者帳號 - Get-AzureADGroup 列出所有Group - Get-AzureADGroupMember 取得特定Group, 例: ```powershell Connect-AzureAD $groups=Get-AzureADGroup -All $true ForEach ($group in $groups){ $members = Get-AzureADGroupMember -ObjectId $group.ObjectId -All $true Write-output $members } ``` > 1. `Connect-AzureAD`: 連接到 Azure AD Tenant > 2. `Get-AzureADGroup -All $true`: 如上解釋,取得所有 Azure AD group > 3. `ForEach`: 遞迴取得成員 > 4. `$members = Get-AzureADGroupMember -ObjectId $group.ObjectId -All`: 取得指定群組 > > `-ObjectId $group.ObjectId`:目標Group的唯一識別碼\ > > `-All $true`:強制列出該群組所有成員。 > > 5. `Write-Output $members`: 輸出 - Connect-AzAccount (Azure Module) - Connect-AzAccount 登入取得權限 - Get-AzResource 列出所有 Azure 資源 - Get-AzADGroup 列出 Azure AD 群組資訊 - az login (Az cli) 基於 CLI 的 Azure 管理方式 - az login 登入取得權限 - az user list 列出所有 Azure AD user account - az ad group list 列出 Azure AD Tenant 中的所有群組資訊 ### Enumerate Tools #### [Road Tool](https://github.com/dirkjanm/ROADtools) 主要用於探測、枚舉 和 分析 Azure AD tenant的資訊 - ROADrecon: Enumeration AD tenant - ROADlib: library can be used to authenticate with Azure AD > 分析 Azure AD Graph API #### [Storm Spotter](https://reconshell.com/stormspotter-azure-red-team-tool-for-graphing-azure-and-azure-active-directory-objects/)  > 視覺化 Azure 資源、網路結構、使用者、RBAC 權限 #### [Azure Hound](https://bloodhound.readthedocs.io/en/latest/data-collection/azurehound.html#)  ## Exploitation ### Consent and Permission - User permissions request  - Register APP & API permission  - [O365 Stealer](https://github.com/AlteredSecurity/365-Stealer) 偽裝的應用程式要求使用者授權,使用釣魚或惡意 applicatiion - CLI (python3) - Web UI  ### Managed Identity(APP Service Account) - Azure 中的 Managed Identity 大約等於 Service Account - RCE APP 可以從 env 中取得相關資訊 - IDENTITY_ENDPOINT=http://localhost:8081/msi/token - IDENTITY_HEADER=5C5AF712699F422792244A14D4DC8CB9 - 只要針對 Endpoint 使用 curl 帶 Header 就可以取得 access token - `curl "$IDENTITY_ENDPOINT?resource=https://graph.microsoft.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER` - `curl "$IDENTITY_ENDPOINT?resource=https://management.azure.com/&api-version=2017-09-01" -H secret:$IDENTITY_HEADER` - 拿到 Access Token 不需要 2FA 驗證的功能 - Azure PowerShell - Azure AD PowerShell - Az Cli - MS Graph API - ARM ## Lateral Movement 透過已取得的憑證、腳本或漏洞,橫向到其他系統以達成最終目標 ### Azure Automation Account - 觀察 Run Book Run Book 中的 log、script、credential 等資訊,找到暴露的資訊 Goal:提取憑證、API keys 或管理者權限 Credential Harvesting - Payload 塞入 Hybrid Runbook Hybrid Runbook Worker 是在受控的本機上執行 reverse shell 或 腳本的代理程式。 Goal:取得本機 RCE 權限 ### VM Instance run command `AZVMRunCommand` & `Set-AzVMExtenstion`  ### Microsoft Intune (Endpoint Manager) Deploy Script Microsoft Intune 是雲端端點管理解決方案,屬於 Microsoft Endpoint Manager 組合中的一部分,主要用來管理企業的裝置、應用程式和安全性設定。  ## Exfiltration & Persistent 竊取資料 (Exfiltration) 並在系統中長期存取權限 (Persistence) - KeyVault  > `Get-AzKeyVaultSecret -VaultName AAAAA`: 獲取 KeyVault AAAAA 中的所有 Secrets 資料\ > `Enabled`: 是否啟用此 Secret\ > 接著往下查 `Get-AzKeyVaultSecret -VaultName AAAAA -Name BBBBBB -AsPlainText`: 指定 Secret (BBBBBB) 的內容,並以純文字顯示 - Blob Blob Storage 是 Azure 提供的雲端儲存服務,儲存大量非結構化資料  - APP Notes 這裡指的是各種 Applications Properties 中的 Notes  - Persistent - Add Enterprise Application Secret ```script import-module .'Add-AzADAppSecret.ps1 Add-AzADAppSecret -GraphToken $GraphToken -Verbos $passwd = ConvertTo-SecureString "SECRET" -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential ("SERVICE-OBJECT-ID",Spassw) Connect-AzAccount -ServicePrincipal -Credential Screds -TenantID "TENANT-ID" ``` > 1. `import-module .'Add-AzADAppSecret.ps1'`: 自定義的 Module,用來新增 Azure AD Secret 用 > 2. `Add-AzADAppSecret -GraphToken $GraphToken -Verbose`: 使用 Graph API Token 新增 Secret > 3. `$passwd = ConvertTo-SecureString "SECRET" -AsPlainText -Force`: 明文密碼強制轉成 SecureString (PowerShell 預設不接受明文) > 4. `$creds = New-Object System.Management.Automation.PSCredential ("SERVICE-OBJECT-ID", $passwd)`: 建立一個新的物件 > > `System.Management.Automation.PSCredentia`: 儲存 SERVICE-OBJECT-ID 與 SecureString密碼 ## Cloud ←→ On Premise ### On-Premise to Cloud - Pass the Cookie: Mimikatz >[!Note] >[Mimikatz](https://github.com/ParrotSec/mimikatz): Windows 安全工具\ 由 Benjamin Delpy 開發的開源安全工具,用於測試和展示 Windows 作業系統的安全漏洞,尤其是與身份驗證、憑證存儲和密碼管理相關的弱點。 Pass the Cookie :針對 Web 應用認證機制的攻擊方式,透過竊取來的連線cookie去驗證,繞過傳統登錄機制。 (案例:[iThome](https://www.ithome.com.tw/news/142230)) ```Mimikatz mimikatz # privilege::debug Privilege '20' OK ``` > `privilege::debug`: 提權命令 ```Mimikatz mimikatz # dpapi::chrome /in:2localapodata&)google)chrome(USERDA-1defaulticookies /unprotect Encrypted Key found in local state file > Encrypted Key seems to be protected by DPAPI * using CryptUnprotectData API >AES Key is: 6ecbf26057751a9f9ea127676183531d3ee3abb0a1b766829797a7fbb1cbbd98f94d ``` > `dpapi::chrome`: 用來解密 Google Chrome 中的 Cookies 檔案\ >> `/in`: 指定瀏覽器的 Cookie 檔案路徑\ >> `/unprotect`: 調用 Windows DPAPI (CryptUnprotectData) 解密 AES 密鑰\ >> Windows Data Protection API (DPAPI) 是 Microsoft 提供的一種加密機制 > > AES Key 成功解密 DPAPI 後可以取得 Cookies 資料。 Cookie 結構: ```Mimikatz Host : .bing.com ( / ) Name : MUID Dates:1/2/2/2024 7:24:49 AM -> 1/26/2025 7:24:49 AM using BCrypt with AES-256-GCM Cookie: 20390F3E887E62642BD71CC48C7E64E6 Host :login.microsoftonline.com ( ) Name : ESTSAUTHLIGHT Dates : 1/4/2024 4:37:20 AM using BCrypt with AES-256-GCM Cookie: +6cb6c7c6-067e-4f2f-8657-0175ff5e1304+3ebafa15-52a1-4c9a-bceb-ec821e486204 Host : login.microsoftonline.com ( ) Name : ESTSSSOTILES Dates:12/21/2023 7:14:38 PM -> 1/1/2034 7:00:38 PM using BCrypt with AES-256-GCM Cookie: 1 Host : login.microsoftonline.com ( ) Name : MSFPC Dates : 12/24/2023 10:56:10 PM -> 12/23/2024 10:56:10 PM using BCrypt with AES-256-GCM Cookie: GUID-12e2efe96c4c4800983d3d91c313be24c&HASH=12e2&LV-262312&V=4&LU-1782824884828323 ``` > Host:Cookie 所屬的 domain name Name:Cookie 名稱 (如 MUID)\ Dates:有效期限\ 加密演算法:BCrypt with AES-256-GCM\ Cookie 值: 可用於認證 ### On-Premise to Cloud - Pass the PRT: Mimikatz >[!Note] >PRT (Primary Refresh Token\ >A Primary Refresh Token (PRT) is a key artifact of Microsoft Entra authentication on Windows 10 or newer. It's a JSON Web Token (JWT) specially issued to Microsoft first party token brokers to enable single sign-on (SSO) across the applications used on those devices. \ >Azure Active Directory (AAD) 認證的特殊 Token,負責幫助應用程式在使用者登入後自動更新 Access Token,從而實現單一登入 (SSO)\ >(Ref: [Microsoft Entra Document](https://learn.microsoft.com/en-us/entra/identity/devices/concept-primary-refresh-token)) - Mimikatz - 從 LSASS 提取 PRT 和 Encrypted Session Key `sekurlsa::cloudap` - 利用 DPAPI Master Key 解密 Session Key(ProofOfPossessionKey) `dpapi::cloudapkd /keyvalue:[ProofOfPosessionKey] /unprotect` - 生成新的 PRT cookie (利用 PRT, Derived key and Context) `dpapi::cloudapkd /context:[Context] /derivedkey:[DerivedKey] /Prt:[PRT]` - 注入新的 PRT 到瀏覽器的 cookie 欄位 `Name:x-ms-RefreshTokenCredential` ### Hybrid Identity - 大多數的Organization 同時雲端跟地端都有Resource - 所以會希望把 Cloud 的 AAD 跟 On-Prem 的 AD 進行整合 - 常見手法有以下三種 - Password Hash Sync (PHS - 預設每 2 分鐘 Sync 一次到雲端 - 本地 AD 會自動建立 MSOL_xxxx 帳號 - 帳號具有 DCSync 權限 + Generic Write 所有 User + Password Never Expired) - AAD 會建立一個 Sync_xxxx_xxxx 帳號 - 帳號可以修改 AAD 上所有由地端 Sync 上去的密碼 - 所有明文密碼都存在 Connect Server localdb (MSSQL) - Pass-Through Authentication (PTA) - 在地端 AD 安裝一台 Connector、 Agent - (所有驗證都會把明文帳密從雲端送到地端驗證) -   - Federation (ADFS) - Federation Trust - 本地建立 AD FS Server,與雲端(AAD/O365..) 建立互相 trust - 使用 Security Assertion Markup Language (SAML) 溝通 - User / Client - Identity Provider (IdP): Ex. ADFS Server - Service Provider (SP): Ex. AAD  # Summary 
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.