網(wǎng)不出網(wǎng)環(huán)境下的Fastjson反序列化漏洞應(yīng)急響應(yīng)與流量分析實戰(zhàn))
1. 項目概述一次典型的內(nèi)部網(wǎng)絡(luò)安全事件那天下午監(jiān)控平臺的告警突然亮起不是那種常規(guī)的掃描告警而是一條關(guān)于某個內(nèi)部業(yè)務(wù)系統(tǒng)存在可疑POST請求的日志。系統(tǒng)本身部署在內(nèi)網(wǎng)不直接對外暴露也就是我們常說的“不出網(wǎng)”環(huán)境。這種環(huán)境下的安全事件往往更棘手因為攻擊鏈可能更隱蔽危害也可能更大。作為安全團隊的成員我第一時間被拉進了應(yīng)急響應(yīng)小組。初步排查目標(biāo)系統(tǒng)是一個基于Java開發(fā)的Web服務(wù)大量使用了Fastjson進行數(shù)據(jù)序列化與反序列化。結(jié)合告警的上下文和近期漏洞情報一個詞立刻浮現(xiàn)在腦海Fastjson反序列化漏洞。接下來的幾個小時就是一場與時間賽跑的“破案”過程核心線索不是系統(tǒng)日志而是網(wǎng)絡(luò)流量。這篇文章我就來復(fù)盤一下如何在沒有直接外聯(lián)證據(jù)不出網(wǎng)的情況下通過深度分析流量特征一步步鎖定并證實了這次Fastjson漏洞攻擊希望能給面臨類似場景的同行一些參考。2. 應(yīng)急響應(yīng)的核心思路與前期研判面對一個不出網(wǎng)環(huán)境的安全告警常規(guī)的“看外聯(lián)IP、查外發(fā)流量”思路行不通。我們的戰(zhàn)場被限定在了內(nèi)部網(wǎng)絡(luò)。但這并不意味著無計可施恰恰相反內(nèi)網(wǎng)流量往往保留了更原始、更完整的攻擊痕跡因為攻擊者通常認(rèn)為這里“更安全”會放松警惕。我的核心思路很明確將攻擊行為視為一個“黑盒”輸入而我們的應(yīng)用和網(wǎng)絡(luò)就是“傳感器”通過分析這個“黑盒”輸入在“傳感器”上引發(fā)的異常波動來反推攻擊的本質(zhì)。2.1 環(huán)境隔離與初步信息收集接到告警后第一步不是直奔服務(wù)器而是建立信息隔離區(qū)。我立即聯(lián)系了系統(tǒng)負(fù)責(zé)人和網(wǎng)絡(luò)團隊做了三件事流量鏡像在核心交換機上對目標(biāo)服務(wù)器的業(yè)務(wù)網(wǎng)卡入口流量進行全量鏡像保存到獨立的分析平臺。這是后續(xù)所有分析的基石必須保證流量的完整性和原始性。系統(tǒng)快照在確保業(yè)務(wù)可接受的前提下當(dāng)時是非高峰時段對服務(wù)器的內(nèi)存、關(guān)鍵進程列表、網(wǎng)絡(luò)連接狀態(tài)進行了快照保存。對于Java應(yīng)用特別關(guān)注了jstack線程棧和jmap -histo對象直方圖的輸出。日志拉取收集了應(yīng)用日志如Log4j2、中間件日志Tomcat access/error log、系統(tǒng)日志/var/log/messages以及任何現(xiàn)有的安全設(shè)備如WAF、IDS的告警日志。注意在應(yīng)急初期切忌直接登錄服務(wù)器進行“大刀闊斧”的查殺或重啟。這可能會破壞現(xiàn)場證據(jù)如內(nèi)存馬、進程信息讓攻擊溯源變得困難。我們的原則是“先取證后處置”。2.2 基于告警的假設(shè)驅(qū)動分析告警信息顯示可疑請求的URL路徑是一個正常的業(yè)務(wù)API接口但Payload部分異常。這立刻指向了兩種可能1. 業(yè)務(wù)邏輯漏洞如越權(quán)、注入2. 通用組件漏洞如反序列化。結(jié)合該系統(tǒng)大量使用Fastjson處理JSON請求的背景以及近期Fastjson 1.2.80及以下版本反序列化漏洞CVE-2022-25845等的威脅情報我初步將調(diào)查重心放在了Fastjson漏洞上。這個假設(shè)成為了后續(xù)分析的“導(dǎo)航儀”。我需要從海量的流量數(shù)據(jù)中尋找能驗證或推翻這個假設(shè)的證據(jù)。不出網(wǎng)環(huán)境下的攻擊攻擊者目標(biāo)通常是植入內(nèi)存馬、竊取內(nèi)網(wǎng)敏感數(shù)據(jù)、作為橫向移動的跳板。因此流量特征會圍繞“漏洞利用”、“后門通信”、“內(nèi)網(wǎng)探測”這幾個階段展開。3. 關(guān)鍵流量特征解析與攻擊鏈還原有了鏡像流量我使用Wireshark和Zeek原名Bro結(jié)合自研腳本進行深度分析。不出網(wǎng)流量的分析關(guān)鍵在于識別“異常”而非“惡意”。因為所有流量源IP都是內(nèi)網(wǎng)地址傳統(tǒng)IP信譽庫失效。以下是我鎖定的幾個關(guān)鍵特征及其分析過程。3.1 Fastjson漏洞利用流量的“指紋”Fastjson反序列化漏洞的利用其流量特征在HTTP層有比較明顯的印記。我在篩選出的可疑時間段的HTTP請求中發(fā)現(xiàn)了以下共性type屬性指向非常規(guī)類這是Fastjson反序列化的核心特征。攻擊者通過type指定一個目標(biāo)類Fastjson會嘗試實例化并調(diào)用其setter或getter方法。在攻擊流量中我看到了諸如com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl、org.apache.tomcat.dbcp.dbcp2.BasicDataSource這類明顯不屬于業(yè)務(wù)邏輯的類名。這些是公開漏洞利用PoC中常用的類用于構(gòu)造利用鏈。{ type: com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl, _bytecodes: [yv66vgAAADQA...base64編碼的惡意字節(jié)碼], _name: a.b, _tfactory: {}, _outputProperties: {} }為什么這是關(guān)鍵證據(jù)正常的業(yè)務(wù)JSON數(shù)據(jù)type如果使用指向的應(yīng)該是業(yè)務(wù)DTOData Transfer Object類如com.xxx.service.dto.UserDTO。出現(xiàn)Java標(biāo)準(zhǔn)庫或第三方庫中的特定類且包含_bytecodes等敏感字段基本可以斷定是攻擊行為。POST數(shù)據(jù)體結(jié)構(gòu)異常正常的業(yè)務(wù)JSON結(jié)構(gòu)相對規(guī)整字段名有業(yè)務(wù)含義。而攻擊Payload為了滿足反序列化鏈的調(diào)用條件結(jié)構(gòu)往往嵌套復(fù)雜會出現(xiàn)大量空對象{}、空數(shù)組[]以及像_outputProperties、_name這類具有特定含義的屬性名。通過編寫簡單的腳本統(tǒng)計JSON的嵌套深度和特定關(guān)鍵詞出現(xiàn)頻率可以快速篩選出異常請求。Content-Type與數(shù)據(jù)體不匹配的“偽裝”部分攻擊流量試圖偽裝。雖然POST請求的Content-Type標(biāo)頭是application/json但數(shù)據(jù)體開頭卻可能包含無關(guān)字符或嘗試進行編碼混淆。不過在本次事件中攻擊流量相對“原始”沒有做深度混淆。3.2 漏洞利用成功后的“后門”流量特征如果Fastjson漏洞利用成功攻擊者下一步通常是在內(nèi)存中植入Webshell內(nèi)存馬或執(zhí)行系統(tǒng)命令。由于不出網(wǎng)命令執(zhí)行結(jié)果或Webshell的通信都會在內(nèi)部網(wǎng)絡(luò)產(chǎn)生流量。我發(fā)現(xiàn)了緊隨漏洞利用請求之后的一些異常會話“冰蝎”型Webshell通信特征這是內(nèi)網(wǎng)滲透中最常見的工具之一。其流量特征較為明顯靜態(tài)路徑動態(tài)參數(shù)存在對某一個特定URL路徑如/upload、/static/xx.jsp的頻繁POST請求每次請求的URL完全相同但參數(shù)如pass、c的值是加密且變化的。這與正常用戶訪問或API調(diào)用模式不符。固定的HTTP頭部“冰蝎”3.0以后版本雖然加密能力增強但其請求頭中的Accept、Accept-Language、Accept-Encoding等字段的值長度固定且每次請求幾乎一模一樣。正常瀏覽器的這些頭部會因請求內(nèi)容稍有差異。通過Zeek腳本提取同一源IP的請求頭進行對比很容易發(fā)現(xiàn)這種“機器式”的規(guī)律性。Content-Type: application/octet-stream這是“冰蝎”上傳文件或執(zhí)行特定操作時的一個特征。正常的Web應(yīng)用很少使用這個Content-Type來傳輸業(yè)務(wù)數(shù)據(jù)?!案缢估毙蚖ebshell通信特征另一個常用工具其特征點有所不同Cookie尾部異常分號在部分版本中哥斯拉Webshell連接的請求Cookie字段最后一個鍵值對后面會多一個分號如Cookie: key1value1; key2value2;。而標(biāo)準(zhǔn)HTTP和瀏覽器實現(xiàn)最后一個鍵值對后不應(yīng)有分號。這是一個非常細(xì)微但有效的特征。長連接保持為了維持Shell會話哥斯拉會設(shè)置Connection: keep-alive并保持較長時間的TCP連接與同一內(nèi)網(wǎng)IP進行多次高頻、短間隔的請求-響應(yīng)交互模擬“心跳”或持續(xù)操作。命令執(zhí)行回顯的流量模式攻擊者可能不植入Webshell而是直接通過漏洞執(zhí)行系統(tǒng)命令如whoami、ipconfig /all、net user。其流量特征表現(xiàn)為請求與響應(yīng)的不對稱性一個簡短的POST請求攜帶了編碼后的命令卻收到了一個較長的HTTP響應(yīng)體。這個響應(yīng)體內(nèi)容通常是命令執(zhí)行結(jié)果的輸出經(jīng)過Base64或URL編碼。響應(yīng)內(nèi)容包含系統(tǒng)信息通過解碼響應(yīng)內(nèi)容發(fā)現(xiàn)了Windows系統(tǒng)命令行輸出的典型格式如C:\Users\提示符、中文亂碼等直接證實了系統(tǒng)命令已被執(zhí)行。實操心得在分析這些后門流量時不要只盯著單個數(shù)據(jù)包。要建立“會話”Conversation視角在Wireshark中跟蹤完整的TCP流Follow TCP Stream。這樣你能看到一次交互的完整明文或加密前的原始數(shù)據(jù)對于識別加密Webshell的固定頭部、尾部特征非常有幫助。例如冰蝎的流量在TCP流視圖下往往能看到請求體中存在固定的“魔術(shù)字節(jié)”或結(jié)構(gòu)。3.3 橫向移動與內(nèi)網(wǎng)探測的痕跡攻擊者進入一臺內(nèi)網(wǎng)機器后絕不會滿足于此。我通過分析該服務(wù)器作為客戶端向外發(fā)起的連接發(fā)現(xiàn)了橫向移動的跡象對內(nèi)網(wǎng)端口的掃描從受害服務(wù)器上發(fā)現(xiàn)了向大量內(nèi)網(wǎng)IP的445SMB、3389RDP、22SSH、6379Redis等端口的SYN連接嘗試。這些連接很多是“半開連接”SYN_SENT說明目標(biāo)端口未開放。這種由內(nèi)網(wǎng)一臺服務(wù)器發(fā)起的、針對其他內(nèi)網(wǎng)服務(wù)的端口掃描行為是典型的橫向移動前期偵查。異常協(xié)議連接嘗試發(fā)現(xiàn)了向其他服務(wù)器1433MSSQL、3306MySQL端口的連接并伴隨有類似SQL語句的TCP載荷。這可能是攻擊者在嘗試數(shù)據(jù)庫弱口令爆破或利用數(shù)據(jù)庫漏洞。SMB、RDP協(xié)議通信發(fā)現(xiàn)了與個別內(nèi)網(wǎng)主機成功的445端口通信流量中攜帶了NTLM認(rèn)證相關(guān)數(shù)據(jù)。這極有可能是攻擊者在嘗試傳遞哈希Pass-the-Hash或利用永恒之藍EternalBlue類漏洞進行橫向擴散。如何關(guān)聯(lián)這里的關(guān)鍵時間線。端口掃描和異常連接請求都發(fā)生在首次Fastjson攻擊流量之后幾分鐘內(nèi)。這就構(gòu)成了一個完整的攻擊鏈閉環(huán)外部攻擊者通過某種方式可能是魚叉郵件、水坑攻擊導(dǎo)致的內(nèi)網(wǎng)用戶中招再由該主機作為跳板向內(nèi)網(wǎng)目標(biāo)服務(wù)器發(fā)送Fastjson惡意Payload → 利用成功在服務(wù)器上執(zhí)行命令或植入Webshell → 通過該Webshell作為據(jù)點發(fā)起對內(nèi)網(wǎng)其他主機的掃描和攻擊嘗試。4. 深度流量取證與攻擊者畫像勾勒僅僅知道被攻擊了還不夠應(yīng)急響應(yīng)的目標(biāo)是“抑制、根除、恢復(fù)、總結(jié)”。通過深度流量分析我們可以勾勒出攻擊者的行為畫像為根除隱患提供精準(zhǔn)方向。4.1 攻擊載荷Payload解碼與工具識別我將捕獲到的Fastjson攻擊Payload中的_bytecodes字段Base64編碼提取出來進行解碼。解碼后得到的是一個Java類文件的字節(jié)碼。通過使用javap -c反匯編或者直接使用一些在線Java字節(jié)碼分析工具可以大致看出這個類的功能。在我分析的案例中該字節(jié)碼是一個簡單的類其靜態(tài)代碼塊static{}中包含了一段通過Runtime.getRuntime().exec()執(zhí)行系統(tǒng)命令的代碼命令是下載一個遠(yuǎn)程腳本并執(zhí)行。進一步我分析了該下載命令指向的內(nèi)網(wǎng)地址另一個已被攻陷的肉雞并從其流量中發(fā)現(xiàn)了與公開的“哥斯拉”管理端通信的特征。由此可以推斷攻擊者使用的可能是公開的Fastjson漏洞利用工具如JNDI注入攻擊工具配合哥斯拉進行后續(xù)控制。工具鏈的相對固定也說明攻擊者可能并非高級APT組織而是利用現(xiàn)成工具的常規(guī)黑產(chǎn)或腳本小子。4.2 攻擊路徑與入口點推測這是不出網(wǎng)應(yīng)急中最難也是最重要的一環(huán)。服務(wù)器本身不對外攻擊流量從何而來我通過以下步驟進行推測溯源攻擊源IP所有攻擊流量的源IP都是一個內(nèi)網(wǎng)地址假設(shè)為10.1.2.100。這顯然不是最終攻擊者而是一個“跳板機”。分析跳板機立刻協(xié)調(diào)網(wǎng)絡(luò)團隊獲取10.1.2.100主機的信息。發(fā)現(xiàn)這是一臺運維人員的辦公電腦。檢查該電腦在攻擊時間前后的網(wǎng)絡(luò)連接和進程歷史通過EDR終端記錄發(fā)現(xiàn)其瀏覽器曾訪問過一個被標(biāo)記為“釣魚”的外部網(wǎng)址隨后該主機上出現(xiàn)了異常的Java進程網(wǎng)絡(luò)活動。還原攻擊路徑綜合所有信息最可能的攻擊路徑是運維人員辦公電腦10.1.2.100訪問釣魚網(wǎng)站 → 網(wǎng)站利用瀏覽器漏洞或誘導(dǎo)下載在其電腦上植入了一個木馬或劫持了瀏覽器 → 該木馬以辦公電腦為跳板對內(nèi)網(wǎng)服務(wù)器目標(biāo)發(fā)起了Fastjson漏洞攻擊。攻擊者利用了內(nèi)部人員的主機作為“橋頭堡”繞過了網(wǎng)絡(luò)邊界防護。4.3 影響范圍評估通過分析受害服務(wù)器已淪陷向外發(fā)起的掃描流量我整理出了一份“潛在感染清單”直接掃描目標(biāo)列出了所有被掃描的IP和端口。成功建立連接的主機特別是那些有SMB、RDP等成功會話的主機需要立即進行隔離和檢查。內(nèi)部敏感系統(tǒng)掃描列表中包含了數(shù)據(jù)庫服務(wù)器、版本控制服務(wù)器Git、文件共享服務(wù)器等。這些系統(tǒng)一旦被攻破后果嚴(yán)重。這份清單成為了后續(xù)“抑制”階段的關(guān)鍵輸入安全團隊據(jù)此迅速開展了內(nèi)網(wǎng)隔離和排查工作。5. 應(yīng)急處置措施與長效加固建議基于流量分析得出的結(jié)論我們迅速采取了行動。5.1 立即處置抑制與根除隔離網(wǎng)絡(luò)立即在防火墻上切斷了受害服務(wù)器10.1.2.200和跳板機10.1.2.100與內(nèi)網(wǎng)的所有非必要通信只保留管理通道。清除后門對受害服務(wù)器由于發(fā)現(xiàn)了內(nèi)存馬特征我們選擇了最徹底的方式備份業(yè)務(wù)數(shù)據(jù)后直接下線該實例。在隔離環(huán)境中對磁盤鏡像進行取證分析確認(rèn)Webshell文件位置和攻擊者創(chuàng)建的后門賬戶然后使用干凈的鏡像重新部署應(yīng)用。嚴(yán)禁直接重啟在確認(rèn)內(nèi)存馬存在的情況下重啟會導(dǎo)致內(nèi)存馬消失但磁盤上的后門文件可能被設(shè)置為持久化如寫入計劃任務(wù)、服務(wù)重啟后會被重新加載。必須先清理文件層面的后門。排查跳板機對運維人員的電腦進行全盤殺毒、惡意進程清理并重置了密碼。檢查了瀏覽歷史、下載記錄和啟動項。掃描潛在目標(biāo)根據(jù)“潛在感染清單”對其他被掃描的主機進行漏洞掃描和日志審查確認(rèn)是否已被滲透。5.2 漏洞修復(fù)與配置加固升級與修復(fù)將業(yè)務(wù)系統(tǒng)使用的Fastjson組件緊急升級到最新安全版本當(dāng)時是1.2.83或更高并確保開啟了SafeMode或使用了官方推薦的安全配置如指定反序列化白名單。// 使用SafeMode是最根本的解決方案 ParserConfig.getGlobalInstance().setSafeMode(true);網(wǎng)絡(luò)層面細(xì)化網(wǎng)絡(luò)分區(qū)強化VLAN和防火墻策略遵循最小權(quán)限原則。即使在內(nèi)網(wǎng)Web服務(wù)器也不應(yīng)能直接訪問數(shù)據(jù)庫服務(wù)器的管理端口、運維區(qū)的SSH端口等。部署內(nèi)部IDS/IPS在核心交換節(jié)點部署網(wǎng)絡(luò)入侵檢測/防御系統(tǒng)配置規(guī)則檢測Fastjson攻擊特征、冰蝎/哥斯拉流量特征、橫向移動掃描行為等。出站流量管控雖然是不出網(wǎng)服務(wù)器但仍需嚴(yán)格限制其主動向外發(fā)起的連接僅允許訪問必要的更新源或依賴服務(wù)。主機與應(yīng)用層面強化EDR部署確保所有服務(wù)器和終端安裝有效的終端檢測與響應(yīng)系統(tǒng)能夠檢測異常進程、網(wǎng)絡(luò)連接和文件操作。日志集中與審計將所有服務(wù)器、中間件、數(shù)據(jù)庫的日志集中收集到SIEM安全信息與事件管理平臺。針對Fastjson可以監(jiān)控日志中是否出現(xiàn)type屬性為非法類的告警。WAF規(guī)則更新在內(nèi)部的WAF或應(yīng)用網(wǎng)關(guān)設(shè)備上更新規(guī)則集添加對已知Fastjson漏洞攻擊Payload的檢測和攔截。5.3 監(jiān)控與預(yù)警優(yōu)化本次事件暴露了原有監(jiān)控的不足。我們后續(xù)優(yōu)化了異常流量建?;诖舜喂舻牧髁刻卣鹘⒘藘?nèi)部異常流量基線模型。例如監(jiān)控同一內(nèi)網(wǎng)IP對特定服務(wù)端口如445的掃描行為監(jiān)控HTTP請求中Content-Type: application/octet-stream但URL并非文件上傳接口的情況。威脅情報集成訂閱了Fastjson等相關(guān)組件的漏洞情報feed一旦有新的漏洞或PoC公開能第一時間在流量和日志層面添加檢測規(guī)則。演練常態(tài)化定期組織內(nèi)部紅藍對抗演練模擬不出網(wǎng)環(huán)境的滲透攻擊檢驗安全監(jiān)測和應(yīng)急響應(yīng)流程的有效性。6. 總結(jié)與反思不出網(wǎng)應(yīng)急的“道”與“術(shù)”這次應(yīng)急響應(yīng)讓我深刻體會到對于不出網(wǎng)環(huán)境流量分析是“眼睛”而正確的安全架構(gòu)和運維習(xí)慣是“免疫系統(tǒng)”?!靶g(shù)”的層面要熟練掌握各類攻擊工具的流量特征。這需要持續(xù)學(xué)習(xí)建立自己的知識庫。例如不僅要記得“冰蝎的Accept頭長度固定”還要理解為什么它要這么做為了繞過基于流量行為異常的檢測。分析時要結(jié)合多種特征進行綜合判斷避免單一特征誤報?!暗馈钡膶用姹仨殘猿謳讞l鐵律假設(shè) breach假設(shè)已被攻破不要幻想內(nèi)網(wǎng)是絕對安全的。零信任架構(gòu)的理念至關(guān)重要任何訪問請求都必須經(jīng)過驗證和授權(quán)。縱深防御在網(wǎng)絡(luò)、主機、應(yīng)用、數(shù)據(jù)各個層面都部署防護和檢測措施。即使攻擊者突破了一層下一層也能提供緩沖和告警。最小權(quán)限無論是服務(wù)器間的訪問還是人員的賬號權(quán)限都必須遵循最小化原則。本次事件中如果運維電腦沒有直接訪問生產(chǎn)服務(wù)器的權(quán)限攻擊鏈就可能中斷。持續(xù)監(jiān)控與響應(yīng)安全運營SecOps不是一次性的項目而是持續(xù)的過程。需要建立7x24小時的監(jiān)控和響應(yīng)能力對告警進行閉環(huán)處理。最后我想說一次成功的應(yīng)急響應(yīng)技術(shù)分析只占一半另一半是高效的團隊協(xié)作、清晰的溝通和規(guī)范的流程。從網(wǎng)絡(luò)團隊提供流量鏡像到系統(tǒng)團隊配合下線機器再到業(yè)務(wù)團隊理解風(fēng)險接受短暫的業(yè)務(wù)中斷每一個環(huán)節(jié)都不可或缺。把這次復(fù)盤寫下來既是對自己工作的總結(jié)也希望能成為一個可供參考的案例。安全之路道阻且長唯有多看、多練、多思考才能在與攻擊者的對抗中多一分勝算。