Quantcast
Channel: CodeSection,代码区,网络安全 - CodeSec
Viewing all articles
Browse latest Browse all 12749

【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

$
0
0
【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

2017-09-07 17:02:16

阅读:287次
点赞(0)
收藏
来源: 安全客





【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

作者:360天眼实验室





【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

0x00 漏洞介绍

Struts2 S2-052远程代码执行漏洞和以往的Struts2漏洞是不同的,S2-052利用的是Java反序列化漏洞,而不是臭名昭著的ognl。

本次漏洞触发点是REST插件在解析请求中的xml文件时,调用了XStreamHandler,传入的数据会被默认进行反序列化,如果当传入的xml是个经过XStream序列化的恶意对象时,便造成反序列化漏洞。


0x01 漏洞分析

本次漏洞的成因由两部分组成,一个是 Struts2 REST插件本身没有对进入的数据进行安全检查,导致攻击者可以传入恶意的xml对象可以传入到XStream里。另一个是XStream在反序列化传入的xml造成的远程代码执行。

关键代码在org.apache.struts2.rest.ContentTypeInterceptor里。

publicStringintercept(ActionInvocationinvocation)throwsException{ HttpServletRequestrequest=ServletActionContext.getRequest(); ContentTypeHandlerhandler=selector.getHandlerForRequest(request); Objecttarget=invocation.getAction(); if(targetinstanceofModelDriven){ target=((ModelDriven)target).getModel(); } if(request.getContentLength()>0){ InputStreamis=request.getInputStream(); InputStreamReaderreader=newInputStreamReader(is); handler.toObject(reader,target); } returninvocation.invoke(); }

问题出在以下两点

ContentTypeHandlerhandler=selector.getHandlerForRequest(request);

handler.toObject(reader,target);

Struts2的漏洞点本身没什么难度,这个漏洞出在漏洞利用方面。


0x02 利用分析

本次漏洞,最开始的poc生成是利用marshalsec工具生成ImageIO的远程代码序列化对象,这个poc适用的环境是java1.8以上,这是个非常苛刻的条件。

然而有没有在其他版本java的利用代码呢,答案是有的。因为漏洞的本质是反序列化漏洞,而反序列化工具ysoserial提供了大量的反序列化代码。通过查看marshalsec工具生成XStream的代码,发现利用下面代码再结合ysoserial工具的代码,即可生成更多的利用代码。

publicclassXStreamextendsMarshallerBase<String>implementsCommonsConfiguration,Rome,CommonsBeanutils,ServiceLoader,ImageIO, BindingEnumeration,LazySearchEnumeration,SpringAbstractBeanFactoryPointcutAdvisor,SpringPartiallyComparableAdvisorHolder,Resin,XBean{ @Override publicStringmarshal(Objecto)throwsException{ com.thoughtworks.xstream.XStreamxs=newcom.thoughtworks.xstream.XStream(); returnxs.toXML(o); } @Override publicObjectunmarshal(Stringdata)throwsException{ com.thoughtworks.xstream.XStreamxs=newcom.thoughtworks.xstream.XStream(); returnxs.fromXML(data); } @Override publicObjectmakeComparatorTrigger(Objecttgt,Comparator<?>cmp)throwsException{ returnJDKUtil.makePriorityQueue(tgt,cmp); } publicstaticvoidmain(String[]args){ newXStream().run(args); } }

利用commons.collections和XStream可以生成在java1.7环境下稳定利用的poc。


【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

利用中,执行的代码为:

touch/tmp/manning_s2_052
【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析

生成利用的代码暂不公开。

之前我在微博说利用可能达到11种,这个说法现在来看不准确,理论上marshalsec和ysoserial和SerialKillerBypassGadgetCollection的反序列化利用代码可以在本次的漏洞使用,因此本次漏洞的利用的变化是非常大的。


0x03 漏洞防御

由于漏洞利用变化极大,建议暂时关闭有REST插件的Struts2站点。


0x04 参考内容

https://0bin.net/paste/xI3qQXBnBFi+ZIC6#y151P6VdT9DXPOBqgQviWRECRnW6+gSuK+frvsnAfZy

http://bobao.360.cn/learning/detail/4372.html



【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析
【漏洞分析】360天眼实验室:Struts2 S2-052(CVE-2017-9805)远程代码执行漏洞分析
本文由 安全客 原创发布,如需转载请注明来源及本文地址。
本文地址:http://bobao.360.cn/learning/detail/4380.html

Viewing all articles
Browse latest Browse all 12749

Latest Images

Trending Articles





Latest Images