馮美琪 韓 杰 李建欣
1(中國民航信息網絡股份有限公司運行中心 北京 101318)
2(北京航天萬源科技有限公司 北京 100176)
近年來,Apache Shiro安全框架由于其強大的功能和易用性,逐漸成為主流的開源安全框架,其反序列化漏洞問題同樣備受關注.通過分析近3年國家攻防演練的攻擊手段,發現Apache Shiro反序列化漏洞在實戰中較為實用,成為攻防演練中使用率較高的漏洞之一.在實際工作中,按照官方修復建議進行版本升級后,發現仍會存在Apache Shiro反序列化漏洞,而現有檢測手段無法準確檢測出利用該漏洞進行攻擊的異常請求.
2006年已有學者提出了反序列化漏洞[1].2015年Lawrence[2]在Apache的Commons Collections基礎庫中找到了Java反序列化攻擊的執行鏈,后續更多的Java類庫被驗證存在反序列化漏洞.Apache Shiro作為Java安全框架的一種,其反序列化漏洞的利用鏈與Java反序列化漏洞一致,區別在于攻擊者在利用Apache Shiro漏洞構建惡意請求時還要事先知道AES加解密的密鑰.目前暫未發現關于Apache Shiro反序列化漏洞利用檢測的專項研究,而針對Java反序列化漏洞的研究,錢劼等人[3]通過網頁訪問在默認應用中的空文件判斷是否存在Java反序列化漏洞,提供了一種應急漏洞掃描的方法.杜笑宇等人[4]則對漏洞利用鏈進行研究,提出了一種反序列化漏洞調用鏈挖掘的方法,挖掘潛在調用鏈.郭瑞[5]提出在反序列化之前進行安全性檢查的方法防范反序列化漏洞.現有文獻研究多為應急漏洞掃描、漏洞利用鏈分析等,針對漏洞利用攻擊的檢測較少,主要集中在人工智能在漏洞檢測方面的應用[6].而在實際工作中發現,現有的APT檢測設備對于Apache Shiro反序列化漏洞攻擊的檢測主要基于特征值匹配,即Set-Cookie:rememberMe=deleteMe.此類方法會產生大量告警,并存在較多誤報,需要大量人力進行人工研判,無法滿足安全運營過程中應急響應及處置的要求.
本文針對現有方法的不足之處,結合漏洞利用時的攻擊特征,構建攻擊檢測模型,提升網絡安全監測能力[7].攻擊特征需要從正常用戶訪問和漏洞利用訪問時的HTTP包深入分析研究,對比二者之間的顯著差異,據此建立檢測模型.在分析過程中,選取存在顯著差異的特征作為主要指標,使其檢測結果更加準確.
Apache Shiro安全框架提供“記住我”功能,讓用戶在關閉瀏覽器后,再次訪問時免登錄即可恢復之前的會話.其主要的工作原理是[8]:在首次訪問時,若用戶選擇“記住我”功能,則服務器會將身份信息序列化、AES加密和Base64編碼后,作為rememberMe的值增加到Cookie中并返回給用戶,在用戶第2次訪問時攜帶此Cookie進行訪問.首次訪問時的工作原理如圖1所示.

圖1 首次訪問時Apache Shiro“記住我”工作原理
在用戶第2次訪問時,服務器會對Cookie中的rememberMe字段進行逆向操作,即Base64解碼、AES解密和反序列化,獲得身份信息后與服務器端數據進行對比,若一致則完成身份確認,返回用戶請求的內容.用戶再次訪問時的工作原理如圖2所示.

圖2 再次訪問時Apache Shiro“記住我”工作原理
由于Apache Shiro的“記住我”功能在實現過程中采用AES加解密,key值硬編碼在代碼中,且網上有很多Apache Shiro框架的key值,攻擊者可以通過key值爆破獲取到真實key值,依據這個key值構造惡意請求以達到預期的攻擊效果.
根據漏洞的詳細描述,該漏洞主要影響Apache Shiro 1.2.4及以下的版本[9].因此,下載相關版本的Apache Shiro包,使用Docker技術進行漏洞實驗環境搭建,如圖3所示.

