內存的檢測與排查

內存🐎的檢測與排查

文章目錄

    • 內存🐎的檢測與排查
      • 查殺Java Web filter型內存馬
        • 0x01 內存馬簡歷史
        • 0x02 查殺思路
        • 0x03 內存馬的識別
        • 0x04 內存馬的查殺

查殺Java Web filter型內存馬

0x01 內存馬簡歷史

其實內存馬由來已久,早在17年n1nty師傅的《Tomcat源碼調試筆記-看不見的shell》中已初見端倪,但一直不溫不火。后經過rebeyong師傅使用agent技術加持后,拓展了內存馬的使用場景,然終停留在奇技淫巧上。在各類hw洗禮之后,文件shell明顯氣數已盡。內存馬以救命稻草的身份重回大眾視野。特別是今年在shiro的回顯研究之后,引發了無數安全研究員對內存webshell的研究,其中涌現出了LandGrey師傅構造的Spring controller內存馬。至此內存馬開枝散葉發展出了三大類型:

  1. servlet-api類
    • filter型
    • servlet型
  1. spring類
    • 攔截器
    • controller型
  1. Java Instrumentation類
    • agent型
0x02 查殺思路

利用Java Agent技術遍歷所有已經加載到內存中的class。先判斷是否是內存馬,是則進入內存查殺。

0x03 內存馬的識別

1.filter名字很特別【弱特征】

內存馬的Filter名一般比較特別,有shell或者隨機數等關鍵字。這個特征稍弱,因為這取決于內存馬的構造者的習慣,構造完全可以設置一個看起來很正常的名字。

2.filter優先級是第一位【弱特征】

為了確保內存馬在各種環境下都可以訪問,往往需要把filter匹配優先級調至最高,這在shiro反序列化中是剛需。但其他場景下就非必須,只能做一個可疑點。

對于一個web工程的filter過濾器,一般有兩種方式放入項目中:

1、在web.xml里面配置

之前我們控制多個filter的執行順序是通過web.xml中控制filter的位置來控制的,放在上面的會比放在下面的先執行,如下“用戶登錄檢查過濾器”會比“接口日志過濾器”先執行。

<!-- 用戶登錄檢測過濾器 -->
<filter><filter-name>UserLoginFilter</filter-name><filter-class>net.tfgzs.demo.filter.UserLoginFilter</filter-class>
</filter>
<filter-mapping><filter-name>UserLoginFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>
<!--接口日志過濾器-->
<filter><filter-name>ApiLog</filter-name><filter-class>net.tfgzs.demo.filter.ApiLog</filter-class>
</filter>
<filter-mapping><filter-name>ApiLog</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

2、@WebFilter注解

注解里面沒有提供可以控制執行順序的參數,通過實踐發現如果想要控制filer的執行順序可以 通過控制filter的文件名的首字母來 來控制。

比如:

UserLoginFilter.java 和 ApiLog.java 這兩個文件里面分別是“用戶登錄檢查過濾器”和“接口日志過濾器”,因為這兩個文件的 首字母A排U之前 ,導致每次執行的時候都是先執行“接口日志過濾器”再執行“用戶登錄檢查過濾器”。

3.對比web.xml中沒有filter配置【強特征】

內存馬的Filter是動態注冊的,所以在web.xml中肯定沒有配置,這也是個可以的特征。但servlet 3.0引入了@WebFilter標簽方便開發這動態注冊Filter。這種情況也存在沒有在web.xml中顯式聲明,這個特征可以作為較強的特征。

4.特殊classloader加載【弱特征】

我們都知道Filter也是class,也是必定有特定的classloader加載。一般來說,正常的Filter都是由中間件的WebappClassLoader加載的。反序列化漏洞喜歡利用TemplatesImpl和bcel執行任意代碼。所以這些class往往就是以下這兩個:

  • com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl$TransletClassLoader

  • com.sun.org.apache.bcel.internal.util.ClassLoader

這個特征是一個特別可疑的點了。當然了,有的內存馬還是比較狡猾的,它會注入class到當前線程中,然后實例化注入內存馬。這個時候內存馬就有可能不是上面兩個classloader。

5.對應的classloader路徑下沒有class文件【強特征】

所謂內存馬就是代碼駐留內存中,本地無對應的class文件。所以我們只要檢測Filter對應的ClassLoader目錄下是否存在class文件。

private static boolean classFileIsExists(Class clazz){if(clazz == null){return false;}String className = clazz.getName();String classNamePath = className.replace(".", "/") + ".class";URL is = clazz.getClassLoader().getResource(classNamePath);if(is == null){return false;}else{return true;}
}

6.Filter的doFilter方法中有惡意代碼【強特征】

