再探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 处理机制
驱动程序初始化时会获取 DriverObject 的 MajorFunction 数组地址,处理各种 I/O 请求数据包 (IRP)。
关键函数:
KeStackAttachProcess/KeUnstackDetachProcess:附加到其他进程地址空间- 通过修改偏移量干扰系统正常运行
- 内存清理函数:遍历内存块查找特定字符串并清除
3. 动态解析技术
Festi 使用动态解析 Windows API 函数的技术:
- 函数地址存储在
.cdata段 - 使用 4 字节 XOR 密钥 (0x9D802CB0) 加密
- 运行时解密获取真实函数地址
解密脚本示例:
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 文件系统隐藏
通过挂载到文件系统设备栈顶部实现:
- 获取
\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 采用硬件断点清除技术:
mov dr0, 0
mov dr1, 0
mov dr2, 0
mov dr3, 0
特点:
- 定期清零调试寄存器 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