heapdump深度利用之信息泄露篇
前言
在Java里有一些渗透场景可以获得堆内存也即是heapdump比如有的应用存在某个功能可以获取heapdump、springboot的/actuator/heapdump也可以获取。但是网上比较多的分析文章讲的都比较浅导致挺多人不知道heapdump里到底有什么东西,这篇文章讲一讲对heapdump进行深入分析获取某些特定信息。
常规信息获取
先讲一下大多数人的分析方式。最早的时候大家都是使用MAT、jhat、jvisualvm然后使用oql语句去查询字符串里的敏感信息。我当时刚接触的时候对这个的分析文章比较少我记得最早讲的比较清楚的文章是下面这篇
https://zen-sec.github.io/fr/java-heapdump-extraction/
这个时期的oql语句主要集中在查询配置信息,以及内存中可能存在的user|pass|email|oss|aksk|jwt|shiro-key等信息后来有人写了自动化的分析工具主要是下面两款
https://github.com/wyzxxz/heapdump_tool
https://github.com/whwlsfb/JDumpSpider
距离工具发布到现在已经有好几年的时间了,然后我发现很多朋友好像已经不会使用oql语句自定义查询信息了,都是使用这两款工具执行一下就结束然后这两款工具有的时候输出没什么敏感的东西就直接结束了不再进行深度利用,我将在下面写一下这两款工具没有覆盖的一些信息获取方式。
深度信息获取
假设我们利用上述两款工具没有获取到什么有用信息还可以使用下面的方式进行利用,这里仅列举出一些案例有其他感兴趣的东西可以自己构造语句查询。使用MAT打开heapdump,主要现在MAT的主要版本需要使用jdk17+才能使用,我jdk环境默认1.8可以使用命令行vm参数指定一个jdk17路径打开
MemoryAnalyzer.exe -vm "C:\Users\admin\.jdks\jbr-17.0.12\bin\javaw.exe"

从这里打开你下载的heapdump然后点击下面图标进行oql查询

查询依赖版本
我们首先可以查看这个应用有什么依赖以及他们具体是什么版本,直接从字符串中搜索DISTINCT用于去重(也可通过类加载器查询)。
SELECT DISTINCT toString(s) FROM java.lang.String s WHERE (toString(s) LIKE "file.*\.jar!/")

比如这里发现fastjson依赖在漏洞范围内即可尝试fastjson漏洞。
查询session
这里以springboot默认容器为例tomcat默认的session储存在org.apache.catalina.session.StandardSession中所以可以写出如下oql语句
SELECT * FROM org.apache.catalina.session.StandardSession

我这里因为这个网站好像是被很多人扫描了导致尝试了大量无效session总计有1w+,所以需要想办法排除掉一些无效session这种无效session的尝试大多数是扫描器直接访问一个路由然后返回包就会返回一个session这种的话比较好筛选。我们可以注意点每个session实例里都储存了以下信息

根据上面的分析我们可以加一个判断(s.lastAccessedTime - s.creationTime) > 6000也就是最后访问时间需要大于创建时间6秒钟我们即认为是有效session。但是这还不足以判断session是否被设置了访问权限。一般登陆成功后都会使用setAttribute往session里设置属性加上一些其他判断我们可以写出如下oql语句直接获取有效的sessionid
SELECT s.id.toString() FROM org.apache.catalina.session.StandardSession s WHERE ((s.isValid = true) and (s.attributes != null) and ((s.lastAccessedTime - s.creationTime) > 6000))

有的session属性里甚至会直接存放账号密码

查询http数据包
上面我们查询到了session但是有很多时候并不是使用默认的session鉴权,所有可以获取http数据作为补充。我们知道springboot默认使用tomcat作为容器,经过代码分析已经查阅资料可知可以通过org.apache.coyote.http11.Http11InputBuffer和org.apache.tomcat.util.net.SocketBufferHandler分别获取我们heapdump期间或之前尚未处理完的http数据包。
获取请求包
SELECT h.byteBuffer.hb.toString() FROM org.apache.coyote.http11.Http11InputBuffer h

先全选然后右键COPY->Selection即可复制所有数据

获取响应包,最开始以为会记录在Http11OutputBuffer里面经过分析发现Http11OutputBuffer里只记录返回包header数据,完整数据记录需要使用下面的语句查询
SELECT rp.writeBuffer.hb.toString() FROM org.apache.tomcat.util.net.SocketBufferHandler rp

获取某些http缓存数据段
SELECT DISTINCT bc.buff.toString() FROM org.apache.tomcat.util.buf.ByteChunk bc WHERE (bc.buff != null)
注意这里的数据不和请求包完全重叠,有可能记录一些更早的请求数据.比如这里直接获取了登陆的user、pass从请求包那里查询是没获取到的

查询springboot路由信息
根据之前分析springboot的经验可知路由信息储存在org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#mappingRegistry中我们使用oql语句查询它的实例
SELECT * FROM org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry
成功找到路由信息

注意到他最后都储存在java.util.LinkedHashMap$Entry所以我们可以直接使用下面语句获取所有路由
SELECT key.toString() FROM java.util.LinkedHashMap$Entry entry WHERE (key.toString() LIKE "/.*")

也可通过MappingRegistration获取路由对应的方法

可以注意到这里已经获取路由对应的方法了且包含参数个数以及参数类型,还差获取参数名研究了一下发现有的情况是可以获取到参数名的。需要之前触发过这个路由,且缓存信息没被删除。
select * from org.springframework.web.method.support.HandlerMethodArgumentResolverComposite