我們可以把內存中所有的Filter的class dump出來,使用fernflower等反編譯工具分析看看,是否存在惡意代碼,比如調用了如下可疑的方法:

  • java.lang.Runtime.getRuntime

  • defineClass

  • invoke

不難分析,內存馬的命門在于56。簡單說就是Filter型內存馬首先是一個Filter類,同時它在硬盤上沒有對應的class文件。若dump出的class還有惡意代碼,那是內存馬無疑。

0x04 內存馬的查殺

java-memshell-scanner

通過jsp腳本掃描并查殺各類中間件內存馬,比Java agent要溫和一些。

未注入內存馬之前:

img

注入內存馬后:

img

點擊kill,殺掉內存馬

img

再次訪問已經無法執行命令

img

tomcat有一個work目錄,里面存放了頁面的緩存,訪問的jsp都會編譯(從 work里進入Catalina后的如localhost站點文件夾下的項目,我們可以看到那些jsp頁面會被編譯成應該是servlet文件,下次再來 訪問時,就直接運行servlet類就可以向客戶端反應響應頁面了,所以有的博客說第一次訪問時會比較慢,是因為新發布上去的頁面在第一個人訪問時,會先 編譯成servlet文件,所以慢了,一旦編譯好,那么除非jsp頁面修改,不然下次訪問直接運行servlet就可以響應用戶,所以快),編譯后的文件都會存儲在work目錄下。而tomcat顯示的目錄,都會從這個緩存里找編譯后的jsp對應的class文件。所以當清空了work目錄后,該過程將會從新來過。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716024.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716024.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716024.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT6 libModbus 用于ModbusTcp客戶端讀寫服務端

雖然在以前的文章中多次描述過,那么本文使用開源庫libModbus,可得到更好的性能&#xff0c;也可移植到各種平臺。 性能&#xff1a;讀1次和寫1次約各用時2ms。 分別創建了讀和寫各1個連接指針&#xff0c;用于讀100個寄存器和寫100個寄存器&#xff0c;讀寫分離。 客戶端&am…

物聯網與智慧城市:科技驅動下的城市智能化升級之路

一、引言 隨著科技的不斷進步和城市化進程的加速&#xff0c;物聯網與智慧城市的結合已經成為推動城市智能化升級的關鍵力量。物聯網技術以其強大的連接和數據處理能力&#xff0c;為智慧城市的建設提供了無限可能。本文旨在探討物聯網如何助力智慧城市的構建&#xff0c;以及…

SLAM ORB-SLAM2(21)基礎矩陣的計算和評分

SLAM ORB-SLAM2&#xff08;21&#xff09;基礎矩陣的計算和評分 1. 前言2. 基礎矩陣2.1. 對級約束2.2. 推導2.3. 計算原理 3. ComputeF214. CheckFundamental 1. 前言 在 《SLAM ORB-SLAM2&#xff08;20&#xff09;查找基礎矩陣》 中了解到 查找基礎矩陣主要過程&#xff1…

web基礎03-JavaScript

目錄 一、JavaScript基礎 1.變量 2.輸出 3.變量提升 4.區塊 5.JavaScript數據類型 6.查看數值類型 7.undefined和null 8.布爾值 9.和的區別 10.算數/三元/比較/邏輯/賦值運算符 11.特殊字符 12.字符串 &#xff08;1&#xff09;獲取字符串長度 &#xff08;2&am…

備戰藍橋杯Day21 - 堆排序的內置模塊+topk問題

一、內置模塊 在python中&#xff0c;堆排序已經設置好了內置模塊&#xff0c;不想自己寫的話可以使用內置模塊&#xff0c;真的很方便&#xff0c;但是堆排序算法的底層邏輯最好還是要了解并掌握一下的。 使用heapq模塊的heapify()函數將列表轉換為堆&#xff0c;然后使用he…

41、網絡編程/TCP.UDP通信模型練習20240301

一、編寫基于TCP的客戶端實現以下功能&#xff1a; 通過鍵盤按鍵控制機械臂&#xff1a;w(紅色臂角度增大)s&#xff08;紅色臂角度減小&#xff09;d&#xff08;藍色臂角度增大&#xff09;a&#xff08;藍色臂角度減小&#xff09;按鍵控制機械臂 1.基于TCP服務器的機械臂…

Java 創建對象有哪幾種方式

1. 使用new關鍵字&#xff1a;這是最常見和最簡單的創建對象的方式。你可以通過這種方式調用任意的構造函數&#xff0c;無論是無參的還是有參數的構造函數。 例如&#xff1a; Student stu new Student 2. 使用Class類的newInstance方法&#xff08;反射&#xff09; 這種…

Python3零基礎教程之數學運算專題進階

