好久沒更新博客了,因為最近實在是超級忙,最近Log4j2核彈級別漏洞被瘋狂刷屏,

2021年12月9日,國內多家機構監測到Apache Log4j2存在任意代碼執行漏洞,并緊急通報相關情況,由于Apache Log4j存在遞回決議功能,未取得身份認證的用戶,可以從遠程發送資料請求輸入資料日志,輕松觸發漏洞,最終在目標上執行任意代碼,鑒于Apache Log4j本身涉及多種應用組件,猿碼優創將此漏洞威脅等級調整為:嚴重,
目前經過不懈努力,猿碼優創已經給復現了,

還給大家畫了一個流程圖:

產生原因:存在JNDI注入漏洞,當程式將用戶輸入的資料被日志記錄時,即可觸發此漏洞,成功利用此漏洞可以在目標服務器上執行任意遠端代碼,
我們來看一個簡單的業務場景:
下面是一個登錄頁面:

后端我們把用戶誰登錄了進行列印,
public void login(string name){
logger.info("{},剛剛登錄了猿碼優創系統", name); //日志框架為:log4j2
}
輸出結果為:yuanmayouchuang剛剛登錄了猿碼優創系統,這個就忽略演示了,
很簡單的一個業務場景,但是如果在這個地方輸入:{java:os}會發生什么呢?
執行:logger.info("${java:os}"); //logger為log4j
輸出結果:Windows 10 10.0, architecture: amd64-64

有沒有感覺特別像SQL注入,

為什么會發生這樣的事呢?
log4j2的強大之處在于,除了可以輸出程式中的變數,它還提供了一個叫Lookup的東西,可以用來輸出更多內容:

lookup 翻譯過來就是查找、搜索的意思,那么log4j2中,就是在輸出日志的時候,通過方法去查找要輸出的內容,相當于一個介面,具體去哪里找,怎么找找,就需要撰寫具體的代碼去實作,就相當于java中的多型差不多意思,
log4j2提供了很多查找方法:

我們主要看一下本次漏洞的罪魁禍首:JNDI 什么是JNDI?它是干嘛的??我們問一下百度百科,

以上看的是不是超級懵,看看上面咱們做的那個實驗,傳參為:${java:os} 輸出計算機系統名稱,相當于類似于一個字典的資料源,通過傳參,然后找字典然后輸出相應的資訊,
這個時候小伙伴就有想了,跟我有什么關系,輸出系統變數,不會引起很大的事故吧,最多欺騙日志輸出,能引起什么腥風血浪,
別急,聽猿碼優創給你慢慢道來,JNDI 既然相當于一個字典,那里面有很多資料源,


其中有一個資料源就是本次漏洞的受害者,那就是LDAP
什么是LDAP?我們先問問百度百科,

what????怎么看了一臉懵逼,

有沒有在一些開源系統中看到過這個單詞LDAP登錄,
LDAP是開放的Internet標準,支持跨平臺的Internet協議,在業界中得到廣泛認可的,并且市場上或者開源社區上的大多產品都加入了對LDAP的支持,因此對于這類系統,不需單獨定制,只需要通過LDAP做簡單的配置就可以與服務器做認證互動,“簡單粗暴”,可以大大降低重復開發和對接的成本,
這樣說能明白了不?再舉個例子,比如你們公司購買了一個OA系統,但是呢你們原來有自己的域賬戶,這個時候OA系統廠家不會為你們單獨改造一套系統出來,這樣成本太大,這個時候LDAP就派上了用場,通過簡單配置,就可以用域賬戶登錄購買的OA系統,但是簡單配置相當于是遠端加載了一些資訊,
來上面兩個 lookup和LDAP大家有沒有一個簡單的了解,好我們來說這次的漏洞原理,
這個時候我們還是用代碼舉例子,
@GetMapping(value = "/test")
public String test(String info) {
//執行遠程代碼
logger.error("----------------log4j漏洞演示--------------------");
logger.info(info); //logger為log4j
return "success";
}
這個時候我們info傳遞:${jndi:ldap://127.0.0.1:3001/}
這個時候log4j一發現${} 這個時候里面的資訊就是要單獨處理的,
發現是JDNI擴展內容:${jndi:ldap://127.0.0.1:3001/yuanmayouchuang} ldap服務器在127.0.0.1 直接查找key是:yuanmayouchuang 然后查找完畢去回傳相應的資料,
如果是普通的資料那就沒什么?問題就是出現在可以請求java物件!啟動完專案 Java物件一般只存在于記憶體中,但也可以通過序列化的方式將其存盤到檔案中,或者通過網路傳輸,但更危險的在于:JNDI還支持一個叫命名參考(Naming References)的方式,可以通過遠程下載一個class檔案,然后下載后加載起來構建物件,
注意:這里就是核彈級別漏洞問題了:JNDI可以遠程下載class檔案來構建物件!!!
就是下載的class(java編譯后的代碼)如果里面有惡意代碼這不完蛋了嗎?

一句話總結漏洞:就是該輸出日志的地方執行了遠端服務器惡意Class代碼
互聯網流傳一句話:永遠不要相信用戶的輸入的內容,
修復方案:Log4j2修復方案官方地址
https://logging.apache.org/log4j/2.x/security.html

| 版本號 | 解決方案 |
|---|---|
| 2.10-2.14版本 | 系統屬性 log4j2.formatMsgNoLookups 或環境變數 LOG4J_FORMAT_MSG_NO_LOOKUPS 設定為 true |
| 2.7-2.14.1之間的版本 | 設定log4j2.xml的%m為 %m{nolookups} |
| 2.10以下版本 | 洗掉org/apache/logging/log4j/core/lookup/JndiLookup.class這個類 |
哎呀,大家很幸運,然后今天我打開log4j官方發現昨天的翻譯就是我上面發的給推翻了,,,

這是最新的解決方案:升級到最新2.0.16版本

log4j2.0.16 core版本 pom檔案: https://mvnrepository.com/artifact/org.apache.logging.log4j
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.16.0</version>
</dependency>
log4j2.0.16 api版本 pom檔案: https://mvnrepository.com/artifact/org.apache.logging.log4j
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.16.0</version>
</dependency>
到此本文就介紹完畢了,
稍后我會把LDAP模擬攻擊原始碼發出來了,需要大家遵守以下協議,
原始碼是針對Log4j2超高危RCE漏洞`CVE-2021-4428`的復現DEMO,目的是認識該漏洞的危害性并根據您系統的情況做出針對性的防御, 警告---重要 本DEMO只是針對技術層面的研究,不涉及惡意遠程計算機侵入方面的相關腳本,請勿利用漏洞進行非法侵入他人計算機的違法活動,否則您將可能承擔以下侵權責任: 1. 根據《中華人民共和國治安管理處罰法》第二十九條 對違反國家規定,侵入計算機資訊系統,造成危害的,處五日以下拘留;情節較重的,處五日以上十日以下拘留, 2. 根據《中華人民共和國刑法》第二百八十五條第一款的規定,犯本罪的,處三年以下有期徒刑或者拘役,單位犯本罪的,對單位判處罰金,并對其直接負責的主管人員和其他直接責任人員,依照上述規定處罰, 請勿用于非法用途,否則將承擔相應的法律責任,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/381937.html
標籤:其他
上一篇:log4j2 JNDI注入復現
