JNDI注入工具代码结构分析

admin 2022年4月1日11:01:17评论32 views字数 2047阅读6分49秒阅读模式
THE SPRING EQUINOX
JNDI注入工具代码结构分析
JNDI注入工具代码结构分析

该文章首发于Sec-IN,文章链接:https://www.sec-in.com/article/1632


工具链接:https://github.com/Jeromeyoung/JNDIExploit-1


如下是一些模块的作用:

controllers模块:负责LDAP请求的处理


JNDI注入工具代码结构分析


enum模块:负责存储各种模板类型名称,如:反序列化的Gadget、内存马的类型


JNDI注入工具代码结构分析


异常模块:负责处理可能抛出的异常


JNDI注入工具代码结构分析


反序列化模块:各种反序列化链的处理


JNDI注入工具代码结构分析


模板模块:命令执行、回显、DNS、内存马模板


JNDI注入工具代码结构分析


工具类模块:主要是为了方便而编写的一些工具类


JNDI注入工具代码结构分析


协议服务及启动模块:负责LDAP、HTTP协议的具体实现


JNDI注入工具代码结构分析


下面先对启动及协议服务模块进行说明


JNDI注入工具代码结构分析


com.feihong.ldap.Starter类为整个工具的启动入口,从命令行接收参数传参到com.feihong.ldap.utils.Config类


JNDI注入工具代码结构分析


Config类中的@Parameter注解为参数的说明及代表的意思,类似于py中的argparse,命令接收到参数,分别赋值给Config类的几个私有变量。

然后在之后的HTTPServer与LDAPServer中得到应用


JNDI注入工具代码结构分析


关于LDAP服务端的编写和Demo可以参考以下链接:https://www.freebuf.com/vuls/253545.html,

HTTPServer则是正常的Java Demo编写即可


JNDI注入工具代码结构分析



THE SPRING EQUINOX
注解的应用
JNDI注入工具代码结构分析


在JNDIEXP中,作者为了可以反射一种类型的类,Controller类,这里的类起到了寻找特定类的作用,而且每个注解类都给定了uri属性


JNDI注入工具代码结构分析


在LDAPServer.start()之前,会先通过new Reflections(this.getClass().getPackage().getName())的方法获取到com.feihong.ldap包下面所有LdapMapping的类,之后将其以键值对(TreeMap<String, LdapController>)放入到Map中,以便于后续调用


JNDI注入工具代码结构分析


比如com.feihong.ldap.controllers.BasicController类,在Map中的存储格式就是(basic=>Object BasicController)


JNDI注入工具代码结构分析


根据发送来的LDAP请求去决定调用哪个类,具体通过com.feihong.ldap.processSearchResult


JNDI注入工具代码结构分析


根据工具运行的实际效果,如果我们的LDAP请求为ldap://192.168.85.1:1389/Basic/123


JNDI注入工具代码结构分析


那么DN为Basic/123,首先根据DN中的开头字符串决定是哪个Controller来处理当前的LDAP的请求


THE SPRING EQUINOX
服务端动态调用类
JNDI注入工具代码结构分析

在LDAP调用LdapController接口实现类之后(以BasicController为例),会先调用process方法,以/为标志分割,获取到相应的模块名称,比如ldap://0.0.0.0:1389/Basic/Command/whoami,那么第一部分Basic用来指定是BasicController,Command指定执行BasicController下的命令执行模块


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


如果是命令执行模块


JNDI注入工具代码结构分析


通过com.feihong.ldap.utils.Util的getCmdFromBase方法获取到执行命令的内容,如果是base编码的,进行base64解码后返回内容


JNDI注入工具代码结构分析


将其赋值给params,之后再调用BasicController的sendResult方法,如果是command模块,初始化该模块,通过asm码的方法,这里为了避免出现类名重复的情况,使用随机字符命令类名


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


之后命令执行模块调用cache方法


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


JNDI注入工具代码结构分析


将其存储在map中,之后开始进行LDAP的步骤


JNDI注入工具代码结构分析


首先LDAP设定好

javaClassName:记录序列化对象的类名,这样应用程序就可以确定类信息,而不必首先反序列化

javaClassNames:关于序列化对象的附加类信息。

javaCodebase:实例化工厂所需的类定义的位置(HTTP地址)

javaFactory:用于存储对象工厂的完全限定类的可选属性(即类名)

一张图说明LDAP请求的过程


JNDI注入工具代码结构分析


接下来看HTTPServer如何接收HTTP请求并返回


JNDI注入工具代码结构分析


当HTTPServer接收到请求之后,将Cache类中map存储的类写入到响应中,这样避免了class文件落地的情况。

JNDI注入工具代码结构分析

             END
JNDI注入工具代码结构分析


如果对内网感兴趣的话,可以报名参加内网渗透培训哦,详情👇🏻👇🏻👇🏻

2022 I-IVV 红队培训之内网渗透

如果对Java代码审计感兴趣的话,可以报名参加Java代码审计培训哦,详情👇🏻👇🏻👇🏻

红队培训之Java代码审计



也可以在星球里跟我讨论交流。星球里有一千五百多位同样爱好安全技术的小伙伴一起交流!

JNDI注入工具代码结构分析

原文始发于微信公众号(谢公子学安全):JNDI注入工具代码结构分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月1日11:01:17
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   JNDI注入工具代码结构分析http://cn-sec.com/archives/857757.html

发表评论

匿名网友 填写信息