Java ldap协议分析

admin 2022年4月23日03:26:12评论151 views字数 2149阅读7分9秒阅读模式
Java ldap协议分析

什么是ldap

Java ldap协议分析

      LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议。这个协议是用于访问目录服务的。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于经常有写操作的数据存储。

       目录服务会通过树状结构存储数据,如下图,这样存储的优点就是查询效率高

Java ldap协议分析

      上图这种树状结构,称为目录结构树(Directory Information Tree)(DIT),树上的每一个节点(不论是叶子节点还是中间的节点),都可以称为条目(Entry)。每个条目都有很多属性(Attribute),如下图

Java ldap协议分析

     每一个条目都有一个唯一的标识名(distinguished Name ,DN)。如上图的cn=Tux,它的DN就是cn=Tux,ou=devel,dc=example,dc=com,DN由多个RND(Relative Distinguished Name)通过逗号分割,如cn=Tux是RND,ou=devel 也是一个RND。

     对象类(ObjectClass)是属性的集合,如图

Java ldap协议分析

     常见的dns服务,windows注册表等都是目录服务


Java ldap协议分析

Java连接ldap流程

Java ldap协议分析


Java ldap协议分析

通过命名服务,查询ldap,获取到LdapUrlContext,然后继续lookup

Java ldap协议分析

supper:GenericUrlContext

Java ldap协议分析

如图,首先执行getRootURLContext

Java ldap协议分析

然后如图

Java ldap协议分析

      在创建LdapCtx时会认证ldap服务,如果失败,则直接抛异常

      通过ldapUrl解析出DN,然后将DN和 LdapCtx 封装成 ResolveResul t返回

      getResolvedObj 获取到的是上一步的 LdapCtx,getRemainingName 获取到DN

Java ldap协议分析

p_lookup

Java ldap协议分析

c_lookup(LdapCtx)获取到对象

Java ldap协议分析

doSearchOnce开始搜索

Java ldap协议分析
Java ldap协议分析
Java ldap协议分析

Java ldap协议分析

搜索时的filter是(objectClass=*)


Java ldap协议分析

搜索数据

Java ldap协议分析


Java ldap协议分析

身份认证

Java ldap协议分析

协议使用LdapV3

build the bind request(认证过程就叫做bind,bind request就是认证请求)

Java ldap协议分析

     如上图ber是在构造reauthenticate的数据包。可以看见有ASN_xxx,因为LDAP协议使用ASN.1规范进行描述,使用ASN.1 BER编码规范进行传输

     身份认证时默认使用ldapv3协议,如果服务端返回状态码不是协议错误,则继续使用ldapv3。认证机制默认使用的是"none"(除此还有anontmous、simple、sasl)


Java ldap协议分析

解析Ldap Response

Java ldap协议分析


继续看c_lookup

Java ldap协议分析

     这里有两个关键点:

     一是拿出controls数据,存到respCtls(response control);

     二是,如果有javaClassName属性,则调用decodeObject方法,解析出对象

如图

Java ldap协议分析

    支持三种情况

  1. javaSerializedData

  2. javaRemoteLocation

  3. javaNamingReference

     第三种情况,调用方法,生成Reference对象

    接着在c_lookup方法中调用DirectoryManager.getObjectInstance,解析Reference对象,解析时会先从本地加载,如果为null,再通过codebase的地址去加载(需要com.sun.jndi.ldap.object.trustURLCodebase的值为true),导致任意类加载

  再看第一种情况,通过helper.getURLClassLoader获取ClassLoader也需要com.sun.jndi.ldap.object.trustURLCodebase的值为true,如图

Java ldap协议分析

     当没有设置url或trustURLCodebase为false时会返回父类加载器(AppClassLoader),然后再用这个加载器,反序列化javaSerializedData中的数据,这里可以作为反序列化利用,来绕过trstURLCodebase的限制

     再看第二种情况javaRemoteLocation可以重新指定一个url,可以是ldap、rmi、iiop等协议,加载资源,支持的全部协议如图(似乎iiop协议可以反序列化)

Java ldap协议分析


Java ldap协议分析

Java ldap利用方式

Java ldap协议分析


  1. Reference对象,需要trustURLCodebase

  2. 设置javaSerializedData属性,可以反序列化

  3. 似乎iiop协议也可以反序列化(不确定)


Java ldap协议分析

END

Java ldap协议分析

      如果你喜欢 Yakit,欢迎关注我们,或者加入小小的技术讨论组(进讨论组请添加微信),关注我们的公众号,立即获取最新的技术姿势。有前端师傅对yak&yakit感兴趣的可以添加微信加入我们呀~~

官网教程:https://www.yaklang.io/products/intro

视频教程:https://space.bilibili.com/437503777

下载地址:https://github.com/yaklang/yakit

Java ldap协议分析

原文始发于微信公众号(Yak Project):Java ldap协议分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月23日03:26:12
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Java ldap协议分析https://cn-sec.com/archives/914286.html

发表评论

匿名网友 填写信息