🗒️log4j远程执行漏洞代码审计(netcat/JNDI)
2023-2-17
| 2023-4-17
0  |  0 分钟
type
status
date
slug
summary
tags
category
icon
password

简介

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 CVE-2021-44228 版本:2.0<log4j<2.14.1 靶场复现https://vulfocus.cn/
受影响的中间件:Apache Solr、Apache Druid、Apache Struts2、Apache Flink、Flume、Dubbo、Redis、Logstash、ElasticSearch、Kafka、Ghidra、Minecraft、Apache hive、Datax、Streaming、Dolphin Scheduler、Storm、Spring

调用链

日志分为8个级别,由低到高依次为:All - Trace - Debug -Info - Warn - Error-Fatal -OFF。 log4j 1.X版本必须提供配置等级,2.X版本则默认打印error等级的日志,小于配置文件的即不能进入 this.logMessage()进行触发漏洞,默认大于error和fatal可以触发漏洞

原理

log4j在日志输出中,未对字符合法性进行严格的限制,执行了JNDI协议,通过JNDI协议操控rmi远程方法或者ldap目录访问协议进行从服务端其获取对应的远程恶意脚本Class文件,并使用ClassLoader在本地加载Ldap服务端返回的Class类,从而造成RCE。
其中有三个点,JNDI接口,rmi远程方法和ldap在下文补充

修复

1.升级官方最新版本,最新版本移除对lookup功能的支持,默认禁用JNDI方法.
2.禁用或移除log4j-core包中JndiLookup类文件
3.临时修复措施(任选其一)
(1)添加jvm启动参数-Dlog4j2.formatMsgNoLookups=true;
(2)在应用classpath下添加log4j2.component.properties配置文件,文件内容为log4j2.formatMsgNoLookups=true;
(3)JDK使用11.0.1、8u191、7u201、6u211及以上的高版本;
(4)限制受影响应用对外访问互联网;
(5)禁用JNDI。如在spring.properties里添加spring.jndi.ignore=true;
(6)部署使用第三方防火墙产品进行安全防护,并更新WAF、RASP规则等。

jndi注入

简介 JNDI( Java Naming and Directory Interface-Java命名和目录接口) 将名称与java对象或资源关联起来,进行通过名称调用到对应的对象或者资源 可操控的目录与服务有: DNS、XNam 、Novell目录服务、LDAP(Lightweight Directory Access Protocol轻型目录访问协议)、 CORBA对象服务、文件系统、WindowsXP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。
JNDI主要由两部分组成:Naming(命名)和Directory(目录),其中Naming是指将对象通过唯一标识符绑定到一个上下文Context,同时可通过唯一标识符查找获得对象,而Directory主要指将某一对象的属性绑定到Directory的上下文DirContext中,同时可通过名字获取对象的属性同时操作属性。

rmi

Java远程方法调用 即Java RMI(Java Remote Method Invocation)是Java编程语言里 一种用于实现远程过程调用的应用程序编程接口 RMI的功能:
Spring实现rmi

ldap

LDAP的全称为Lightweight Directory Access Protocol(轻量级目录访问协议), 基于X.500标准, 支持 TCP/IP。LDAP运行于TCP/IP连接上或其他面向传输服务的连接上。
LDAP目录为数据库,通过LDAP服务器(相当于DBMS)处理查询和更新, 以树状的层次结构来存储数据,相对关系型数据库, LDAP主要是优化数据读取的性能,适用于比较少改变、跨平台的信息。
java中的使用

扩展

netcat
简介 netcat在网络工具中被称为"瑞士军刀",可以读取和写入数据 网络连接,使用 TCP/IP 协议。它是一个 功能丰富的网络调试和探索工具,因为它可以创建 几乎您需要的任何类型的连接,提供与其他人的网络连接 应用程序和用户。 项目功能: 与任何端口的出站和入站连接(TCP 或 UDP)。 特色隧道模式,也允许特殊的隧道,如 作为 UDP 到 TCP,可以指定所有网络参数 (源端口/接口、侦听端口/接口和远程主机 允许连接到隧道。 内置端口扫描功能,带随机发生器。 高级使用选项,例如缓冲发送模式(每 N 行一行) 秒),以及传输的十六进制转储(到 stderr 或指定文件) 并收到数据。 可选的 RFC854 远程登录代码解析器和响应器。
linux使用 安装yum install nc(大部分linux默认安装) nc -h使用帮助
常用功能案例 服务端开启监听端口 nc -lvvp 6666 客户端连接监听端口 nc 192.168.149.129 6666
服务端和客户端即可建立连接 文件传输 接收端开启接收 nc -lvp 6666 >1.txt //将接收到的数据保存到当前路径下的1.txt 传输端开启传输 将2,txt传送到客户端 nc 192.X.X.X <2.txt
漏洞
  • 漏洞
  • OGNL表达式Kunlun-M
    目录