圖3 漏洞實驗環境效果
其中:Docker版本為19.03.13,Apache Shiro版本為1.2.4.
利用漏洞實驗環境模擬正常用戶在開啟“記住我”功能的前提下訪問網站,主要包括訪問首頁、用戶登錄、訪問個人主頁以及退出登錄等訪問行為.其訪問過程中HTTP包的主要流向及特征如圖4所示.

圖4 正常情況下HTTP包特征
對正常用戶訪問時的HTTP包進行深度分析,發現4種明顯訪問特征:
1) JSESSIONID相同.
首次訪問時,為每個用戶開啟1個session,服務器會創建Cookie,其中包含JSESSIONID信息,后續訪問均會攜帶JESSIONID,用于服務器判斷當前用戶對應于哪個session.
2) HTTP響應包中包含特征值Set-Cookie:rememberMe=deleteMe.
在訪問過程中,不同階段出現的Set-Cookie:rememberMe=deleteMe具有不同的含義,主要有:①在第1次訪問時出現,表示網站使用Apache Shiro框架;②登錄時出現,表示此字段為登錄的缺省值,先執行刪除操作,再分配rememberMe,保證用戶攜帶的rememberMe字段與服務器端下發的一致;③退出登錄時出現,表示清除用戶Cookie中攜帶的rememberMe字段,下次登錄時再分配新的;④其余階段出現,表示對于無效的rememberMe字段進行刪除操作.
3) 同一用戶在同一session的Cookie中rememberMe字段相同.
Cookie中的rememberMe字段為第1次登錄時由服務器分配,關閉瀏覽器再次進入頁面后,Cookie中的rememberMe字段值仍相同.以上情況說明,用戶第1次訪問會由服務器統一分配rememberMe字段的值,后續用戶訪問均會使用同一個rememberMe.
4) HTTP響應包中Set-Cookie:rememberMe=deleteMe出現2次.
正常用戶在訪問過程中,響應包中Set-Cookie:rememberMe=deleteMe會出現2次,1次是用戶登錄時,1次是用戶退出登錄時.
通過分析,Apache Shiro反序列化漏洞的利用方式[10]主要有3種:一是反彈shell;二是命令執行;三是寫入文件.以簡單的命令執行為例,模擬攻擊者利用Apache Shiro反序列化漏洞來達到命令執行目的的過程,主要觀察HTTP包的變化情況,其訪問過程中HTTP包的主要流向及特征如圖5所示.

圖5 漏洞利用情況下HTTP包特征
對漏洞利用情況訪問時的HTTP包進行深度分析,發現4種明顯訪問特征:
1) Cookie中無JSESSIONID等字段.
在正常情況下,用戶訪問會攜帶其他Cookie字段,如JSESSIONID等,但由于攻擊者目的明確,其往往只攜帶有攻擊載荷的Cookie字段.有一種特例,即在HTTP請求包中含有非常見字段,如Testecho等,該字段一般為rememberMe中擬執行的命令或參數.
2) 同一用戶Cookie中的rememberMe不斷變化.
在正常情況下,服務器分配給一個用戶的rememberMe字段是固定的,但是由于攻擊者在漏洞利用之前先通過爆破等方式獲取AES加解密的key值,導致其rememberMe字段的值不斷變化.實際環境中的攻擊請求,其變化頻率可達到10條/min.
3) 相同payload不同key,rememberMe長度相同;不同payload相同key,rememberMe長度不同.
攻擊者在利用Apache Shiro漏洞攻擊時,rememberMe字段會迅速變化,其長度也不一致.為驗證其具體的攻擊行為,對相同payload不同key和不同payload相同key這2種情況下rememberMe長度進行探索,分析使用3個常見的key值執行2個不同的命令.3個key值如下.
key1:kPH+bIxk5D2deZiIxcaaaA==.
key2:2AvVhdsgUs0FSA3SDFAdag==.
key3:wGiHplamyX1VB11UXWol8g==.
擬執行的2個命令如下.
命令1:ls.
命令2:〈?php @eval($_POST[‘attack’]);?〉.
分別使用3個key值對2個命令進行加密操作,不同情況下rememberMe長度對比如表1所示:

