S2-052 RCE漏洞 初步分析

时间:2023-03-10 00:41:01
S2-052 RCE漏洞 初步分析

PS:初步分析,只是分析了Struts2 REST插件的部分,本来菜的抠脚不敢发,但看到各大中心发的也没比我高到哪里去,索性发出来做个记事!

漏洞描述

2017年9月5日,Apache Struts发布最新安全公告,Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。官网漏洞影响范围为Struts 2.5 - Struts 2.5.12,n1nty师傅说测了下2.3.x 的部分版本,也是受影响的。

Struts2 REST插件

Struts2是一个 MVC 框架,最初设计 Struts 2 时并没有按 REST 架构进行设计,因此 Struts 2 本质上并不是一个 REST 框架。由于 Struts 2 提供了良好的可扩展性,因此允许通过 REST 插件将其扩展成支持 REST 的框架。REST 插件的核心是 RestActionMapper,它负责将 Rails 风格的 URL 转换为传统请求的 URL。

RestActionMapper 对 HTTP 请求的处理

S2-052 RCE漏洞 初步分析

大家看到这种请求方式,又是struts写的,那么可以打打试试。。

Poc执行流程

下载了Struts 2.5.12的struts2-rest-showcase的源码,导到eclipse中运行起来,用公布的Poc进行测试:

S2-052 RCE漏洞 初步分析

分析执行流程

在Struts2 REST插件中 org.apache.struts2.rest.DefaultContentTypeHandlerManager.getHandlerForRequest(HttpServletRequest request)方法通过Request的contentType

获取对应处理的Handler

S2-052 RCE漏洞 初步分析

S2-052 RCE漏洞 初步分析

当我们的contentType为application/xml时使用org.apache.struts2.rest.handler.XStreamHandler处理请求。当Request的Content长度大于0时,调用XStreamHandler.toObject(Reader in, Object target)方法

S2-052 RCE漏洞 初步分析

S2-052 RCE漏洞 初步分析

经过fromXML方法后导致了恶意代码执行,后门跟XStream跟的头大,暂时先写这些,后面有时间再写中步分析!

contentType 对应的解释器

application/xml=org.apache.struts2.rest.handler.XStreamHandler@1b23b43a,
application/json=org.apache.struts2.rest.handler.JsonLibHandler@27e8b10f,
multipart/form-data=org.apache.struts2.rest.handler.MultipartFormDataHandler@2aac6a0,
application/x-www-form-urlencoded=org.apache.struts2.rest.handler.FormUrlEncodedHandler@77fc757f,
application/xhtml+xml=org.apache.struts2.rest.handler.HtmlHandler@71789dde

话说XStream出问题了,其他的Handler呢?

S2-052 RCE漏洞 初步分析