heapdump 攻击面利用

news2024/11/16 9:31:27

图片

点击上方蓝字关注我们

一、heapdump案例

1.1 项目中的分析

这个是项目中遇到的一个例子,发现了heapdump泄露,但没有找到可用session,当时就想着内存中应该是有账号密码的,于是就开始找了起来。

用OQL进行搜索,先找数据库密码,很好找,但由于是内网数据库没啥用。

然后无脑直接找session id,但没有找到

图片

观察数据包,发现使用了JWT认证,但搜索JWT开头字符串依旧没有结果

图片

图片

再仔细看了一下请求包,Cookie中的参数名为xxx_USER_Cookies,搜索该参数名但依旧搜索不到

select * from java.lang.String s where toString(s) like ".*_USER_Cookies.*"

图片

后面我又想到直接搜索类名即可得到对应字符串,所以我就直接去找java.lang.String类下面的内容

图片

但并没有找到什么东西,点击Shallow Heap和Retained Heap进行排序也没找到什么有用信息

图片

然后看着一系列的类名想起,java中并不是只有String,byte[]和char[]也可以转换为String,所以又去找byte[]和char[]的内容

图片

然后点击 Shallow Heap 按钮倒序排列,我发现了新天地

图片

PK开头的明显是压缩包,而其他的又很明显是HTTP请求包,于是我开始挨个右击->Copy->Save Value To File(注意,这里尽量不要直接复制值,因为1. 会有无法显示的字符导致看起来不够美观;2. 直接复制值仅能复制1024个字符,剩下的会被截断)

图片

保存完之后,再打开文件,某一个请求包中就有别人登录时使用的明文账号密码!!!(至于格式为什么是这样的就不清楚了)

图片

1.2 项目后的思考

1.2.1 为什么String不能倒序搜索,byte[]却可以?

做项目时,虽然找到了账号密码,但还有一些问题没有解决,想再测试一下。

简单了解了一下OQL和MAT,我们前面使用的直接搜索类的对象部分,其实是在各个对象的引用列表中穿梭查看。对于给定一个对象,通过MAT可以找到引用当前对象的对象,即入引用(Incomming References),以及当前对象引用的对象,即出引用(Outgoing References)。

图片

还记得类对象的排序吗?

  • byte[]可以按照Shallow Heap进行排序

  • java.lang.String不能按照Shallow Heap进行排序

图片

图片

这是为什么呢?浅堆(Shallow Heap)和深堆(Retained Heap)是两个非常重要的概念,它们分别表示一个对象结构所占用的内存大小和一个对象被GC回收后,可以真实释放的内存大小。

浅堆是指一个对象所消耗的内存。在32位系统中,一个对象引用会占据4个字节,一个int类型会占据4个字节,long型变量会占据8个字节,每个对象头需要占用8个字节。

下面是String对象的几个属性:

String
- value:char[]
- offset:int
- count:int
- hash:int

3个int值共占12字节,对象引用占用4字节,对象头8字节,合计24字节。浅堆的大小只与对象的结构有关,与对象的实际内容无关。也就是说,无论字符串的长度有多少,内容是什么,浅堆的大小始终是24字节。因此java.lang.String类无法使用浅堆倒序排列。

还有,当时只在byte[]中找到了HTTP请求包,String里面是不是也有未找到的HTTP请求包(可能是找的方法不对,HTTP请求包大小位于中间部分,排序无法找到)。

后面我又进行了尝试,发现在Outgoing References搜索结果的Class Name列,除了能搜索类名,也可以搜索字符串的正则表达式,因此直接搜索.*(GET|POST) /.*就能找到HTTP请求了

图片

图片

但是直接在这里搜索password关键字,还是无法直接找到可用的明文账号密码

1.2.2 可以使用OQL直接查询吗?

后面我又思考了一下,想尽量实现OQL直接搜索

# 直接搜索所有包含SESSION ID的请求
select * from byte[] s where toString(s) like ".*_USER_Cookies.*"

# 直接搜索GET和POST请求
select * from java.lang.String s where toString(s) like ".*(GET|POST) /.*"

图片

但是当我想搜索密码的时候,就很一言难尽了,只找到了我测试时的登录请求

select * from byte[] s where toString(s) like ".*password.*"

图片

