什么是ldap
LDAP是Lightweight Directory Access Protocol的缩写,顾名思义,它是指轻量级目录访问协议。这个协议是用于访问目录服务的。目录服务和数据库很类似,但又有着很大的不同之处。数据库设计为方便读写,但目录服务专门进行了读优化的设计,因此不太适合于经常有写操作的数据存储。
目录服务会通过树状结构存储数据,如下图,这样存储的优点就是查询效率高
上图这种树状结构,称为目录结构树(Directory Information Tree)(DIT),树上的每一个节点(不论是叶子节点还是中间的节点),都可以称为条目(Entry)。每个条目都有很多属性(Attribute),如下图
每一个条目都有一个唯一的标识名(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)是属性的集合,如图
常见的dns服务,windows注册表等都是目录服务
Java连接ldap流程
通过命名服务,查询ldap,获取到LdapUrlContext,然后继续lookup
supper:GenericUrlContext
如图,首先执行getRootURLContext
然后如图
在创建LdapCtx时会认证ldap服务,如果失败,则直接抛异常
通过ldapUrl解析出DN,然后将DN和 LdapCtx 封装成 ResolveResul t返回
getResolvedObj 获取到的是上一步的 LdapCtx,getRemainingName 获取到DN
p_lookup
c_lookup(LdapCtx)获取到对象
doSearchOnce开始搜索
搜索时的filter是(objectClass=*)
搜索数据
身份认证
协议使用LdapV3
build the bind request(认证过程就叫做bind,bind request就是认证请求)
如上图ber是在构造reauthenticate的数据包。可以看见有ASN_xxx,因为LDAP协议使用ASN.1规范进行描述,使用ASN.1 BER编码规范进行传输
身份认证时默认使用ldapv3协议,如果服务端返回状态码不是协议错误,则继续使用ldapv3。认证机制默认使用的是”none”(除此还有anontmous、simple、sasl)
解析Ldap Response
继续看c_lookup
这里有两个关键点:
一是拿出controls数据,存到respCtls(response control);
二是,如果有javaClassName属性,则调用decodeObject方法,解析出对象
如图
支持三种情况
-
javaSerializedData
-
javaRemoteLocation
-
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,如图
当没有设置url或trustURLCodebase为false时会返回父类加载器(AppClassLoader),然后再用这个加载器,反序列化javaSerializedData中的数据,这里可以作为反序列化利用,来绕过trstURLCodebase的限制
再看第二种情况javaRemoteLocation可以重新指定一个url,可以是ldap、rmi、iiop等协议,加载资源,支持的全部协议如图(似乎iiop协议可以反序列化)
Java ldap利用方式
-
Reference对象,需要trustURLCodebase
-
设置javaSerializedData属性,可以反序列化
-
似乎iiop协议也可以反序列化(不确定)
END
如果你喜欢 Yakit,欢迎关注我们,或者加入小小的技术讨论组(进讨论组请添加微信),关注我们的公众号,立即获取最新的技术姿势。有前端师傅对yak&yakit感兴趣的可以添加微信加入我们呀~~
官网教程:https://www.yaklang.io/products/intro
视频教程:https://space.bilibili.com/437503777
下载地址:https://github.com/yaklang/yakit
原文始发于微信公众号(Yak Project):Java ldap协议分析