大家好,我是千與編程,今天已經進入我們Python3的零基礎教程的第十節之數學運算專題進階。上一次的數學運算中我們介紹了簡單的基礎四則運算,加減乘除運算。當涉及到數學運算的 Python 3 刷題使用時,進階課程包含了許多重要的概念和技巧。下面是一個簡單的教程,涵蓋了一些常…

勒索軟件類型

勒索軟件類型 加密勒索軟件 它使個人文件和文件夾&#xff08;文檔、電子表格、圖片和視頻&#xff09;被加密。受感染的文件被加密后會被刪除&#xff0c;用戶通常會在當下無法使用的文件的文件夾中看到一個包含付款說明的文本文件。當您嘗試打開其中一個加密文件時,您才可能…

Tomcat負載均衡、動靜分離

目錄 引言 實驗圖解 1.實驗環境搭建 2.部署Nginx服務器及配置靜態頁面Web服務 3.部署Tomcat服務及配置動態頁面Web服務 4.實驗驗收 動態頁面 靜態頁面 引言 tomcat服務既可以處理動態頁面&#xff0c;也可以處理靜態頁面&#xff1b;但其處理靜態頁面的速度遠遠不如…

Oracle SQL優化概念之集群因子解析

導讀 本文介紹一個Oracle 數據庫SQL優化的一個基本概念【集群因子】&#xff0c;理解了此概念&#xff0c;有助于對Oracle數據庫進行SQL優化。 1. 集群因子名詞解析 集群因子&#xff08;ClusteringFactor&#xff09;是如果通過一個索引掃描一張表&#xff0c;需要訪問的表的數…

js優雅的統計字符串字符出現次數

題目如下 統計一串字符串中每個字符出現的頻率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白寫法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

鏈表基礎知識詳解(非常詳細簡單易懂)

概述&#xff1a; 鏈表作為 C 語言中一種基礎的數據結構&#xff0c;在平時寫程序的時候用的并不多&#xff0c;但在操作系統里面使用的非常多。不管是RTOS還是Linux等使用非常廣泛&#xff0c;所以必須要搞懂鏈表&#xff0c;鏈表分為單向鏈表和雙向鏈表&#xff0c;單向鏈表很…

【Vue3】解鎖Vue3黑科技:探索接口、泛型和自定義類型的前端奇跡

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

Android Compose - PlainTooltipBox(已廢棄)的替代方案

Android Compose - PlainTooltipBox 的替代方案 TooltipBox(positionProvider TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip {PlainTooltip {Text(/* tooltip content */)}},state rememberTooltipState(), ) {// tooltip anchorIconButton(onClick {…

跨站腳本攻擊xss-labs(1-20)靶機練手

目錄 一、跨站腳本攻擊&#xff08;XSS&#xff09; 1.1 漏洞簡介 1.2:類型 1.3 XSS危害 1.4XSS防御規則 二、環境搭建 三、xsst通關記錄 Level 1&#xff1a;文本解析為 HTML Level 2&#xff1a;htmlspecialchars;input 標簽 value 注入 定義和用法 字符過濾繞過 …

從零自制docker-1-【環境配置 docker go介紹與安裝】

文章目錄 docker簡介舉例docker安裝go語言go安裝go 配置 docker簡介 Docker可以看作是一種極其輕巧的“虛擬機”&#xff0c;它允許你將一個或多個程序及其運行環境打包在一起&#xff0c;形成一個標準化的單元&#xff0c;這個單元可以在任何支持Docker的系統上運行&#xff…

實用!IntelliJ IDEA離線開發使用要點(一)

如果IntelliJ IDEA在本地網絡之外沒有HTTP訪問&#xff0c;它將無法檢查更新和應用補丁。在這種情況下&#xff0c;您必須下載新版本的IDE并按照離線安裝中的描述手動安裝它們。 IDEA v2023.3正式版下載 注意&#xff1a;沒有互聯網接入&#xff0c;您不能安裝IntelliJ IDEA使…

SaaS 電商設計 (九) 動態化且易擴展的實現購物車底部彈層(附:一套普適的線上功能切量的發布方案)

目錄 一.背景1.1 業務背景1.2 技術負債 二.技術目標三.方案設計3.1 解決移動端頻繁發版3.1.1 場景分析3.1.2 技術方案 3.2 減少后端壞味道代碼&無法靈活擴展問題3.2.1 通過抽象接口完成各自單獨樓層渲染邏輯3.2.2 通過配置能力做到部分字段可配 四.升級上線(普適于高并發大…

2314576

? 通用計算機啟動過程 1??一個基礎固件&#xff1a;BIOS 一個基礎固件&#xff1a;BIOS→基本IO系統&#xff0c;它提供以下功能&#xff1a; 上電后自檢功能 Power-On Self-Test&#xff0c;即POST&#xff1a;上電后&#xff0c;識別硬件配置并對其進行自檢&#xff0c…