最后发现是比较符like的问题,经过测试发现OQL的比较关键字仅能搜索前1024个字符,剩下的无法搜索到。而password正好在1024个之后,所以无法搜索到(实际测试过contains也不行)。OQL表达式仅找到了=likecontains比较关键字,找了一下也没找到字符串截断函数,所以无法使用这种方法搜索(当然,如果运气比较好password关键字在前1024个字符内,就能搜索到)

但我们其实可以换一种思路,根据登录请求包的URL特征进行搜索,搜索POST类型,包含login的字符串

select * from byte[] s where toString(s) like ".*login.*" and toString(s) like ".*POST.*"

虽然仅找到一条结果(还是有很多明文的登录账号密码没有找到),但是确实可以快速得到一个可用口令

图片

二、利用mat+OQL表达式进行分析

2.1 提取数据库账号密码

SpringBoot 1.x 2.x 都可以用(列举环境变量)

select * from org.springframework.web.context.support.StandardServletEnvironment

图片

图片

spring boot 1.x 版本 heapdump 查询结果,最终结果存储在java.util.Hashtable$Entry 实例的键值对中,所以也可以这样查询

select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("password"))

图片

spring boot 2.x 版本 heapdump 查询结果,最终结果存储在 java.util.LinkedHashMap$Entry 实例的键值对中,所以也可以这么查找

select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("password"))

图片

2.2 提取认证信息

2.2.1 jwt认证提取

如果使用JWT进行认证,可以使用如下命令进行搜索。原理:jwt认证字符串永远都是以eyJ进行开头,所以搜索以eyJ开头或包含的字符串即可

# 在java.lang.String类中搜索以eyJ开头的字符串
select * from java.lang.String s where s.toString().startsWith("eyJ")

# 除了String之外,也可以在byte[]、char[]中搜索包含eyJ的字符串
select * from byte[] s where s.toString().contains("eyJ")

图片

除此之外,也可以搜索JWT的密钥关键字进行搜索,找到密钥就等同于任意用户登录

# 区分大小写,jwt、JWT、Jwt都有可能;还有secret、key等关键字
select * from java.lang.String s where s.toString().contains("jwt")

图片

# 如果jwt设置在环境变量中,也可以使用寻找数据库密码的方式进行搜索
select * from org.springframework.web.context.support.StandardServletEnvironment
# spring boot 1.x
select * from java.util.Hashtable$Entry x WHERE (toString(x.key).contains("jwt"))
# spring boot 2.x
select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("jwt"))

图片

如果并未使用JWT相关库的话,可以先搜索到jwt相关关键字对应的类

select * from java.util.LinkedHashMap$Entry x WHERE (toString(x.key).contains("Jwt"))

图片

然后根据类名去搜索,找到对应的key

图片

2.2.2 一般session id提取

注意,搜索中的SESSION区分大小写

# 可在java.lang.String、byte[]、char[]中进行搜索
select * from java.lang.String s where toString(s) like ".*SESSION.*"

图片

当然如果Cookie中是自定义的session名,也需要去对应的进行搜索

2.2.3 提取明文账号密码

# 关键字匹配受限于1024字节,有可能找不到
select * from byte[] s where toString(s) like ".*password.*"
select * from char[] s where toString(s) like ".*password.*"
select * from java.lang.String s where toString(s) like ".*password.*"

# 关键词可以模糊搜索,注意是区分大小写的,大致有如下内容
password
user
name
code
vertify
vertification
phone
login
register

2.3 提取shiro key

点击Histogram按钮

图片

在ClassName处搜索CookieRememberMeManager,在搜索结果处右击->List objects->with outgoing references。

图片

然后点击decryptionCipherKey一行,左侧就会显示shiro key的值

图片

然后使用python小脚本转换一下即可

import base64,struct
base64.b64encode(struct.pack('<bbbbbbbbbbbbbbbb', -62,2,45,x,x,x,x,x,x,x,x,x,x,x,x,x))

除此之外,也可以用OQL进行查询

select * from org.apache.shiro.web.mgt.CookieRememberMeManager

图片

2.4 OQL其他搜索(用处不大)

提取内存中的文件路径

SELECT file.path.value.toString() FROM java.io.File file

图片

查看某个对象的具体内容

SELECT o FROM INSTANCEOF 0xa033b028 o

图片

按字符串长度进行搜索

SELECT * FROM byte[] s WHERE (s.toString().length() > 100)
SELECT * FROM java.lang.String s WHERE (s.toString().length() > 100)
select * from char[] s where s.@length > 100

图片

使用as retained set关键字可以得到所得对象的保留集