总结
本文介绍了Java heapdump的深度分析方法。除了使用常规的自动化工具获取基础敏感信息外,还可以通过自定义OQL语句进行更深入的信息挖掘。这些方法能够在常规工具无法发现敏感信息时,提供更深层次的数据挖掘能力,帮助渗透测试人员获取更多有价值的信息,如登录凭据、API接口、会话数据等。掌握这些技巧可以大大提升heapdump文件的利用价值。
heapdump深度利用之信息泄露篇的更多相关文章
- 黑客攻防技术宝典web实战篇:利用信息泄露习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 当探查 SQL 注入漏洞时,如果请求以下 URL:https://wahh-app.com ...
- MS10-070 ASP.NET Padding Oracle信息泄露漏洞项目测试
MS10-070 ASP.NET Padding Oracle信息泄露漏洞1 漏洞描述:ASP.NET由于加密填充验证过程中处理错误不当,导致存在一个信息披露漏洞.成功利用此漏洞的攻击 ...
- 读耗子叔的《从Equifax信息泄露看数据安全》
本文永久地址:https://www.cnblogs.com/erbiao/p/9214219.html 最近正好看到耗子叔<从Equifax信息泄露看数据安全>这篇文章,就来说一下这篇文 ...
- CTFHub Web题学习笔记(Web前置技能+信息泄露题解writeup)
今天CTFHub正式上线了,https://www.ctfhub.com/#/index,之前有看到这个平台,不过没在上面做题,技能树还是很新颖的,不足的是有的方向的题目还没有题目,CTF比赛时间显示 ...
- WordPress Backdoor未授权访问漏洞和信息泄露漏洞
漏洞名称: WordPress Backdoor未授权访问漏洞和信息泄露漏洞 CNNVD编号: CNNVD-201312-497 发布时间: 2013-12-27 更新时间: 2013-12-27 危 ...
- Linux kernel 内存泄露本地信息泄露漏洞
漏洞名称: Linux kernel 内存泄露本地信息泄露漏洞 CNNVD编号: CNNVD-201311-467 发布时间: 2013-12-06 更新时间: 2013-12-06 危害等级: ...
- Linux Kernel ‘/net/socket.c’本地信息泄露漏洞
漏洞名称: Linux Kernel ‘/net/socket.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201312-037 发布时间: 2013-12-04 更新时间: 2013-12- ...
- Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞
漏洞名称: Linux Kernel ‘mp_get_count()’函数本地信息泄露漏洞 CNNVD编号: CNNVD-201311-054 发布时间: 2013-11-06 更新时间: 2013- ...
- Linux Kernel ‘/bcm/Bcmchar.c’本地信息泄露漏洞
漏洞名称: Linux Kernel ‘/bcm/Bcmchar.c’本地信息泄露漏洞 CNNVD编号: CNNVD-201311-053 发布时间: 2013-11-06 更新时间: 2013-11 ...
- Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞(CVE-2013-4350)
漏洞版本: Linux kernel 漏洞描述: BUGTRAQ ID: 62405 CVE(CAN) ID: CVE-2013-4350 Linux Kernel是Linux操作系统的内核. Lin ...
随机推荐
- 从基础到高级,带你结合案例深入学习curl命令
目录 简介 发送get请求 显示通信过程-v 模仿浏览器 -A 发送 Cookie -b 获取cookie -c 伪造来源页面 -e 构造GET请求查询字符串 -G 添加HTTP请求头 -H 显示头信 ...
- java等比压缩图片工具类
工具类 package com.chinaums.abp.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt. ...
- 「Log」2023.8.11 小记
序幕 从今天开始记小记. 七点到校了,先小摆一会,然后整理博客. 听 MiTiS 的电音,开始写题. \(\color{blueviolet}{P1829\ [国家集训队]\ Crash的数字表格\ ...
- joomla4/5设置媒体管理可以上传word/pdf/zip/excel文档
在默认情况下,如果需要在joomla媒体管理上传word,excel,zip文档会提示不支持的文件类型如图: 解决方案 我们需要进行设置.点击媒体组件右上角的选项按钮,进入到设置页面. 在设置页面里设 ...
- stylus - 新生代CSS预处理框架
stylus是什么 Stylus 是一种 CSS 预处理器,它扩展了 CSS 的功能,使得编写样式变得更简洁和高效.Stylus 允许使用嵌套.变量.混入等编程功能,这些功能可以极大地提高开发效率和代 ...
- 防抖ref如何在vue中被定义
本文由 ChatMoney团队出品 为什么ref要实现防抖 在vue的开发过程中,我们通常会使用到ref,但在我们需要对一个频繁的赋值操作做防抖操作时,我们通常只能通过编写一个独立的防抖函数来实现,这 ...
- GAMES101作业1
声明:使用的是vs2022版,以下内容如有问题,感谢各位大佬指正! 作业要求: 作业目的:模拟一个基于 CPU 的光栅化渲染器的简化版本 我们需要做的: 在main.cpp中修改 Eigen::Mat ...
- Google Cloud Function函数访问AWS的Redis服务(一)
很久很久以前,几家的redis可以通过设置白名单ip,公开访问redis服务.现在所有的redis都进行了隔离,无法相互访问. 我在aws上有台redis服务.现在我希望Google Cloud Fu ...
- 2021成都.NET开发者Connect线下活动
2021年4月11日,在成都市天府新区南湖公园,2021成都.NET开发者Connect线下活动圆满结束,来自成都地区东南西北的25位.NETer汇聚一堂,面基交流,吃饭畅聊,并进行了合影留念. 首先 ...
- vue中如何使用prismjs
安装 yarn add prismjs 基本使用 <template> <code v-html="Prism.highlight(myJsonStr, Prism.lan ...