再探Rookit-对Festi Rookit样本的详细分析
字数 1713 2025-08-24 20:49:22

Festi Rootkit 详细分析与技术解析

1. Festi Rootkit 概述

Festi 是一个老牌的内核级 rootkit,主要通过 dropper 植入系统,具有模块化架构和多种隐藏技术。其主要功能包括:

  • 从 C&C 服务器请求配置信息
  • 以插件形式下载执行恶意模块(内存驻留)
  • 实现多种隐藏技术(文件系统、注册表、网络通信)
  • 包含反调试和 DGA 功能

2. 核心架构分析

2.1 插件管理系统

Festi 使用插件管理器管理下载的插件,主要结构如下:

struct PLUGIN_INTERFACE {
    PVOID Initialize;          // 初始化插件
    PVOID Release;             // 释放插件
    PVOID GetVersionInfo_1;    // 获取版本信息
    PVOID GetVersionInfo_2;    // 获取版本信息
    PVOID WriteIntoTcpStream;  // 向TCP流写入插件信息
    PVOID ReadFromTcpStream;   // 从TCP流读取并解析数据
    PVOID Reserved_1;          // 保留字段
    PVOID Reserved_2;          // 保留字段
};

特点:

  • 插件是易失性的,重启后消失
  • 每个插件有明确的任务(DDoS、垃圾邮件等)
  • 通过指针数组管理插件接口

2.2 IRP 处理机制

驱动程序初始化时会获取 DriverObjectMajorFunction 数组地址,处理各种 I/O 请求数据包 (IRP)。

关键函数:

  • KeStackAttachProcess/KeUnstackDetachProcess:附加到其他进程地址空间
  • 通过修改偏移量干扰系统正常运行
  • 内存清理函数:遍历内存块查找特定字符串并清除

3. 动态解析技术

Festi 使用动态解析 Windows API 函数的技术:

  1. 函数地址存储在 .cdata
  2. 使用 4 字节 XOR 密钥 (0x9D802CB0) 加密
  3. 运行时解密获取真实函数地址

解密脚本示例:

import idaapi
import idautils
import idc

XOR_KEY = 0x9D802CB0

def xor_data(data, key):
    key_bytes = key.to_bytes(4, byteorder='little')
    result = bytearray(len(data))
    for i in range(0, len(data), 4):
        for j in range(4):
            if i + j < len(data):
                result[i+j] = data[i+j] ^ key_bytes[j]
    return result

# 查找并解密.cdata段
for seg in idautils.Segments():
    seg_name = idc.get_segm_name(seg)
    if seg_name == ".cdata":
        start = idc.get_segm_start(seg)
        end = idc.get_segm_end(seg)
        cdata = idaapi.get_bytes(start, end-start)
        if cdata:
            xor_cdata = xor_data(bytearray(cdata), XOR_KEY)
            ida_bytes.patch_bytes(start, bytes(xor_cdata))

4. 隐藏技术详解

4.1 文件系统隐藏

通过挂载到文件系统设备栈顶部实现:

  1. 获取 \SystemRoot 句柄
  2. 通过 ObReferenceObjectByHandle 获取 FILE_OBJECT
  3. 使用 IoGetRelatedDeviceObject 获取 DEVICE_OBJECT
  4. 创建新设备对象并附加到设备栈 (IoAttachDeviceToDeviceStack)

效果:

  • 拦截所有文件系统 IRP 请求
  • 修改返回数据隐藏自身文件

4.2 注册表隐藏

通过挂钩 ZwEnumerateKey 隐藏服务注册表项:

  1. 修改 SSDT (系统服务描述符表)
  2. 禁用写保护修改只读页面
  3. NewZwEnumerateKey 钩子中过滤特定注册表项
  4. 使用 FindToString 函数匹配注册表项(不区分大小写)

恢复机制:

  • 注册关机通知 (IoRegisterShutdownNotification)
  • 检查并恢复被删除的注册表项

4.3 网络通信保护

绕过安全软件监控的技术:

  1. 不使用 ZwCreateFile,直接创建文件对象
  2. 直接向传输驱动程序发送 IRP_MJ_CREATE 请求
  3. 通过 ObReferenceObjectByName 获取 tcpip.sys 指针
  4. 遍历设备对象列表匹配 \Device\Tcp\Device\Udp

5. 反调试技术

Festi 采用硬件断点清除技术:

mov     dr0, 0
mov     dr1, 0
mov     dr2, 0
mov     dr3, 0

特点:

  • 定期清零调试寄存器 dr0-dr3
  • 破坏调试器设置的硬件断点
  • 增加逆向分析难度

6. DGA 算法分析

域名生成算法 (DGA) 用于备用 C&C 通信:

  1. 使用日期结构作为种子
  2. 生成 12 个字符的 .com 域名
  3. 通过 chrfun_X 函数映射种子到字符
  4. 在主 C&C 不可用时提供备用连接

