本文最后更新于:2024年4月22日 下午
将本地演示log4j漏洞的入侵原理及其修复方案
简介
Apache Log4j2是一款优秀的Java日志框架,Log4j2远程代码执行漏洞,JNDI注入漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。原理:利用日志记录时候注入jndi 远程链接,jndi通过rmi 协议访问远程http服务的代码,然后将目标服务器的代码加载到当前VM来执行
JNDI(Java Naming and Directory Interface,Java命名和目录接口)。
基于Java反序列化RCE - 搞懂RMI、JRMP、JNDI- https://xz.aliyun.com/t/7079
前置条件
1、jdk<1.8.0_191 这里是java1.8
JDK 11.0.1、8u191、7u201、6u211或者更高版本的JDK情况下可能会失败
原因:从 JAVA 1.8_191 起默认不信任远程 codebase,即远程 class 文件不会被自动加载,所以在 JAVA 1.8_191 及以后只能从本地 class 文件加载,但网上也有绕过,这里不细谈,详情百度
我的版本:
2、Apache Log4j 2.x <= 2.14.1
准备工作
攻击搭建
恶意文件
恶意代码模拟,这里恶意模拟获取系统环境执行打开一个计算器应用:AttackService
ngin搭建
将上述文件AttackService.java编译程AttackService.class 放于nginx htm目录下
启动nginx;
测试访问:http://127.0.0.1:80/AttackService.class 可以下载到文件,这一步就算成功
搭建rmi服务
这里启用1098端口的rmi服务,启动后绑定该端口。
192.168.101.11 是我本地的局域网端口,这里可以尝试使用127.0.0.1也是可以的
被攻击服务
搭建一个maven 工程springboot服务,pomz中dependencies文件如下
准备一个简易的log4j.properties
controller如下
System.setProperty(“com.sun.jndi.rmi.object.trustURLCodebase”, “true”); 该值为false所以就会跑出异常中止执行
在当前环境vm 打印出我们放在nginx 里面的伪代码,并且打开了计算器就算浮现成功
解决办法
1、pom.xml中升级log4j的版本到2.15.0或者更高
2、JDK 版本升级更高 JDK 11.0.1、8u191、7u201、6u211或者更高版本
3、采用logback记录日志,logback+slfj是一套非常优秀的解决方案