JNDI打LDAP

照着大师傅们的文章了解下JNDI打LDAP注入

最近打算走一遍y4er 的路 把他看过的 很有用的复现一遍

攻击过程如下:

  1. 攻击者为易受攻击的JNDI查找方法提供了一个绝对的LDAP URL
  2. 服务器连接到由攻击者控制的LDAP服务器,该服务器返回恶意JNDI 引用
  3. 服务器解码JNDI引用
  4. 服务器从攻击者控制的服务器获取Factory类
  5. 服务器实例化Factory类
  6. 有效载荷得到执行

img

JNDI也可以用于与LDAP目录服务进行交互。通过使用几个特殊的Java属性,如上面提到的javaCodeBase、objectClass、javaFactory、javaSerializedData、javaRemoteLocation属性等,使用这些属性可以使用LDAP来存储Java对象,在LDAP目录中存储属性至少有以下几种方式:

https://docs.oracle.com/javase/jndi/tutorial/objects/storing/serial.html

这种方式在具体在哪个版本开始需要开启com.sun.jndi.ldap.object.trustURLCodebase属性默认为true才允许远程加载类还不清楚,不过在jdk1.8.0_102上测试需要设置这个属性为true。

这里右键jar包 有个add as moudle 点一下 就引入了

变成这样

image-20221006002419882

然后就可以乱杀了

完整代码在github上,先启动remote-class/src/main/java/com/longofo/remoteclass/HttpServer,接着启动rmi-jndi-ldap-jrmp/ldap/src/main/java/com/longofo/LDAPRefServer,运行rmi-jndi-ldap-jrmp/ldap/src/main/java/com/longofo/LDAPServer2添加JNDI引用,在运行客户端rmi-jndi-ldap-jrmp/jndi/src/main/java/com/longofo/jndi/LDAPClient2即可复现。

还有利用本地class绕过高版本JDK限制的,可以参考https://kingx.me/Restrictions-and-Bypass-of-JNDI-Manipulations-RCE.html[11]的"绕过高版本JDK限制:利用LDAP返回序列化数据,触发本地Gadget"部分

source

JNDI之初探LDAP - FreeBuf网络安全行业门户

从一次漏洞挖掘入门Ldap注入 - 先知社区 (aliyun.com)

从RCE到LDAP信息泄漏 - FreeBuf网络安全行业门户

JNDI与RMI、LDAP一二事 - FreeBuf网络安全行业门户

https://paper.seebug.org/1091/#ldap_1