特点:

  • 使僵尸网络具有抗打击能力
  • 即使主域名被封仍可恢复控制
  • 算法可预测但难以全面封堵

7. 检测与防御建议

检测方法:

  1. 检查异常设备栈结构
  2. 监控 SSDT 挂钩
  3. 检测调试寄存器异常修改
  4. 分析异常网络通信模式

防御措施:

  1. 启用驱动签名验证
  2. 监控内核模块加载
  3. 实施完整性保护(如 HVCI)
  4. 部署行为检测方案
  5. 定期更新系统补丁

8. 参考资源

  1. 《Rootkit和Bootkit 现代恶意软件逆向分析和下一代威胁》
  2. ESET 白皮书: King of Spam: Festi Botnet Analysis
  3. ESET 技术报告: Festi Botnet Analysis and Investigation
  4. 幻灯片: Festi Botnet Analysis
Festi Rootkit 详细分析与技术解析 1. Festi Rootkit 概述 Festi 是一个老牌的内核级 rootkit,主要通过 dropper 植入系统,具有模块化架构和多种隐藏技术。其主要功能包括: 从 C&C 服务器请求配置信息 以插件形式下载执行恶意模块(内存驻留) 实现多种隐藏技术(文件系统、注册表、网络通信) 包含反调试和 DGA 功能 2. 核心架构分析 2.1 插件管理系统 Festi 使用插件管理器管理下载的插件,主要结构如下: 特点: 插件是易失性的,重启后消失 每个插件有明确的任务(DDoS、垃圾邮件等) 通过指针数组管理插件接口 2.2 IRP 处理机制 驱动程序初始化时会获取 DriverObject 的 MajorFunction 数组地址,处理各种 I/O 请求数据包 (IRP)。 关键函数: KeStackAttachProcess / KeUnstackDetachProcess :附加到其他进程地址空间 通过修改偏移量干扰系统正常运行 内存清理函数:遍历内存块查找特定字符串并清除 3. 动态解析技术 Festi 使用动态解析 Windows API 函数的技术: 函数地址存储在 .cdata 段 使用 4 字节 XOR 密钥 (0x9D802CB0) 加密 运行时解密获取真实函数地址 解密脚本示例: 4. 隐藏技术详解 4.1 文件系统隐藏 通过挂载到文件系统设备栈顶部实现: 获取 \SystemRoot 句柄 通过 ObReferenceObjectByHandle 获取 FILE_OBJECT 使用 IoGetRelatedDeviceObject 获取 DEVICE_OBJECT 创建新设备对象并附加到设备栈 ( IoAttachDeviceToDeviceStack ) 效果: 拦截所有文件系统 IRP 请求 修改返回数据隐藏自身文件 4.2 注册表隐藏 通过挂钩 ZwEnumerateKey 隐藏服务注册表项: 修改 SSDT (系统服务描述符表) 禁用写保护修改只读页面 在 NewZwEnumerateKey 钩子中过滤特定注册表项 使用 FindToString 函数匹配注册表项(不区分大小写) 恢复机制: 注册关机通知 ( IoRegisterShutdownNotification ) 检查并恢复被删除的注册表项 4.3 网络通信保护 绕过安全软件监控的技术: 不使用 ZwCreateFile ,直接创建文件对象 直接向传输驱动程序发送 IRP_MJ_CREATE 请求 通过 ObReferenceObjectByName 获取 tcpip.sys 指针 遍历设备对象列表匹配 \Device\Tcp 或 \Device\Udp 5. 反调试技术 Festi 采用硬件断点清除技术: 特点: 定期清零调试寄存器 dr0-dr3 破坏调试器设置的硬件断点 增加逆向分析难度 6. DGA 算法分析 域名生成算法 (DGA) 用于备用 C&C 通信: 使用日期结构作为种子 生成 12 个字符的 .com 域名 通过 chrfun_X 函数映射种子到字符 在主 C&C 不可用时提供备用连接 特点: 使僵尸网络具有抗打击能力 即使主域名被封仍可恢复控制 算法可预测但难以全面封堵 7. 检测与防御建议 检测方法: 检查异常设备栈结构 监控 SSDT 挂钩 检测调试寄存器异常修改 分析异常网络通信模式 防御措施: 启用驱动签名验证 监控内核模块加载 实施完整性保护(如 HVCI) 部署行为检测方案 定期更新系统补丁 8. 参考资源 《Rootkit和Bootkit 现代恶意软件逆向分析和下一代威胁》 ESET 白皮书: King of Spam: Festi Botnet Analysis ESET 技术报告: Festi Botnet Analysis and Investigation 幻灯片: Festi Botnet Analysis