select as retained set * from java.lang.String s where s.value != null

图片

distinct来去除重复对象

SELECT DISTINCT s.value.toString() FROM java.lang.String s WHERE (s.toString() = "password")

原本可以查到15条password字符串

图片

去重之后只有一条

图片

三、利用工具进行分析

这里就简单的放几个heapdump分析工具,具体的使用就不说了,用起来挺简单的

https://github.com/wyzxxz/heapdump_tool

https://github.com/whwlsfb/JDumpSpider

https://github.com/wdahlenburg/pyhprof

四、参考链接

https://www.cnblogs.com/snowie/p/15561081.html

https://www.secpulse.com/archives/184037.html

https://www.cnblogs.com/icez/p/Actuator_heapdump_exploit.html

https://forum.butian.net/share/1032

https://blog.csdn.net/weixin_40418457/article/details/116323736

https://www.exploit-db.com/docs/50459

http://cr.openjdk.java.net/~sundar/8022483/webrev.01/raw_files/new/src/share/classes/com/sun/tools/hat/resources/oqlhelp.html#sizeof

https://docs.mendix.com/refguide/

https://blog.csdn.net/chengqiuming/article/details/120002225

https://www.cnblogs.com/kira2will/p/11312822.html

end

图片

灼剑(Tsojan)

安全团队

图片

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异地远程群晖NAS教程【cpolar内网穿透】

公网/外网访问群晖NAS&#xff0c;虽然品牌NAS都会有自带DDNS服务&#xff0c;但是公网IPV4很难申请&#xff0c;所以很多用户都会转战内网穿透。网上也有很多教程&#xff0c;比如frp…&#xff0c;但是需要有公网服务器支持来进行搭建&#xff0c;有一定的要求。 cpolar内网穿…

Graphviz安装教程

Graphviz安装教程 官网下载graphviz的安装包 &#xff0c;网址&#xff1a; https://graphviz.org/download/ 进入下面页面。此处我选择这个版本进行下载&#xff0c; 后面就是安装和配置环境变量问题 安装的时候记住安装路径(最好放到anaconda文件夹下&#xff0c;即**\An…

通讯录的实现(静态版本和动态版本和文件版本)

为什们要实现通讯录&#xff1f; 主要是为了让我们将结构体的知识&#xff0c;了解的更加深刻&#xff0c;将结构体应用一下&#xff0c;我们先将静态的通讯录实现&#xff0c;在进行改良&#xff0c;用动态内存的知识再将通讯录改造一边&#xff0c;将动态内容的知识也运用一…

C++ Reference: Standard C++ Library reference: C Library: cstring: strncat

C官网参考链接&#xff1a;https://cplusplus.com/reference/cstring/strncat/ 函数 <cstring> strncat char * strncat ( char * destination, const char * source, size_t num ); 从字符串中追加字符 将source的第一个num个字符追加到destination&#xff0c;并追加…

重型机床热误差补偿温度敏感测点的识别与优化选择

重型机床热误差补偿温度敏感测点的识别与优化选择 动机与主要贡献 ● 热误差预测的性能主要取决于预测模型的准确性和鲁棒性以及输入的温度变量 ● 在大型数控机床热误差补偿方案中&#xff0c;由于温度敏感点的结构和发热机理复杂&#xff0c;目前仍缺乏有效的温度敏感点识别…

java---贪心---区间分组(每日一道算法2022.10.28)

题目&#xff1a; 给定 N 个闭区间 [ai,bi]&#xff0c;请你将这些区间分成若干组&#xff0c;使得每组内部的区间两两之间&#xff08;包括端点&#xff09;没有交集&#xff0c;并使得组数尽可能小 输出最小组数 第一行包含整数 N&#xff0c;表示区间数 接下来 N 行&#x…

Redis篇(2)——main函数

众所周知&#xff0c;redis是C语言写的。那么main函数来一波 int main(int argc, char **argv) {struct timeval tv;int j;//运行测试方法 #ifdef REDIS_TESTif (argc 3 && !strcasecmp(argv[1], "test")) {if (!strcasecmp(argv[2], "ziplist")…

SpringBoot

SpringBoot项目搭建方式1项目搭建方式2SpringBoot文件配置application.propertiesapplication.ymlSpringBoot整合MybatisSpringBoot整合logbackSpringBoot整合pageHelperSpringBoot整合DruidSpringBoot整合FreeMarkerFreeMarker常用指令(遍历List集合)FreeMarker遍历Map集合Spr…