表1 不同key值不同命令的rememberMe字符數對比
根據以上結果發現:
① 相同payload不同key時,rememberMe長度相同,說明其在進行key值爆破;
② 不同payload相同key時,rememberMe長度不同,說明其已獲取key值,正在進行命令執行嘗試.根據攻擊者攻擊的思路,其在獲取爆破出key值后會進行命令執行,此時疑似為攻擊成功,需要人工介入進行確認及處置.
4) 包含Set-Cookie:rememberMe=deleteMe的響應包數量大于2.
根據訪問的先后邏輯關系,正常情況下,除了第1次訪問和退出登錄時,響應包中存在Set-Cookie:rememberMe=deleteMe字符串,其余后續訪問中的響應包中均不包含此類字符串.但由于攻擊者構造的rememberMe字段不符合服務器可識別的類型,因此即便命令執行成功,仍會在響應包中包含deleteMe值.以反彈shell為例,發現ping攻擊機的666端口成功反彈了shell,但是在響應包中仍包含Set-Cookie:rememberMe=deleteMe字符串,詳細過程如圖6所示.

圖6 Apache Shiro反序列化漏洞反彈shell流程
通過對比正常情況和異常情況下HTTP包的不同訪問特征,提取相關特征作為模型中的檢測特征,主要分為2個方面:一個是檢測是否為攻擊;另一個是檢測攻擊是否疑似成功.在檢測是否為攻擊的過程中,首先要確定同一IP地址HTTP請求包中rememberMe字段在單位時間內的變化頻數,其次確定HTTP請求包中是否僅包含rememberMe字段,最后確定HTTP響應包中Set-Cookie:rememberMe=deleteMe的出現頻數.以上3個指標用于檢測相關請求是否為攻擊請求.在檢測攻擊是否疑似成功時,通過分析攻擊者的攻擊思路,確定rememberMe字段長度的離散程度,通過計算該指標判斷攻擊是否疑似成功.
通過分析某IP地址1 min內HTTP請求包中rememberMe的去重數量,得到該IP地址請求包中rememberMe字段在單位時間內的變化頻數,計算公式為
n=該IP地址1 min內HTTP請求中
rememberMe的去重數量,
(1)
通過計算該指標可以初步判斷該IP地址是否為惡意IP,將明顯的攻擊IP檢測出來.
通過分析某IP地址1 min內HTTP請求包Cookie中是否都只包含rememberMe這個字段,來輔助判斷相關請求是否為攻擊請求,表示是否為攻擊者重復進行爆破.其計算公式為
single_col=IF(該IP地址1 min內HTTP請
求的Cookie中僅包含rememberMe字段).
(2)
通過分析某IP地址1min內包含Set-Cookie:rememberMe=deleteMe 的HTTP響應包數量來輔助判斷相關請求是否為攻擊請求,表示是否為攻擊者高度偽造的攻擊請求.其計算公式為
dl_n=該IP地址1 min內包含Set-Cookie:
rememberMe=deleteMe的HTTP響應包數量.
(3)
在完成攻擊檢測的條件下,進一步判斷是否為疑似成功的攻擊請求.通過分析攻擊者的攻擊思路,計算rememberMe字段長度的離散程度,該計算結果表示攻擊者是否已經成功突破外網,進入內網進行命令執行、內存馬注入等相關操作,其計算公式為
(4)

攻擊特征提取結果無法直接應用于攻擊檢測,需要結合攻擊檢測流程模型進行應用.根據2.4節提到的指標,制定相關的檢測流程,如圖7所示.

