$npx -y skills add killvxk/cybersecurity-skills-zh --skill analyzing-bootkit-and-rootkit-samples分析感染主引导记录(MBR)、卷引导记录(VBR)或 UEFI 固件以在操作系统底层获取持久化的 bootkit 和高级 rootkit 恶意软件。 涵盖引导扇区分析、UEFI 模块检查和反 rootkit 检测技术。 适用于 bootkit 分析、MBR 恶意软件调查、UEFI 持久化分析或 OS 前恶意软件检测相关请求。
| 1 | # 分析 Bootkit 和 Rootkit 样本 |
| 2 | |
| 3 | ## 适用场景 |
| 4 | |
| 5 | - 系统在操作系统重装后仍存在持续性被攻陷迹象 |
| 6 | - 尽管有明确的被攻陷证据,但杀毒软件和 EDR 均无法检测到恶意软件 |
| 7 | - UEFI Secure Boot 已被禁用或显示完整性违规 |
| 8 | - 内存取证(Memory Forensics)揭示 rootkit 行为(隐藏进程、系统调用挂钩) |
| 9 | - 调查已知部署 bootkit 的国家级威胁(APT28、APT41、方程式组织) |
| 10 | |
| 11 | **不适用于**标准用户态恶意软件;bootkit 和 rootkit 运行在完全不同的层级,需要专门的分析技术。 |
| 12 | |
| 13 | ## 前置条件 |
| 14 | |
| 15 | - 磁盘镜像工具(dd、FTK Imager)用于获取 MBR/VBR 扇区 |
| 16 | - UEFITool 用于 UEFI 固件卷分析和模块提取 |
| 17 | - chipsec 用于硬件级固件安全评估 |
| 18 | - Ghidra,支持 x86 实模式和 16 位模式用于 MBR 代码分析 |
| 19 | - Volatility 3 用于内核级 rootkit 工件检测 |
| 20 | - 可引导的 Linux Live USB 用于离线系统分析 |
| 21 | |
| 22 | ## 工作流程 |
| 23 | |
| 24 | ### 步骤 1:获取引导扇区和固件 |
| 25 | |
| 26 | 提取 MBR、VBR 和 UEFI 固件用于离线分析: |
| 27 | |
| 28 | ```bash |
| 29 | # 获取 MBR(磁盘前 512 字节) |
| 30 | dd if=/dev/sda of=mbr.bin bs=512 count=1 |
| 31 | |
| 32 | # 获取第一磁道(通常包含 MBR 之外的 bootkit 代码) |
| 33 | dd if=/dev/sda of=first_track.bin bs=512 count=63 |
| 34 | |
| 35 | # 获取 VBR(卷引导记录 - 分区的第一个扇区) |
| 36 | dd if=/dev/sda1 of=vbr.bin bs=512 count=1 |
| 37 | |
| 38 | # 获取 UEFI 系统分区 |
| 39 | mkdir /mnt/efi |
| 40 | mount /dev/sda1 /mnt/efi |
| 41 | cp -r /mnt/efi/EFI /analysis/efi_backup/ |
| 42 | |
| 43 | # 转储 UEFI 固件(需要 chipsec 或 flashrom) |
| 44 | # 使用 chipsec: |
| 45 | python chipsec_util.py spi dump firmware.rom |
| 46 | |
| 47 | # 使用 flashrom: |
| 48 | flashrom -p internal -r firmware.rom |
| 49 | |
| 50 | # 验证固件转储完整性 |
| 51 | sha256sum firmware.rom |
| 52 | ``` |
| 53 | |
| 54 | ### 步骤 2:分析 MBR/VBR 中的 Bootkit 代码 |
| 55 | |
| 56 | 检查引导扇区代码中的恶意修改: |
| 57 | |
| 58 | ```bash |
| 59 | # 反汇编 MBR 代码(16 位实模式) |
| 60 | ndisasm -b16 mbr.bin > mbr_disasm.txt |
| 61 | |
| 62 | # 与已知正常的 Windows MBR 对比 |
| 63 | # 标准 Windows MBR 以 EB 5A 90(JMP 0x5C, NOP)开头 |
| 64 | # 标准 Windows 10 MBR:33 C0 8E D0 BC 00 7C(XOR AX,AX; MOV SS,AX; MOV SP,7C00h) |
| 65 | |
| 66 | python3 << 'PYEOF' |
| 67 | with open("mbr.bin", "rb") as f: |
| 68 | mbr = f.read() |
| 69 | |
| 70 | # 检查 MBR 签名(510-511 字节应为 0x55AA) |
| 71 | if mbr[510:512] == b'\x55\xAA': |
| 72 | print("[*] 有效的 MBR 签名 (0x55AA)") |
| 73 | else: |
| 74 | print("[!] 无效的 MBR 签名") |
| 75 | |
| 76 | # 检查已知 bootkit 签名 |
| 77 | bootkit_sigs = { |
| 78 | b'\xE8\x00\x00\x5E\x81\xEE': "TDL4/Alureon bootkit", |
| 79 | b'\xFA\x33\xC0\x8E\xD0\xBC\x00\x7C\x8B\xF4\x50\x07': "标准 Windows MBR(干净)", |
| 80 | b'\xEB\x5A\x90\x4E\x54\x46\x53': "标准 NTFS VBR(干净)", |
| 81 | } |
| 82 | |
| 83 | for sig, name in bootkit_sigs.items(): |
| 84 | if sig in mbr: |
| 85 | print(f"[{'!' if '干净' not in name else '*'}] 签名匹配:{name}") |
| 86 | |
| 87 | # 检查分区表条目 |
| 88 | print("\n分区表:") |
| 89 | for i in range(4): |
| 90 | offset = 446 + (i * 16) |
| 91 | entry = mbr[offset:offset+16] |
| 92 | if entry != b'\x00' * 16: |
| 93 | boot_flag = "活动" if entry[0] == 0x80 else "非活动" |
| 94 | part_type = entry[4] |
| 95 | start_lba = int.from_bytes(entry[8:12], 'little') |
| 96 | size_lba = int.from_bytes(entry[12:16], 'little') |
| 97 | print(f" 分区 {i+1}: 类型=0x{part_type:02X} {boot_flag} 起始=LBA {start_lba} 大小={size_lba} 扇区") |
| 98 | PYEOF |
| 99 | ``` |
| 100 | |
| 101 | ### 步骤 3:分析 UEFI 固件中的植入物 |
| 102 | |
| 103 | 检查 UEFI 固件卷中的未授权模块: |
| 104 | |
| 105 | ```bash |
| 106 | # 使用 UEFITool 提取 UEFI 固件组件 |
| 107 | # GUI:打开 firmware.rom -> 检查固件卷 |
| 108 | # CLI: |
| 109 | UEFIExtract firmware.rom all |
| 110 | |
| 111 | # 列出所有 DXE 驱动(UEFI 植入物最常见的目标) |
| 112 | find firmware.rom.dump -name "*.efi" -exec file {} \; |
| 113 | |
| 114 | # 与已知正常的固件模块列表对比 |
| 115 | # 每个 UEFI 模块都有一个 GUID - 与厂商基线对比 |
| 116 | |
| 117 | # 验证 Secure Boot 配置 |
| 118 | python chipsec_main.py -m common.secureboot.variables |
| 119 | |
| 120 | # 检查 SPI 闪存写保护 |
| 121 | python chipsec_main.py -m common.bios_wp |
| 122 | |
| 123 | # 检查已知 UEFI 恶意软件模式 |
| 124 | yara -r uefi_malware.yar firmware.rom |
| 125 | ``` |
| 126 | |
| 127 | ``` |
| 128 | 已知 UEFI Bootkit 检测点: |
| 129 | ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ |
| 130 | LoJax(APT28): |
| 131 | - 修改 SPI 闪存 |
| 132 | - 添加 DXE 驱动,在 Windows 启动时植入 agent |
| 133 | - 持久化于操作系统重装和磁盘更换之后 |
| 134 | |
| 135 | BlackLotus: |
| 136 | - 利用 CVE-2022-21894 绕过 Secure Boot |
| 137 | - 修改 EFI 系统分区引导程序 |
| 138 | - 在启动时安装内核驱动 |
| 139 | |
| 140 | CosmicStrand: |
| 141 | - 修改 CORE_DXE 固件模块 |
| 142 | - 在启动期间挂钩内核初始化 |
| 143 | - 将 shellcode 植入 Windows 内核内存 |
| 144 | |
| 145 | MoonBounce: |
| 146 | - SPI 闪存植入于 CORE_DXE 模块 |
| 147 | - 修改 GetVariable() 函数 |
| 148 | - 通过启动链部署用户态植入物 |
| 149 | |
| 150 | ESPecter: |
| 151 | - 修改 ESP 上的 Windows Boot Manager |
| 152 | - 修补 winload.efi 以禁用 DSE |
| 153 | - 加载未签名的内核驱动 |
| 154 | ``` |
| 155 | |
| 156 | ### 步骤 4:检测内核级 Rootkit 行为 |
| 157 | |
| 158 | 分析运行中系统的 rootkit 工件: |
| 159 | |
| 160 | ```bash |
| 161 | # 用于 rootkit 检测的内存取证 |
| 162 | # SSDT 挂钩检测 |
| 163 | vol3 -f memory.dmp windows.ssdt | grep -v "ntoskrnl\|win32k" |
| 164 | |
| 165 | # 隐藏进程(DKOM) |
| 166 | vol3 -f memory.dmp windows.psscan > psscan.txt |
| 167 | vol3 -f memory.dmp windows.pslist > pslist.txt |
| 168 | # 对比以发现隐藏进程 |
| 169 | |
| 170 | # 内核回调注册(rootkit 注册回调用于过滤) |
| 171 | vol3 -f memory.dmp windows.callbacks |
| 172 | |
| 173 | # 驱动分析 |
| 174 | vol3 -f memory.dmp windows.driverscan |
| 175 | vol3 -f memory.dmp windows.modules |
| 176 | |
| 177 | # 检查未签名驱动 |
| 178 | vol3 -f memory.dmp windows.driverscan | while read line; do |
| 179 | driver_path=$(echo "$line" | awk '{print $NF}') |
| 180 | if [ -f "$driver_path" ]; then |
| 181 | sigcheck -nobanner "$driver_path" 2>/dev/null | grep "Unsigned" |
| 182 | fi |
| 183 | done |
| 184 | |
| 185 | # IDT 挂钩检测 |
| 186 | vol3 -f memory.dmp windows.idt |
| 187 | ``` |
| 188 | |
| 189 | ### 步骤 5:引导流程完整性验证 |
| 190 | |
| 191 | 验证整个引导链的完整性: |
| 192 | |
| 193 | ```bash |
| 194 | # 验证 Windows Boot Manager 签名 |
| 195 | sigcheck -a C:\Windows\Boot\EFI\bootmgfw.efi |
| 196 | |
| 197 | # 验证 winload.efi |
| 198 | sigcheck -a C:\Windows\System32\winload.efi |
| 199 | |
| 200 | # 验证 ntoskrnl.exe |
| 201 | sigcheck -a C:\Windows\System32\ntoskrnl.exe |
| 202 | |
| 203 | # 检查测量启动日志(如有 TPM) |
| 204 | # Windows:BCDEdit /enum firmware |
| 205 | bcdedit /enum firmware |
| 206 | |
| 207 | # 验证 Secure Boot 状态 |
| 208 | Confirm-SecureBootUEFI # PowerShell 命令 |
| 209 | |
| 210 | # 检查引导配置是否被篡改 |
| 211 | bcdedit /v |
| 212 | |
| 213 | # 查找引导配置更改 |
| 214 | # testsigning:应为 No |
| 215 | # nointegritychecks:应为 No |
| 216 | # debug:应为 No |
| 217 | bcdedit | findstr /i "testsigning nointegritychecks debug" |
| 218 | ``` |
| 219 | |
| 220 | ### 步骤 6:记录 Bootkit/Rootkit 分析结果 |
| 221 | |
| 222 | 整理综合分析发现: |
| 223 | |
| 224 | ``` |
| 225 | 分析 |