# AD 滲透亂記
[TOC]
# 1. Active Directory (AD) 攻擊
## **核心概念理解 (Core Concepts):**
* **深入 Kerberos 驗證:** 完全理解 TGT/TGS 交換流程、PAC (Privilege Attribute Certificate)、委派類型(非限制性、限制性、基於資源的限制性委派)及其攻擊向量(如 Kerberoasting、AS-REP Roasting、委派濫用)。
* **NTLM 驗證與弱點:** 理解 NTLM Challenge/Response 機制、NTLM Relay 攻擊原理與各種變種(HTTP, SMB, LDAP 等),以及防禦繞過方法。
* **AD 物件與權限模型:** 精通使用者、群組、電腦物件、組織單位 (OU)、群組原則 (GPO)、存取控制清單 (ACL) 的結構與關聯,特別是危險的 ACL 配置。
* **AD 信任關係:** 理解樹系 (Forest)、網域 (Domain)、樹狀目錄 (Tree) 之間的信任類型(父子、樹根、捷徑、外部、樹系信任)及其攻擊意涵(跨網域、跨樹系的橫向移動與權限提升)。
* **Active Directory Certificate Services (AD CS):** 理解 AD CS 的架構、憑證範本、註冊流程,以及常見的濫用技術(ESC1-ESC8 等,如 PetitPotam + AD CS Relay 獲取機器憑證、濫用危險憑證範本進行權限提升)。
## **攻擊技術:**
* **權限提升路徑發掘:** 使用 BloodHound/SharpHound 等工具進行複雜環境下的權限提升路徑分析與視覺化,找出非典型的攻擊鏈。
* **憑證竊取與濫用:** 掌握 Mimikatz、lsassy 等工具的不同憑證竊取方法(LSASS 記憶體、DCSync),以及 Golden Ticket、Silver Ticket、Diamond Ticket、Sapphire Ticket (Azure AD) 的製作與使用時機。
* **持續性潛伏 (Persistence):** 掌握多種 AD 環境下的持續性技術,如 DCSync 權限濫用、修改 SDDL (Security Descriptor Definition Language)、AdminSDHolder 保護繞過、GPO 濫用、SID History 注入、Skeleton Key 等。
* **防禦繞過 (Defense Evasion):** 理解並繞過常見的 AD 安全措施,如 Microsoft Defender for Identity (MDI / Azure ATP)、LAPS (Local Administrator Password Solution)、受保護的使用者群組 (Protected Users group)、條件式存取 (Conditional Access)、特權存取管理 (PAM/PIM) 等。
* **跨樹系攻擊 (Cross-Forest Attacks):** 掌握利用樹系信任關係進行橫向移動和權限提升的技術。
* **混合環境攻擊 (Hybrid Environment Attacks):** 理解 Azure AD Connect 同步機制,利用同步帳戶、密碼雜湊同步 (PHS)、傳遞驗證 (PTA)、AD FS 等進行本地 AD 與 Azure AD 之間的攻擊。
## **工具:**
* **核心工具:** Impacket 工具集 (psexec, smbclient, wmiexec, secretsdump, ntlmrelayx 等)、Mimikatz、Rubeus、Kekeo、PowerView/SharpView、BloodHound/SharpHound、Certipy。)
* **輔助工具與腳本:** 各種針對特定漏洞或技術的 PoC 腳本、自訂工具開發能力。
* **目標 (Goal):** 達到能夠在複雜、多網域、多樹系的 AD 環境中,穩定地獲取網域管理員 (Domain Admin) 或企業管理員 (Enterprise Admin) 權限,建立持久控制,並能有效繞過現代安全監控與防護措施。
# 2. 運用 C# 進行攻擊性操作
## **C# 與 .NET 基礎 (C# & .NET Fundamentals):**
* **核心語法:** 掌握 C# 語法、資料類型、控制結構、物件導向程式設計 (OOP)。
* **.NET Framework/Core/5+:** 理解 .NET 執行環境 (CLR)、組件 (Assembly)、命名空間 (Namespace)、垃圾回收 (Garbage Collection) 機制及其對攻擊性工具的影響。
## **Windows API 互操作 (Windows API Interoperability):**
* **P/Invoke (Platform Invoke):** 精通使用 `DllImport` 屬性呼叫非託管 Windows API 函數,理解資料類型封送 (Marshalling)。這是用 C# 執行底層操作的關鍵。
* **COM Interop:** 理解並能夠使用 COM (Component Object Model) 物件,例如與 WMI (Windows Management Instrumentation) 或其他系統元件互動。
* **攻擊性工具開發技術 (Offensive Tool Development Techniques):**
* **記憶體操作:**
* **Shellcode 執行:** 實現各種 Shellcode 載入和執行技術(例如 `VirtualAlloc`, `WriteProcessMemory`, `CreateThread`, `QueueUserAPC` 等 API 的 C# 封裝)。
* **反射式 DLL 注入:** 理解原理並能用 C# 實現或載入反射式 DLL。
* **程序注入:** 開發能夠將程式碼注入其他行程的工具。
* **憑證存取:** 使用 P/Invoke 呼叫相關 API(如 `OpenProcess`, `ReadProcessMemory`)來嘗試讀取 LSASS 記憶體,或與 LSA (Local Security Authority) 服務互動。
* **網路通訊:** 開發自訂的 C2 (Command & Control) 通道,使用 TCP/UDP Sockets、HTTP/HTTPS、DNS 等協議進行隱蔽通訊。
* **檔案系統與登錄表操作:** 使用 .NET 內建類別或 P/Invoke 進行隱蔽的檔案讀寫、登錄表修改。
* **橫向移動:** 開發利用 WMI, WinRM, SMB, RPC 等協議進行橫向移動的工具。
* **隱匿與繞過技術 (Stealth & Evasion Techniques):**
* **記憶體執行:** 開發完全在記憶體中執行、不落地 (Fileless) 的工具或載入器。
* **混淆與加密:** 使用 C# 進行程式碼混淆、字串加密、Payload 加密,以繞過靜態分析。
* **API 解析:** 動態解析 API 位址(例如遍歷 PEB/LDR、API Hashing)以繞過靜態匯入表分析和 API Hooking。
* **AMSI 繞過:** 學習並實現各種繞過反惡意軟體掃描介面 (AMSI) 的技術。
* **Unhooking:** 學習如何檢測和移除 EDR (Endpoint Detection and Response) 在關鍵 API(如 `ntdll.dll` 中的函數)設置的鉤子。
* **自訂組件載入:** 使用 `Assembly.Load()` 等方法從記憶體、網路或加密來源載入 .NET 組件。
* **目標 (Goal):** 能夠獨立或在團隊中,使用 C# 開發穩定、有效且具備一定隱匿能力的攻擊性工具,用於資訊收集、權限提升、橫向移動、資料竊取、C2 通訊等紅隊操作。
# 濫用 Windows API 進行匿蹤
* **Windows 內部機制理解 (Understanding Windows Internals):**
* **行程與執行緒:** 理解行程創建過程 (PE 載入、`CreateProcess` API 家族)、執行緒模型、行程間通訊 (IPC)。
* **記憶體管理:** 理解虛擬記憶體、`VirtualAlloc`, `VirtualProtect`, `ReadProcessMemory`, `WriteProcessMemory` 等核心記憶體管理 API 的運作方式及其濫用潛力。
* **安全性物件:** 理解權杖 (Token)、安全描述符 (Security Descriptor)、ACL、權限 (Privileges) 的概念與操作相關 API(如 `OpenProcessToken`, `AdjustTokenPrivileges`, `GetNamedSecurityInfo`, `SetNamedSecurityInfo`)。
* **系統呼叫 (System Calls):** 理解使用者模式 (User Mode) 與核心模式 (Kernel Mode) 的轉換,`syscall` 指令的作用,以及直接或間接系統呼叫在繞過 EDR Hooking 中的應用。
* **PE (Portable Executable) 格式:** 理解 PE 檔案結構,特別是匯入表 (IAT)、匯出表 (EAT)、基底重定位 (Base Relocation) 等,這對於動態 API 解析和記憶體操作至關重要。
* **關鍵 API 類別與濫用技巧 (Key API Categories & Abuse Techniques):**
* **行程/執行緒操作 API:**
* `CreateProcess` 家族:用於啟動程式,但也可被用於注入(如 Process Hollowing)。
* `OpenProcess`, `OpenThread`: 獲取其他行程/執行緒的控制代碼。
* `VirtualAllocEx`, `WriteProcessMemory`, `CreateRemoteThread`, `QueueUserAPC`: 經典的程序注入組合。
* 尋找和使用較少被監控的 API 組合來達到相同目的。
* **記憶體管理 API:**
* `VirtualAlloc`, `VirtualProtect`: 分配可執行記憶體、修改記憶體保護屬性,用於載入 Shellcode 或修改程式碼。
* 濫用記憶體區段 (Section) 物件進行隱蔽的資料共享或程式碼注入。
* **檔案系統 API:**
* `CreateFile`, `ReadFile`, `WriteFile`, `DeleteFile`: 使用特殊旗標(如 `FILE_FLAG_DELETE_ON_CLOSE`)或替代資料流 (ADS) 進行隱蔽操作。
* 利用符號連結 (Symbolic Link) 或掛載點 (Junction Point) 進行檔案系統混淆。
* **登錄表 API:**
* `RegOpenKeyEx`, `RegQueryValueEx`, `RegSetValueEx`, `RegDeleteValueEx`: 在不常用的位置或使用特殊技術(如 NULL 字元)儲存資料或設定持續性。
* **網路 API:**
* WinINet (`InternetOpen`, `InternetConnect`, `HttpSendRequest` 等): 用於 HTTP/HTTPS 通訊,常用但也易被監控。
* WinHTTP: 另一個 HTTP/HTTPS 函式庫,有時監控較少。
* Winsock (`socket`, `connect`, `send`, `recv`): 底層 TCP/IP 通訊,提供更大靈活性。
* 利用 COM 物件(如 `BITSAdmin`)進行網路傳輸。
* **安全與驗證 API:**
* `LogonUser`, `LsaLogonUser`: 用於驗證使用者,可能被用於權杖模擬。
* 與 LSASS 互動的未公開 API 或 RPC 介面:用於竊取憑證。
* 權杖操作 API (`DuplicateTokenEx`, `ImpersonateLoggedOnUser`, `SetThreadToken`): 用於權限提升或模擬。
* **系統資訊與雜項 API:**
* WMI API (透過 COM): 功能強大,可用於資訊收集、執行、持久性,但日誌記錄也較多。
* ETW (Event Tracing for Windows) 控制 API: 可能被用於禁用或干擾事件追蹤。
* `Nt*`/`Zw*` 函數 (Native API): 直接呼叫 NTDLL 中的底層函數,可能繞過 User-Mode Hooking,但需要處理系統呼叫。
* **隱匿核心技術 (Core Stealth Techniques):**
* **直接/間接系統呼叫 (Direct/Indirect System Calls):** 繞過 `ntdll.dll` 中的 EDR 鉤子,直接請求核心執行操作。
* **API Hashing / 動態解析:** 不在匯入表留下痕跡,在執行時才查找所需 API 的位址。
* **Unhooking / Hook 檢測:** 找到並移除 EDR 在關鍵函數開頭放置的 JMP 指令,恢復原始函數功能。
* **自訂載入器 (Custom Loaders):** 避免使用標準的 `LoadLibrary`,自行實現 PE 載入邏輯。
* **利用未記載或冷門 API (Using Undocumented or Less Common APIs):** 尋找功能相似但監控較少的 API。
* **混淆控制流 (Control Flow Obfuscation):** 使靜態和動態分析更難追蹤程式執行路徑。
* **目標 (Goal):** 深刻理解 Windows API 的運作方式,能夠創造性地組合、濫用這些 API 來執行各種攻擊性操作(如執行、注入、通訊、持久化),同時最大限度地減少被 EDR、防毒軟體和其他端點安全解決方案檢測到的機會。
# 跨樹系攻擊 (Cross-Forest Attacks):
## **目標與前提**
作為紅隊,我們的目標通常是在一個已經獲得立足點的 Active Directory 樹系(稱為「來源樹系」或 Forest A)中,利用其與另一個目標樹系(稱為「目標樹系」或 Forest B)之間建立的「樹系信任」(Forest Trust) 關係,最終實現對目標樹系的滲透、權限提升,直至獲取域管理員 (Domain Admin - DA) 或企業管理員 (Enterprise Admin - EA) 權限,完成資料竊取、長期潛伏或其他指定任務。
前提是你必須在「來源樹系」(Forest A) 中獲得了一定的訪問權限(至少是一個普通使用者帳戶,有時需要更高的權限才能有效利用信任關係)。
## **核心利用點:樹系信任關係**
樹系信任是兩個獨立 AD 樹系間的橋樑。對紅隊而言,這座橋樑意味著:
1. **身分驗證穿透:** Forest A 的使用者原則上可以被 Forest B 的資源所驗證和授權(反之亦然,取決於信任方向)。
2. **資源存取可能:** Forest A 的使用者/群組可能被授予了訪問 Forest B 中資源(檔案伺服器、應用程式、管理權限等)的權限。
3. **攻擊路徑延伸:** 提供了一條從一個已被部分攻陷的環境橫向移動到一個全新、可能更高價值環境的路徑。
## **攻擊階段與技術細節**
1. **偵察與資訊收集 (Reconnaissance):**
* **發現信任關係:**
* **PowerShell:** 使用 `Get-ADForest`、`Get-ADTrust` Cmdlet 查詢本機樹系及其信任關係。
* **nltest:** 執行 `nltest /domain_trusts` 查看與本機網域關聯的信任。
* **BloodHound/SharpHound:** 這是最重要的工具之一。它可以視覺化地展示樹系信任關係、信任方向、信任類型(雙向/單向、可傳遞/選擇性驗證),以及跨樹系的存取控制路徑。
* **AD Explorer (Sysinternals):** 手動瀏覽 AD 結構,尋找信任物件。
* **描繪信任細節:**
* **信任方向:** 是單向(只能從 A 訪問 B,或反之)還是雙向?這決定了你的攻擊方向。
* **信任類型:**
* **可傳遞 (Transitive):** 如果 Forest A 信任 Forest B,Forest B 信任 Forest C,那麼 Forest A 也隱含信任 Forest C。這擴大了攻擊面。
* **選擇性驗證 (Selective Authentication):** *這是防禦方的重要措施,也是紅隊的障礙*。在此模式下,即使存在信任,Forest A 的使用者預設也無法訪問 Forest B 的資源。他們必須被 Forest B 中的資源明確授予 "Allowed to Authenticate" 權限。你需要重點尋找哪些 Forest A 的使用者/群組被授予了這個權限。
* **SID 篩選 (SID Filtering):** 是否啟用?嚴格的 SID 篩選會阻止利用 `SIDHistory` 屬性進行攻擊。
* **識別跨樹系權限:**
* 使用 BloodHound 分析哪些 Forest A 的使用者/群組在 Forest B 的資源(伺服器本地管理員組、網域群組、ACL 等)中擁有權限。
* 檢查 Forest B 中是否有帳戶的 `SIDHistory` 屬性包含來自 Forest A 的 SID(通常發生在遷移後)。
2. **初始訪問 (Gaining Initial Access to Forest B):**
* **利用既有權限:**
* 如果偵察發現 Forest A 的某個使用者(你已控制)被直接加入到 Forest B 中某台伺服器的本地管理員組,或對某個 SMB 共享有寫入權限,直接使用該帳戶(格式通常為 `ForestA\Username` 或 `Username@foresta.local`)透過 RDP, WinRM, SMB 等方式登入或訪問該資源。這是最直接的方式。
* **濫用 Kerberos 跨領域票證:**
* 如果你在 Forest A 中獲得了較高權限(例如 DA),或者能控制某些關鍵帳戶,你可以嘗試代表 Forest A 的使用者請求訪問 Forest B 中資源的服務票證 (TGS)。
* **Rubeus:** 使用 Rubeus 的 `asktgs` 功能,指定目標 Forest B 中的 SPN (Service Principal Name),看是否能成功獲取票證。例如,`Rubeus.exe asktgs /service:cifs/fileserver.forestb.local /domain:forestb.local`。
* **濫用 SID History:**
* 如果在 Forest A 中控制了一個帳戶,其 `SIDHistory` 包含了來自 Forest B 的高權限群組 SID(例如 Forest B 的 Domain Admins SID),並且 SID 篩選沒有完全阻止它,那麼這個帳戶在訪問 Forest B 資源時,可能會被視為同時擁有其在 Forest A 的身份和繼承自 Forest B SID 的身份。使用這個帳戶嘗試訪問 Forest B 的資源。
* **NTLM 中繼跨樹系 (NTLM Relay Across Trusts):**
* 在特定情況下(例如,如果能觸發 Forest B 的機器向你控制的、位於 Forest A 或邊界的機器進行 NTLM 驗證,且 SMB 簽名未強制),可能可以將這個驗證中繼回 Forest B 的其他機器(如 DC),以該機器的身份執行操作。這比較複雜,依賴網路配置和防禦措施。
3. **權限提升 (Privilege Escalation within Forest B):**
* 一旦在 Forest B 中獲得了任何立足點(即使是低權限使用者),接下來的目標就是在 Forest B **內部**進行權限提升。
* **標準內部提權技術:** 此時,所有適用於單一樹系的提權技術都可能派上用場:
* Kerberoasting (針對 Forest B 的服務帳戶)
* 查找錯誤配置的服務、計劃任務
* 利用未打補丁的漏洞
* 濫用 AD CS (如果 Forest B 有 AD CS 且存在漏洞 ESC1-ESC8)
* 查找儲存的明文密碼或憑證
* 利用 BloodHound 在 Forest B 內部尋找提權路徑
* **利用跨樹系權限提權:** 如果你初始訪問獲得的帳戶(來自 Forest A)在 Forest B 中擁有某些特定的、非典型的權限(例如,對某個 OU 有寫 GPO 的權限,或對某個高權限使用者有重設密碼的權限),則優先利用這些跨樹系賦予的權限。
4. **獲取域控/企業管理員權限 (Domain/Enterprise Admin):**
* 最終目標通常是獲取 Forest B 的 DA 或 EA 權限。
* **DCSync:** 一旦在 Forest B 中獲得了具備 DCSync 權限的帳戶(通常是 DA 組成員或被授予特定權限),就可以 dump Forest B 的 `krbtgt` 帳戶 hash 和其他帳戶的 hash。
* **Golden Ticket (for Forest B):** 使用 Forest B 的 `krbtgt` hash 製作 Golden Ticket,偽造 Forest B 中的任意使用者(包括 EA)。
* **其他 DA/EA 路徑:** 利用在 Forest B 中發現的任何提權路徑達到目標。
5. **橫向移動與持久化 (Lateral Movement & Persistence):**
* 使用在 Forest B 中獲得的憑證(hash, ticket, 明文密碼)在 Forest B 內部進行橫向移動。
* 在 Forest B 的關鍵系統上建立持久化機制(計劃任務、服務、WMI 事件訂閱等)。
* 考慮是否需要在 Forest A 中也建立更隱蔽的持久化,以確保持續訪問 Forest B 的能力。
**關鍵工具**
* **BloodHound/SharpHound:** 不可或缺,用於映射信任關係和跨樹系權限。
* **PowerShell (Active Directory Module):** 查詢 AD 物件和信任。
* **Rubeus:** Kerberos 票證操作,請求和使用跨領域票證。
* **Mimikatz:** 憑證竊取,Golden Ticket,SID History 利用。
* **Impacket Suite (smbexec, wmiexec, secretsdump):** 橫向移動和執行。
* **CrackMapExec (CME):** 批量檢查憑證在目標機器上的有效性。
* **nltest.exe:** 內建工具,查詢信任。
**挑戰與注意事項**
* **選擇性驗證 (Selective Authentication):** 這是最大的障礙。需要仔細尋找被明確授予 "Allowed to Authenticate" 權限的帳戶。
* **網路分段與防火牆:** 兩個樹系間的網路策略可能非常嚴格,阻止必要的端口(Kerberos 88/tcp/udp, LDAP 389/636, SMB 445, RPC Endpoint Mapper 135 及動態 RPC 端口)。可能需要尋找允許通行的協議或利用邊界系統。
* **SID 篩選:** 可能阻止基於 SID History 的攻擊。
* **監控與檢測:** 跨樹系身份驗證和資源訪問通常是重點監控區域。紅隊操作需要更加隱蔽。
* **操作複雜性:** 涉及多個環境,需要清晰地管理不同樹系的憑證、票證和目標。
# 濫用 Windows API 進行隱匿操作
作為紅隊成員,我們的目標不僅僅是使用 Windows API 來完成任務(這是所有合法軟體都會做的事),而是要**刻意地「濫用」(misuse)、創造性地「組合」(combine) 或利用這些 API 中「較少人知的面向」(lesser-known aspects)**,其特定目的就是**規避偵測**,並在藍隊、EDR(端點偵測與回應)、AV(防毒軟體)以及像 Sysmon 這樣的監控工具眼皮底下,悄無聲息地執行惡意任務。
對紅隊而言,Windows API 既是我們的工具箱,也是我們繞過防禦的遊樂場。我們的核心目標是 **OPSEC(操作安全)** —— 最大限度地減少我們的行動足跡,避免被發現。
以下是我們如何思考和濫用 Windows API 來達成隱匿目的:
**1. 避免「吵雜」且明顯的 API (Avoiding the "Loud" and Obvious APIs)**
* **問題點:** 標準的作業方式(如 `CreateProcess()`, `ShellExecute()`, 從磁碟載入 DLL 的 `LoadLibrary()`, 常見的持久化登錄機碼如 `Run`, `RunOnce`)都受到嚴密監控。這些是 EDR Hook 和基於簽章偵測的熱點區域。
* **濫用/解決方案:** 尋找替代路徑。
* **程序創建 (Process Creation):** 不直接用 `CreateProcess`,而是考慮使用更低階的 `NtCreateUserProcess`,或採用如 **程序空殼注入 (Process Hollowing)** / **Herpaderping** 等技術。這類技術通常涉及以暫停模式創建一個合法進程 (`CreateProcess` 的 `CREATE_SUSPENDED` 旗標),接著操控其記憶體空間(`NtUnmapViewOfSection`, `VirtualAllocEx`, `WriteProcessMemory`),修改其執行緒上下文以指向我們的惡意程式碼 (`SetThreadContext`),最後再恢復其執行 (`ResumeThread`)。這樣做能讓程序的父子關係在初期看起來更為合法。
* **程式碼執行 (Code Execution):** 不要只滿足於執行一個 `.exe` 檔案。利用各種**程序注入 (Process Injection)** 技術,例如:傳統 DLL 注入、**反射式 DLL 注入 (Reflective DLL Injection)**、程序空殼注入、執行緒劫持 (Thread Execution Hijacking)、模組踐踏 (Module Stomping)、APC 佇列注入 (APC Queue Injection) 等。這些技術會濫用像 `VirtualAllocEx`, `WriteProcessMemory` 等記憶體操作 API,以及執行緒相關 API(`CreateRemoteThread` 常常被標記,所以優先考慮替代方案如 `QueueUserAPC` 或 `SetThreadContext`)。
* **DLL 載入 (DLL Loading):** 避免從磁碟使用 `LoadLibrary()`。改用**反射式載入**(手動解析記憶體中的 DLL 檔案結構,將其映射到宿主進程,並解析導入表——這需要解析 PE 標頭並使用 `VirtualAlloc`, `VirtualProtect` 等記憶體 API),或者使用 `Assembly.Load()` 從記憶體直接載入 .NET 組件。
**2. 繞過使用者模式 Hooking (Bypassing User-Mode Hooking)**
* **問題點:** EDR 為了攔截和檢查 API 呼叫,經常在使用者模式 DLL(如 `kernel32.dll`, `ntdll.dll`)中常用被濫用的函數(如 `NtAllocateVirtualMemory`)開頭放置鉤子(通常是 JMP 指令)。直接呼叫這些被鉤住的函數會直接觸發 EDR 的警報。
* **濫用/解決方案:**
* **直接系統呼叫 (Direct System Calls):** 找到目標 Native API 函數(例如 `NtAllocateVirtualMemory`)對應的系統服務號 (System Service Number - SSN),然後直接使用 `syscall` 指令進入核心模式。這完全繞過了使用者模式的 `ntdll.dll` 程式碼及其鉤子。像 Syswhispers、Hell's Gate/Halo's Gate 這類的技術可以協助動態尋找這些 SSN。
* **間接系統呼叫 (Indirect System Calls):** 不直接執行 `syscall`,而是跳轉到「乾淨」`ntdll.dll` 函數內部、位於 EDR 鉤子之後但在實際系統呼叫設置之前的 `syscall` 指令位置。
* **去鉤 (Unhooking):** 偵測 EDR 安裝的鉤子(例如,比較磁碟上和記憶體中 `ntdll.dll` 的差異,或檢查函數開頭是否有 JMP 指令),然後使用 `VirtualProtect` 使函數程式碼可寫,再用 `WriteProcessMemory` 恢復函數序言 (prologue) 的原始位元組,從而在呼叫該函數前有效地移除鉤子。
* **使用未公開 API (Using Undocumented APIs):** 有時候,存在一些較低階或未公開的 Native API(`Nt*`/`Zw*` 函數),它們能達到與被鉤住函數相似的效果,但受到的監控較少。這需要深入研究(例如透過 WinDbg、參考 ReactOS 原始碼、或研究洩漏的 Windows 原始碼)。
**3. 利用 API 執行「就地取材」(Living Off the Land - LotL)**
* **問題點:** 放置自訂的惡意工具(Dropping tools)到磁碟上會大大增加被簽章偵測的機會。
* **濫用/解決方案:** 使用 API 來與系統內建的、合法的工具和功能(即「就地取材」的二進制檔/腳本 - LOLBAS)以非預期的方式進行互動。
* **COM 濫用 (COM Abuse):** 許多系統功能都透過 COM 物件暴露。使用像 `CoCreateInstance` 這樣的 API 來獲取 COM 物件的介面,例如任務排程器 (`ITaskService`)、WMI (`IWbemServices`) 或 Shell 操作相關介面。這讓你能夠排程工作、執行 WMI 方法(進行遠端執行、資訊收集)或操作檔案,而無需直接呼叫那些容易引發警報的標準函數。
* **透過 API 使用 WMI:** 與其使用容易被日誌記錄的 `wmic.exe` 或 PowerShell 的 WMI Cmdlet,不如直接從 C/C++/C# 使用 WMI COM API(如 `IWbemServices::ExecMethod`)來查詢資訊或執行方法。
* **操縱系統服務:** 使用服務控制管理器 (Service Control Manager) API(如 `OpenSCManager`, `OpenService`, `ChangeServiceConfig`, `StartService`)來劫持或重新配置現有服務,以達到持久化或執行的目的。
**4. 利用記憶體操作實現隱匿 (Memory Operations for Stealth)**
* **問題點:** 存放在磁碟上的 Payload(如 shellcode、植入物)很容易被 AV/EDR 掃描到。執行過程中的痕跡(如命令列參數)也容易被記錄。
* **濫用/解決方案:** 將所有關鍵元件都保留在記憶體中。
* **無檔案執行 (Fileless Execution):** 使用網路 API(如原始通訊端的 Winsock、HTTP/S 通訊的 WinINet/WinHTTP)直接將 Payload 下載到記憶體中,然後利用記憶體分配/保護 API(`VirtualAlloc`, `VirtualProtect`)和執行技術(如創建執行緒的 API、APC 佇列等)從記憶體中執行它。
* **記憶體中的混淆儲存:** 不要在記憶體中儲存明文的 Shellcode。將其加密或編碼,然後在執行時才使用 API 分配記憶體 (`VirtualAlloc`)、複製編碼後的 Payload、就地解碼/解密、將該記憶體區域標記為可執行 (`VirtualProtect`),最後再跳轉到 Payload 的起始位址執行。
* **模組踐踏 (Module Stomping) / 幻影 DLL 注入 (Phantom DLL Hollowing):** 在目標進程的記憶體中,覆寫一個已經合法載入的 DLL 模組的內容(使用 `VirtualProtect` 後的 `WriteProcessMemory`),替換成你的惡意程式碼,然後執行它。這樣做,從外部觀察,該程序似乎只載入了合法的模組。
**5. 隱藏資料 (Hiding Data)**
* **問題點:** 將配置資訊、竊取的資料或下一階段的 Payload 儲存在標準的磁碟檔案中是有風險的。
* **濫用/解決方案:** 使用 API 將資料存放在非標準的位置。
* **替代資料流 (Alternate Data Streams - ADS):** 使用 `CreateFile` API 配合 `filename:streamname` 這樣的語法,將資料隱藏在一個現有檔案的 ADS 中。這種方式儲存的資料在標準的目錄瀏覽中是不可見的。
* **登錄表濫用 (Registry Abuse):** 使用登錄表 API(如 `RegCreateKeyEx`, `RegSetValueEx`)將資料儲存在不尋常的登錄表位置,可能使用非標準的資料類型,或者將資料巧妙地嵌入現有的、看起來無害的值中(值劫持)。也可以在機碼或值的名稱中使用 NULL 字元,以規避簡單的枚舉工具。
* **記憶體 (Memory):** 將配置或暫存資料僅僅儲存在程式分配的記憶體區域中,不落到磁碟。
**6. 權杖操縱實現權限提升/模擬 (Token Manipulation)**
* **問題點:** 在滲透過程中,我們經常需要提升權限,或者需要在不知道目標使用者密碼的情況下,以其身份進行操作。
* **濫用/解決方案:** 使用 Windows 安全相關 API 來操縱存取權杖 (Access Tokens)。
* `OpenProcessToken`:獲取目標程序的存取權杖(要獲取其他使用者程序的權杖,通常需要 `SeDebugPrivilege`)。
* `DuplicateTokenEx`:複製現有權杖,創建一個新的模擬權杖 (Impersonation Token) 或主權杖 (Primary Token)。
* `ImpersonateLoggedOnUser` / `SetThreadToken`:讓當前的執行緒開始模擬被複製權杖所代表的使用者身份。
* `AdjustTokenPrivileges`:為當前權杖啟用或禁用特定的權限,例如啟用強大的 `SeDebugPrivilege` (用於除錯其他進程,常被 Mimikatz 用來讀取 LSASS 記憶體) 或 `SeBackupPrivilege` (允許讀取任意檔案,繞過常規 ACL 限制)。
**常被濫用於隱匿操作的關鍵 API 類別:**
* **記憶體管理 (Memory Management):** `VirtualAlloc`/`Ex`, `VirtualFree`/`Ex`, `VirtualProtect`/`Ex`, `VirtualQuery`/`Ex`, `ReadProcessMemory`, `WriteProcessMemory`, `MapViewOfFile`, `UnmapViewOfFile`, `NtMapViewOfSection`, `NtUnmapViewOfSection`.
* **程序與執行緒管理 (Process & Thread Management):** `CreateProcess` (及其各種旗標), `OpenProcess`, `TerminateProcess`, `CreateThread`, `CreateRemoteThread`, `ResumeThread`, `SuspendThread`, `GetThreadContext`, `SetThreadContext`, `QueueUserAPC`, `NtCreateUserProcess`, `NtCreateThreadEx`.
* **Windows 安全 (Windows Security):** `OpenProcessToken`, `DuplicateTokenEx`, `SetThreadToken`, `ImpersonateLoggedOnUser`, `AdjustTokenPrivileges`, `LogonUser`, `LsaLogonUser`.
* **檔案系統 (File System):** `CreateFile` (及其各種旗標, ADS), `ReadFile`, `WriteFile`, `DeleteFile`.
* **登錄表 (Registry):** `RegOpenKeyEx`, `RegCreateKeyEx`, `RegSetValueEx`, `RegQueryValueEx`, `RegDeleteValueEx`, `RegEnumKeyEx`, `RegEnumValue`.
* **網路 (Networking):** Winsock (`socket`, `connect`, `bind`, `listen`, `accept`, `send`, `recv`), WinINet (`InternetOpen`, `InternetConnect`, `HttpOpenRequest`, `HttpSendRequest`), WinHTTP.
* **COM (Component Object Model):** `CoInitializeEx`, `CoCreateInstance`, `CoUninitialize`.
* **原生 API (Native API - `ntdll.dll` 中的 `Nt*`/`Zw*` 函數):** 許多 Win32 API 的更低階對應函數,對於繞過使用者模式 Hooking 至關重要。
**紅隊的心態 (Red Team Mindset):**
這是一場永無止境的貓捉老鼠遊戲。我們會研究 EDR 如何偵測特定的 API 使用模式(例如,`VirtualAllocEx` + `WriteProcessMemory` + `CreateRemoteThread` 的組合是典型的注入特徵),然後尋找新的方法來繞過它(例如,改用 APC 佇列注入替代 `CreateRemoteThread`,使用直接系統呼叫,或者找到一個功能類似但較少被監控的 API)。這需要對 Windows 內部機制有深入的理解、具備創造性思維,並且隨著防禦技術的不斷進化而持續學習和適應。我們會大量使用除錯器(如 WinDbg、x64dbg)和反組譯器(如 IDA Pro、Ghidra)來深入理解 API 的工作原理以及它們是如何被監控的。