shiro 1.2.4反序列化漏洞分析

  1. 环境搭建
  2. 漏洞分析
  3. 参考

官方issue:
https://issues.apache.org/jira/browse/SHIRO-550

环境搭建

首先下载有漏洞版本的shiro

1
https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4

解压后进入simple/web目录,修改其中的pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<!-- 这里需要将jstl设置为1.2 -->
<version>1.2</version>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<!-- 加入我们的漏洞组件 -->
<artifactId>commons-collections4</artifactId>
<version>4.0</version>
</dependency>
<dependencies>

然后再pom.xml下运行 mvn install 命令进行打包,在target目录下会生成 samples-web-1.2.4.war

将我们的war包放在tomcat目录下,启动tomcat,访问地址:

环境搭建成go0o0ong

漏洞分析

整个漏洞点如下:
cookie -> base64解码 -> AES解密 -> 反序列化

首先来看看我们的cookie,登陆之后抓包,获取rememberMe

1
rememberMe=0DOaI2x90RcR5SP6rCnGX1cT2ZUVv4Mq2iH3/6ZNvUuZkWDgPvsvJ5nTlO69Z3u2X6Wtb+7a7B+D0D9KILfHdtQHro9fUqiWtjkUeP2Y8ca7nbY9JPCcaEBkExk8+thVsa2DCCL9NpL+WQTxGz/UXSpevdEIU4RKmO98G5qEgI0vIaAbtLwb1FLuIm2x2JBqmqV+LEpE/Ag4mEhP99lfHhPIMK5ZLt1z7F9iFv2XKLU4tdx7LDqQwcEpNgIny5EfplmnUWUoJQoR7hOjaa0FDILqz6AXbKw5CqymWQho4TAsnYrnBpAw5iBNLB9b5Z7zux8wSFsbc8atLBAG16qiepj0mIf4GeNMoSMWJTEVYu9gdkJxeKkgXACa8L8M73a1lcH2OD1ye8N9i6fi6T/Te+VeJjB1+wknwMzvO/v4M+L+JZ6A0GXx0V6Z60U2E/7Tdytz2EJoLwzXnzstjAHZOL2OXLF9gGxN+kfRom7iTOci6eytPaP9OsPomLEMxrDs

这个应该是base64加密后的内容,利用python解密以二进制的格式进行保存,代码如下:

1
2
3
4
5
6
7
8
import base64

b4 = "0DOaI2x90RcR5SP6rCnGX1cT2ZUVv4Mq2iH3/6ZNvUuZkWDgPvsvJ5nTlO69Z3u2X6Wtb+7a7B+D0D9KILfHdtQHro9fUqiWtjkUeP2Y8ca7nbY9JPCcaEBkExk8+thVsa2DCCL9NpL+WQTxGz/UXSpevdEIU4RKmO98G5qEgI0vIaAbtLwb1FLuIm2x2JBqmqV+LEpE/Ag4mEhP99lfHhPIMK5ZLt1z7F9iFv2XKLU4tdx7LDqQwcEpNgIny5EfplmnUWUoJQoR7hOjaa0FDILqz6AXbKw5CqymWQho4TAsnYrnBpAw5iBNLB9b5Z7zux8wSFsbc8atLBAG16qiepj0mIf4GeNMoSMWJTEVYu9gdkJxeKkgXACa8L8M73a1lcH2OD1ye8N9i6fi6T/Te+VeJjB1+wknwMzvO/v4M+L+JZ6A0GXx0V6Z60U2E/7Tdytz2EJoLwzXnzstjAHZOL2OXLF9gGxN+kfRom7iTOci6eytPaP9OsPomLEMxrDs"

temp = base64.b64decode(b4)

with open("rem.bin","w+") as f:
f.write(temp)


我们查看二进制内容,并没有发现反序列化的特征,由于漏洞中出现了AES加密,这里猜测应该要进行解密才能看见,跟进代码。我们需要找到AES的加密方式(mode),加密的秘钥(key)以及加密的向量(iv)

官方文档里有写问题类为CookieRememberMeManager:
https://issues.apache.org/jira/browse/SHIRO-550

其中有一个getRememberedSerializedIdentity方法,看起来和我们的RememberMe以及反序列化都有关系,我们在这个函数下断点


成功截断,继续跟踪代码,依然还是这个方法中,我们看到将我们requests中的RememberMe赋值给了base64字符串,然后将这个字符串进行解码,解码之后变成了byte格式。

继续跟踪代码,来到了getRememberedPrincipals函数,调用了convertBytesToPrincipals函数,继续跟进

跟进decrypt

跟进getDecryptionCipherKey,会返回decryptionCipherKey,其实这里就等于DEFAULT_CIPHER_KEY_BYTES,也就是我们一直寻找的秘钥


这里的秘钥为:kPH+bIxk5D2deZiIxcaaaA==

我们回到decrypt函数

这里我们可以看见我们的向量(iv)为16字节,并且内容为RememberMe通过base64解密后的前16位,后面即为我们的反序列化内容

继续跟进来到JcaCipherService的crypt方法,调用initNewCipher,跟进

我们看到这里的加密方式为CBC,至此我们解密所需的内容全部收集完毕,我们可以写脚本来进行测试。