圖7 檢測流程
首先需要確定是否存在漏洞,在存在漏洞的基礎上,通過n>10這一顯著特征判斷是否為攻擊.若是,則通過σ=0來判斷攻擊是否疑似成功;若不是,則依次通過single_col和dl_n的值進一步判斷是否為攻擊.若single_col和dl_n的值判斷為攻擊,則通過σ=0判斷攻擊是否疑似成功;若判斷不是攻擊,則說明為正常業務請求,為誤報.
根據2.5節的攻擊檢測流程,在單位時間內rememberMe值的變化頻數為明顯特征,根據該特征可以快速判斷是否為漏洞利用攻擊,若該特征無法判斷時,則輔以Cookie中字段類型的特征以及返回包中字段特征進一步判斷.確認為攻擊后則通過rememberMe長度變化的特征來進一步確定具體的攻擊行為,進而確定是否疑似成功攻擊.本文以實際的2個攻擊行為和1個正常業務行為為例進行實驗.
攻擊行為1:內部滲透測試時,利用網上現有Apache Shiro漏洞攻擊工具進行測試,分別進行key值爆破、利用鏈爆破、命令執行和內存馬注入,以上操作均成功執行.根據實驗結果,發現rememberMe值的變化依舊是明顯的特征,無論是頻數的變化還是字段長度的變化,都可以在檢測Apache Shiro反序列化漏洞攻擊以及攻擊成功與否方面發揮關鍵作用,其Cookie中攜帶的rememberMe字段詳細信息如表2所示:

表2 攻擊行為1 rememberMe字段特征
攻擊行為2:外網IP地址120.x.x.x對某互聯網網站在短時間進行頻繁訪問并且現有檢測設備產生大量Apache Shiro告警信息.通過觀察其HTTP請求包,發現每次訪問的Cookie中攜帶的rememberMe字段值都不同,詳細如表3所示:

表3 攻擊行為2 rememberMe字段值
正常業務行為:用戶正常在網站上進行操作并在登錄時開啟了“記住我”功能,其rememberMe字段值固定.
以上2個攻擊行為和1個正常業務行為均被現有檢測設備判定為Apache Shiro漏洞利用攻擊,而采用2.5節的檢測流程進行檢測,得到的各行為指標值和檢測結果如表4所示:

表4 測試樣例的統計指標值和檢測結果
需要說明的是,在正常情況下,包含Set-Cookie:rememberMe=deleteMe的響應包數量為2,分別是用戶登錄和退出登錄時,由于實例驗證過程中,統計分析的時間窗口一般無法完全覆蓋用戶登錄和退出登錄之間的全過程,只能覆蓋用戶的部分行為,因此在實際驗證中,dl_n的值一般小于等于2.
對比已有檢測設備的檢測結果,攻擊行為1和攻擊行為2可以檢測出是攻擊行為,但無法確定是否疑似成功,而利用本文檢測方法,可以進一步判斷攻擊行為1疑似成功,需要轉到人工進一步處置.除此之外,針對正常的業務行為,現有檢測方法將其檢測為異常攻擊行為并產生大量告警,說明現有檢測設備存在一定誤報,在一定程度上會增加企業的人力投入,降低安全事件的處置效率,而本文檢測方法則可以識別其為誤報,屬于正常業務操作.因此也證明了本文分析方法的正確性.
在攻防演練和實際攻擊中,Apache Shiro反序列化漏洞已經成為利用率最高且危害性較大的一種漏洞,如何及時有效地檢測出漏洞利用攻擊也成為了企業最為關注的問題.現有一些學者在反序列化漏洞檢測方面的研究取得了很大進展,但對于如何檢測反序列化漏洞利用攻擊方面的研究成果還很少.本文從統計學的角度分析了Apache Shiro在正常情況和反序列化漏洞利用情況下的HTTP包特征,并提出了Apache Shiro反序列化漏洞利用攻擊的檢測流程,最后通過實例測試驗證了該方法的有效性.
通過實驗發現,本文的檢測方法能夠有效降低誤報,但是對于攻擊是否成功存在一定的誤報,仍需人工進行研判分析,后續仍需思考如何實現自動化研判,實現安全事件自動化處置,提高處置效率.此外,本文檢測方法中的統計指標是基于IP維度來計算的,針對分布式的攻擊,本文的檢測方法可能會被繞過,導致檢出率降低,因此在下一步的工作中,需要重點研究如何唯一標識1個網絡用戶.
現有APT檢測設備大多都是基于特征值檢測,該方法無法識別異常的流量,存在嚴重的滯后性,已不能滿足現有網絡安全檢測的需要,希望后續安全廠商可將大數據分析技術和異常流量分析技術集成到檢測設備中,更好地防御APT攻擊.