【树莓派不吃灰】Linux系统下必知必会的一些命令

目录1. 前言2. 必知必会命令2.1 ls -al 列出当前目录下的文件2.2 cd 改变目录2.3 pwd 输出当前目录2.4 clear 清屏命令2.5 mkdir 新建目录2.6 rmdir 删除目录2.7 cat 显示或连接文件内容2.8 touch 创建文件 & cat > 创建文件2.9 rm 删除文件2.10 mv 移动/重命名文件/目录…

【小程序开发】事件监听 | 类型划分 | 属性分析

&#x1f373;作者&#xff1a;贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛\color{#FF0000}{贤蛋 大眼萌 &#xff0c;一名很普通但不想普通的程序媛}贤蛋大眼萌&#xff0c;一名很普通但不想普通的程序媛&#x1f933; &#x1f64a;语录&#xff1a;多一些不为什么的…

基于SSM实现前后端分离在线考试管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;BS-XX-…

[kafka]二.优化(如何保证不丢数据,且不重复[一次且仅一次])

二.优化 1.不丢失数据ack-1 当Producer向Leader发送消息时&#xff0c;可以通过ack的值来设置可靠性级别。 1&#xff09;1&#xff08;默认&#xff09; 意味着ISR中的Leader已成功收到消息并且Producer得到Leader收到消息的确认。如果ISR中的副本数还没有来得及拉取数据就…

Linux 进程替换深剖

目录传统艺能&#x1f60e;概念&#x1f914;细则&#x1f914;原理&#x1f914;exec 函数&#x1f914;execl&#x1f60b;execlp&#x1f60b;execle&#x1f60b;execv&#x1f60b;execvp&#x1f60b;execve&#x1f60b;实现简易 shell&#x1f914;传统艺能&#x1f60…

【python】之常用类型(包括进制)之间的转换

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 特别标注&#xff1a;仅为自己的学习记录笔记&#xff0c;方便复习和加深记忆&#xff0c;仅供借鉴参考&#xff01; 目录 一、字符和整数之间的转换 1.整数转字符 chr(x) 2.字符转整数 ord(x) 二、…

Git操作复习笔记

Git操作复习笔记一、git基础1.1 安装1.2 简单的命令1.2.1 基本工作流程1.2.3 git使用前配置1.2.4 git提交步骤1.2.5 恢复记录1.2.6 撤销二、git分支操作2.1 分支细分2.2 分支命令2.3 暂时保存更改三、github操作3.1 多人协作开发的流程3.2 创建远程仓库3.3 远程仓库克隆到本地仓…

【K8S系列】Kubernetes的网络模型

目录 一、k8s的三种网络 二、service网络 2.1 netfilter 2.2 iptables 2.3 clustip 一、k8s的三种网络 Node Network: 与外部网络接口 Service Network&#xff1a; ipvs规则当中的网络、路由提供调度 Pod Network&#xff1a; 节点当中pod的内部网络无法与外界通信 其中&…

【python初学者日记】selenium初体验——“秒杀商品”、“清空购物车”技能养成记(一)

【python初学者日记】selenium初体验——“秒杀商品”、“清空购物车”技能养成记&#xff08;一&#xff09;用python解决“清空购物车”、“秒杀商品”问题合集&#xff1a;1、Mac版在pycharm和终端上使用pip显示&#xff1a;pip: command not found Mac2、Mac版在pycharm中*…

毛球修剪器方案开发的工作原理和构成

本文介绍了毛球修剪器方案开发的工作原理&#xff1b;不管是羊毛衫、兔子衫还是普通纤维衫&#xff0c;时间一长都不可避免地会有很多毛球。它看起来脏又乱&#xff0c;穿起来特别不雅观。用除毛器剃毛球可以轻松去除毛衣的原始绒毛&#xff0c;而毛衣将失去其原有的保暖性。 原…

HTML登录页面

第一步:构建HTML框架 简介&#xff1a;本文用最通俗的语言&#xff0c;一步步教会大家CSS构建登录页面。 首先构建HTML框架&#xff0c;包含用户名&#xff0c;密码&#xff0c;记住密码&#xff0c;注册这几个功能。 如果大家HTML不牢固&#xff0c;请看我的这篇博客:https:/…

【数据结构】线性表之顺序表详解

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《数据结构》 &#x1f466;个人简介&#xff1a;一名双非研究生的编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; 顺…