利用JEP290白名单内的类,覆盖掉registerRefs(此时未建立JRMP连接)
Registry 处理bind请求,最后会触发DGC逻辑,DGC向registerRefs里保存的Server发送dirty请求
DGC底层使用的是StreamRemoteCall.executeCall进行io的传输,executeCall发送完之后,会根据对方的反馈进行不同的操作,当对方返回一定条件时(初步判断是对方RMI Exception),会直接序列化InputStream,造成反序列化漏洞
其中步骤2类似《RMI1》中提到的Client攻击Registry的思路,步骤3与 Registry攻击Client手法类似
之前一直简单以为是Vuln Registry充当了Vuln Server的角色,走的是Evil Registry Attack Vuln Server的角色,其实并不是。纸上得来终觉浅啊
Server发起bind(name,EvilObj)请求
Vuln Registry接受到请求,RegistryImpl_Skel处理该请求
RegistryImpl_Skel反序列化obj,在JEP290白名单内,功能为触发JRMP连接,连接Evil Registry(对应上图步骤1)(纠正,其实并未建立连接,仅覆盖registerRefs)
Vuln Registry底层ConnectionInputStream,负责管理维护连接,有一个表registerRefs,维护当前的client连接记录,因为反序列化EvilObj,被覆盖成了Evil Registry的JRMP连接信息
Vuln Registry准备结束掉 Server发起bind请求,调用releaseInputStream(对应上图步骤2),准备通知DGC开始介入监控这个EvilObj的生命周期。
Registry DGC初始化监控远程对象时,DGCImpl_Stub会发送一个dirty请求给Server,Server信息保存在registerRefs内。但是此时的Server已经被替换为Evil Registry。
DGCImpl_Stub发送dirty请求给Evil Registry,最终是用的是StreamRemoteCall.executeCall来执行(对应步骤3)。《RMI1》中Client攻击Registry时有提到StreamRemoteCall.executeCall的问题,发送完之后会根据对方返回进行下一步操作,case2会直接反序列化InputStream
Evil Registry接受到Client 的DGC dirty call,发送反馈payload,被Vuln Registry接受,进入case2逻辑触发反序列化boom💣(对应步骤4)
针对RMI服务的九重攻击 - 下
[2]
一次攻击内网rmi服务的深思
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true