JNDI高版本新思路利用LDAP
遇到高版本java,但是目标又只能打JNDI,实战中10个jndi,8个都是这种情况,因为jdk版本限制得太死了,不过好在我们有绕过的手法
目前就两个
RMI打本地工厂类
LDAP 高版本一直以来都是打的返回反序列化数据
LDAP+JNDI 介绍
漏洞复现
首先我们需要熟悉利用 LDAP 协议的一个基础流程
我们看看低版本是如何利用的
可以使用 java 代码构建一个 ldap 服务
当然为了更方便,我们可以使用工具来起一个 ldap 的服务
弹出计算器
服务端发送我们的恶意代码
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
遇到高版本java,但是目标又只能打JNDI,实战中10个jndi,8个都是这种情况,因为jdk版本限制得太死了,不过好在我们有绕过的手法
目前就两个
RMI打本地工厂类
LDAP 高版本一直以来都是打的返回反序列化数据
LDAP+JNDI 介绍
漏洞复现
首先我们需要熟悉利用 LDAP 协议的一个基础流程
我们看看低版本是如何利用的
可以使用 java 代码构建一个 ldap 服务
当然为了更方便,我们可以使用工具来起一个 ldap 的服务
弹出计算器
服务端发送我们的恶意代码
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
👍1
高版本绕过
我们将不能再加载远程类,这时我们又该如何利用呢
在关键步骤中
核心的数据都是源于 obj 对象,而我们的 obj 对象如下获取的,我们跟踪 decodeObject 方法,看看是否可以破局
这里主要说打本地工厂类
一共有三种类型
而第一个就是我们的以前 ldap 返回反序列化数据的打法
看到decodeRmiObject
跟进这个方法
返回了一个 Reference 对象,传入的是 classname 和 addr
然后来到 c_lookup 的
跟进,其实也就是我们 jndi 的 sink 点
首先判断我们的 obj 是不是 Reference 类型,如果是就看有没有工厂类,如果没有就看有没有远程的地址,这里我们是可以控制的,所以可以打一个低版本的 jndi 注入
看到decodeReference
这个没有!VersionHelper.isSerialDataAllowed()的限制
这里我们可以传入 Attributes attrs
可以看到依次从我们的 attrs 获取工厂类那些属性
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
我们将不能再加载远程类,这时我们又该如何利用呢
在关键步骤中
核心的数据都是源于 obj 对象,而我们的 obj 对象如下获取的,我们跟踪 decodeObject 方法,看看是否可以破局
这里主要说打本地工厂类
一共有三种类型
而第一个就是我们的以前 ldap 返回反序列化数据的打法
看到decodeRmiObject
跟进这个方法
返回了一个 Reference 对象,传入的是 classname 和 addr
然后来到 c_lookup 的
跟进,其实也就是我们 jndi 的 sink 点
首先判断我们的 obj 是不是 Reference 类型,如果是就看有没有工厂类,如果没有就看有没有远程的地址,这里我们是可以控制的,所以可以打一个低版本的 jndi 注入
看到decodeReference
这个没有!VersionHelper.isSerialDataAllowed()的限制
这里我们可以传入 Attributes attrs
可以看到依次从我们的 attrs 获取工厂类那些属性
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1
记一次实战因网络架构引发的源码审计
初略看了下项目,目标系统为一个典型的基于Struts2框架的Java Web应用。
● 路由机制:由struts-config.xml等配置文件管理,将.action请求映射到对应的Action类。
● 视图层:使用JSP文件进行页面渲染,其中也夹杂部分业务逻辑。
● 业务层:核心业务代码封装在Java类中,部分功能可能被打包在Jar库内。
审计准备:使用JD-GUI等反编译工具,将项目中的所有.class文件及依赖库.jar文件反编译,恢复为可读的Java代码,以便进行后续分析
鉴权分析
首先从全局配置入手,查看项目xml,寻找鉴权代码
发现三个filter,这里一个个点开分析下
CommonCharEnc
处理请求和响应的字符编码设置
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
初略看了下项目,目标系统为一个典型的基于Struts2框架的Java Web应用。
● 路由机制:由struts-config.xml等配置文件管理,将.action请求映射到对应的Action类。
● 视图层:使用JSP文件进行页面渲染,其中也夹杂部分业务逻辑。
● 业务层:核心业务代码封装在Java类中,部分功能可能被打包在Jar库内。
审计准备:使用JD-GUI等反编译工具,将项目中的所有.class文件及依赖库.jar文件反编译,恢复为可读的Java代码,以便进行后续分析
鉴权分析
首先从全局配置入手,查看项目xml,寻找鉴权代码
发现三个filter,这里一个个点开分析下
CommonCharEnc
处理请求和响应的字符编码设置
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤1
检测execute-assembly
一般检测execute-assembly都会使用windows事件跟踪,即ETW,例如这里启动一个powershell进程,通过procexp查看可以看到被CLR托管的dll
我们可以从processhacker工具源码里面的asmpage.c(processhacker/processhacker/blob/master/plugins/DotNetTools/asmpage.c)源码里面查看这类工具是怎样枚举.net工具集的,这里挑出关键代码编译成etw2.exe
首先cs上线,然后启动我们的监控程序,在beacon里面调用SharpHound.exe,这里需要在域内且具有.net环境才能够运行成功,执行以下命令
这里就会在exe存放的位置生成以下三个文件
然后我们去看一下我们的监控程序,可以看到已经识别出了SharpHound的调用
这里如果想要规避检测,可以更改程序名的名字,但是这里只要修改检测方法为显示可疑方法的名称即可
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
一般检测execute-assembly都会使用windows事件跟踪,即ETW,例如这里启动一个powershell进程,通过procexp查看可以看到被CLR托管的dll
我们可以从processhacker工具源码里面的asmpage.c(processhacker/processhacker/blob/master/plugins/DotNetTools/asmpage.c)源码里面查看这类工具是怎样枚举.net工具集的,这里挑出关键代码编译成etw2.exe
首先cs上线,然后启动我们的监控程序,在beacon里面调用SharpHound.exe,这里需要在域内且具有.net环境才能够运行成功,执行以下命令
这里就会在exe存放的位置生成以下三个文件
然后我们去看一下我们的监控程序,可以看到已经识别出了SharpHound的调用
这里如果想要规避检测,可以更改程序名的名字,但是这里只要修改检测方法为显示可疑方法的名称即可
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
chunked编码,使用若干个chunk串连接而成,由一个标明长度为0的chunk表示解释,每个chunk分为头部和正文两部分,头部内容定义了下一行传输内容的个数(个数用16进制来进行表示)和数量(一般不写数量,但是为了混淆,这里还是把数量写上去)正文部分就是指定长度的实际内容。两部分之间用(CRLF)来隔开,在最后一个长度为0的chunk中表示结束。并且长度中是以;作为长度的结束
数据包中添加:Transfer-Encoding: chunked
数字代表下一行的字符所占位数,最后需要用0独占一行表示结束,结尾需要两个回车
当设置这个Transfer-Encoding请求头的时候,会有两个效果
HTTP持久化连接:
因为现在大多数是http1.1协议版本,所以的话,只在Transfer-Encoding中定义了chunked一种编码格式。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
数据包中添加:Transfer-Encoding: chunked
数字代表下一行的字符所占位数,最后需要用0独占一行表示结束,结尾需要两个回车
当设置这个Transfer-Encoding请求头的时候,会有两个效果
HTTP持久化连接:
因为现在大多数是http1.1协议版本,所以的话,只在Transfer-Encoding中定义了chunked一种编码格式。
/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
添加完内存马后在控制台打印的内容
在JVM中,同一个类是允许被javaagent动态修改多次的。而且在java中,在retransform方法被调用的时候,jvm会将类的字节码作为参数传递给用户的Transform转换类。
在这里有一个大坑,也就是在调用retransformClass方法的时候参数中的字节码并不是调用redefineClass后被修改的类的字节码。对于冰蝎来讲,我们根本无法获取被冰鞋修改后类的字节码,这一点才是冰蝎最骚的地方。
我们自己写javaagent清除内存马的时候,同样也是无法获取到被redefineClass修改后的字节码,只能获取到被retransformClass修改后的字节码。通过javaassist等asm工具获取到类的字节码,也只是读取磁盘上响应类的字节码,而不是jvm中的字节码。这也就是我说清除容易,检测难的缘由。/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
在JVM中,同一个类是允许被javaagent动态修改多次的。而且在java中,在retransform方法被调用的时候,jvm会将类的字节码作为参数传递给用户的Transform转换类。
在这里有一个大坑,也就是在调用retransformClass方法的时候参数中的字节码并不是调用redefineClass后被修改的类的字节码。对于冰蝎来讲,我们根本无法获取被冰鞋修改后类的字节码,这一点才是冰蝎最骚的地方。
我们自己写javaagent清除内存马的时候,同样也是无法获取到被redefineClass修改后的字节码,只能获取到被retransformClass修改后的字节码。通过javaassist等asm工具获取到类的字节码,也只是读取磁盘上响应类的字节码,而不是jvm中的字节码。这也就是我说清除容易,检测难的缘由。/网站渗透 /黑客编程技术
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
DIE扫出来是一个flutter架构的apk,考虑用blutter来反编译
我之前在ubuntu上配置成功过,后来因为虚拟机坏了全删了。重新配置时kali、ubuntu
网络问题(要全局代理),缺少编译环境
cmake相关的报错就是缺少环境,一定要检查VS这个模块有没有安装
环境配置成功之后就快乐启动
得到输出,利用里面的文件可以恢复符号表,把addName的脚本跑一遍
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
我之前在ubuntu上配置成功过,后来因为虚拟机坏了全删了。重新配置时kali、ubuntu
网络问题(要全局代理),缺少编译环境
cmake相关的报错就是缺少环境,一定要检查VS这个模块有没有安装
环境配置成功之后就快乐启动
得到输出,利用里面的文件可以恢复符号表,把addName的脚本跑一遍
/软件渗透 /提取数据
/网站权限 /网站入侵破解
有需求的找我 @MoA_Ke
❤2🔥1