如何巧妙构建“LDAPS”服务器利用JNDI注入
内容提要
这篇文章介绍了如何使用ldaps进行JNDI注入的漏洞探测。ldaps是将普通的LDAP协议通信过程包裹一层TLS,可以通过CoNote等工具进行搭建LDAPS服务器。文章还提到了Opportunistic TLS和LDAPS两种安全传输方式,并介绍了利用JNDInjector等工具建立恶意ldaps服务器的方法。最后演示了利用JNDInjector成功执行命令的过程。
延伸解读
LDAPS 与 Opportunistic TLS 的差异
文章指出 LDAP 有两种安全传输方式:Opportunistic TLS 和 LDAPS。前者在明文连接后通过 StartTLS 命令升级为 TLS,类似 SMTP 的 STARTTLS;后者在连接建立时直接进行 TLS 握手,类似 HTTPS。在 JNDI 注入中,使用 ldaps 协议会直接触发 TLS 连接,而 ldap 协议若未升级则可能被拦截。理解这一差异有助于在绕过关键字过滤时选择合适的方式。
探测 JNDI 注入不受 Java 版本限制
文章强调,使用 CoNote 等工具通过 LDAPS 探测 JNDI 注入漏洞是否存在,不受 Java 版本影响,至少到 Java 17 仍然有效。只要服务端能接收到 LDAP 或 RMI 请求,就说明存在注入点。但后续能否执行命令则取决于 Java 版本和利用链。因此,探测阶段可以独立于版本限制,为后续利用提供明确目标。
利用 TLS 反向代理复用现有工具
由于 JNDInjector 等工具不支持 LDAPS,文章提出编写一个 TLS 反向代理,将 LDAPS 请求解密后转发给后端的 LDAP 服务。示例使用 Go 语言实现,通过 tls.Listen 创建 TLS 服务器,并用 io.Copy 双向转发数据。这种方法无需修改现有工具,只需一个合法的 TLS 证书即可搭建恶意 LDAPS 服务器,降低了利用门槛。
Q&A
ldaps是什么,它与LDAP有什么区别?
ldaps是将LDAP协议通信过程包裹一层TLS的安全传输方式,区别在于ldaps在连接时直接使用TLS,而LDAP则是明文通信。
如何使用CoNote搭建LDAPS服务器?
可以通过CoNote中的功能生成或绑定自定义域名,并在LDAP日志页面生成ldaps URL进行探测。
JNDI注入漏洞的探测是否受Java版本影响?
探测JNDI注入漏洞不受Java版本影响,但后续命令执行可能受限于Java版本。
如何利用JNDInjector生成恶意ldaps URL?
可以使用JNDInjector选择利用链与Payload,生成ldap协议的恶意URL,并通过TLS反向代理实现ldaps请求的转发。
Opportunistic TLS和LDAPS的主要区别是什么?
Opportunistic TLS在明文通信中找机会升级为TLS,而LDAPS则在连接时直接使用TLS进行加密。
如何实现TLS端口转发?
可以通过编写TLS反向代理,将ldaps请求转发给JNDInjector,使用tls.Listen创建TCP over TLS服务器。