这里尝试解密rememberMe,base64解码之后用网上的脚本进行AES解密一直不成功,折腾了好几天一直报错,后来想着可能吧解密的内容写入文件再读取可能有问题,后来改了下网上的脚本,直接base64解码进行AES解码,这样就不报错了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# pip install pycrypto
import sys
import base64
from Crypto.Cipher import AES
def decode_rememberme_file():
key = "kPH+bIxk5D2deZiIxcaaaA=="
mode = AES.MODE_CBC
IV = b' ' * 16
encryptor = AES.new(base64.b64decode(key), mode, IV=IV)
rem = "0DOaI2x90RcR5SP6rCnGX1cT2ZUVv4Mq2iH3/6ZNvUuZkWDgPvsvJ5nTlO69Z3u2X6Wtb+7a7B+D0D9KILfHdtQHro9fUqiWtjkUeP2Y8ca7nbY9JPCcaEBkExk8+thVsa2DCCL9NpL+WQTxGz/UXSpevdEIU4RKmO98G5qEgI0vIaAbtLwb1FLuIm2x2JBqmqV+LEpE/Ag4mEhP99lfHhPIMK5ZLt1z7F9iFv2XKLU4tdx7LDqQwcEpNgIny5EfplmnUWUoJQoR7hOjaa0FDILqz6AXbKw5CqymWQho4TAsnYrnBpAw5iBNLB9b5Z7zux8wSFsbc8atLBAG16qiepj0mIf4GeNMoSMWJTEVYu9gdkJxeKkgXACa8L8M73a1lcH2OD1ye8N9i6fi6T/Te+VeJjB1+wknwMzvO/v4M+L+JZ6A0GXx0V6Z60U2E/7Tdytz2EJoLwzXnzstjAHZOL2OXLF9gGxN+kfRom7iTOci6eytPaP9OsPomLEMxrDs"
b_rem = base64.b64decode(rem);
print(b_rem)
remember_bin = encryptor.decrypt(b_rem)
return remember_bin

if __name__ == '__main__':
with open("decrypt.bin", 'wb+') as fpw:
fpw.write(decode_rememberme_file())

写入文件读取报错如下:

1
ValueError: Data must be padded to 16 byte boundary in CBC mode

然后在linux下利用hexdump查看文件内容,发现我们反序列化的特征啦:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
00000000  06 77 dd c9 34 6e 00 17  77 18 a4 48 82 18 cf ee  |.w..4n..w..H....|
00000010 ac ed 00 05 73 72 00 32 6f 72 67 2e 61 70 61 63 |....sr.2org.apac|
00000020 68 65 2e 73 68 69 72 6f 2e 73 75 62 6a 65 63 74 |he.shiro.subject|
00000030 2e 53 69 6d 70 6c 65 50 72 69 6e 63 69 70 61 6c |.SimplePrincipal|
00000040 43 6f 6c 6c 65 63 74 69 6f 6e a8 7f 58 25 c6 a3 |Collection..X%..|
00000050 08 4a 03 00 01 4c 00 0f 72 65 61 6c 6d 50 72 69 |.J...L..realmPri|
00000060 6e 63 69 70 61 6c 73 74 00 0f 4c 6a 61 76 61 2f |ncipalst..Ljava/|
00000070 75 74 69 6c 2f 4d 61 70 3b 78 70 73 72 00 17 6a |util/Map;xpsr..j|
00000080 61 76 61 2e 75 74 69 6c 2e 4c 69 6e 6b 65 64 48 |ava.util.LinkedH|
00000090 61 73 68 4d 61 70 34 c0 4e 5c 10 6c c0 fb 02 00 |ashMap4.N\.l....|
000000a0 01 5a 00 0b 61 63 63 65 73 73 4f 72 64 65 72 78 |.Z..accessOrderx|
000000b0 72 00 11 6a 61 76 61 2e 75 74 69 6c 2e 48 61 73 |r..java.util.Has|
000000c0 68 4d 61 70 05 07 da c1 c3 16 60 d1 03 00 02 46 |hMap......`....F|
000000d0 00 0a 6c 6f 61 64 46 61 63 74 6f 72 49 00 09 74 |..loadFactorI..t|
000000e0 68 72 65 73 68 6f 6c 64 78 70 3f 40 00 00 00 00 |hresholdxp?@....|
000000f0 00 0c 77 08 00 00 00 10 00 00 00 01 74 00 08 69 |..w.........t..i|
00000100 6e 69 52 65 61 6c 6d 73 72 00 17 6a 61 76 61 2e |niRealmsr..java.|
00000110 75 74 69 6c 2e 4c 69 6e 6b 65 64 48 61 73 68 53 |util.LinkedHashS|
00000120 65 74 d8 6c d7 5a 95 dd 2a 1e 02 00 00 78 72 00 |et.l.Z..*....xr.|
00000130 11 6a 61 76 61 2e 75 74 69 6c 2e 48 61 73 68 53 |.java.util.HashS|
00000140 65 74 ba 44 85 95 96 b8 b7 34 03 00 00 78 70 77 |et.D.....4...xpw|
00000150 0c 00 00 00 10 3f 40 00 00 00 00 00 01 74 00 04 |.....?@......t..|
00000160 72 6f 6f 74 78 78 00 77 01 01 71 00 7e 00 05 78 |rootxx.w..q.~..x|
00000170 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 |................|
00000180

继续跟踪先前的代码,会来到convertBytesToPrincipals函数

跟进deserialize函数,找到我们的漏洞点:

蛮好的哈~

参考

SHIRO-550 反序列化漏洞分析

【漏洞分析】Shiro RememberMe 1.2.4 反序列化导致的命令执行漏洞


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 sher10cksec@foxmail.com

文章标题:shiro 1.2.4反序列化漏洞分析

本文作者:sher10ck

发布时间:2020-08-02, 17:36:45

最后更新:2020-08-10, 22:24:12

原始链接:http://sherlocz.github.io/2020/08/02/shiro-1-2-4反序列化漏洞分析/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录