1. 概述
在上一篇报告中已经详细分析了bootkit的安装过程, 本篇报告主要针对已经部署的bootkit进行进一步的详细分析。
2.详细分析
1. bootmgrfw.efi分析
BlackLotus使用自签名的恶意EFI应用替换了原文件bootmgrfw.efi,将源文件重命名为winload.efi, 替换后的执行流程如下图:
BlackLotus针对受害者机器是否开启安全启动执行不同的部署行为, 当目标机器开启了安全启动时, 安装程序释放用于绕过安全启动的多个组件, 在受害者机器上用于系统启动的EFI应用也有可能已经修复了有关漏洞, 攻击者为了确保bootkit能够安装成功, 用包含漏洞的bootmgr等EFI应用进行利用绕过安全启动。
在绕过安全启动后, 对bootmgr.efi、bootmgrfw.efi和winload.efi等程序执行HOOK来获得在不同阶段获得执行恶意代码的机会, 最后解密恶意驱动并映射到内存中, 修改disk.sys的入口点为恶意驱动入口点, 当恶意驱动执行完后执行disk.sys的入口点。恶意驱动解密PE文件并注入到系统进程winlogo.exe。
1.关闭基于虚拟化的安全功能(vbs)
为了绕过基于虚拟化的安全对恶意驱动的检测, 使用设置EFI变量VbsPolicyDisabled的方式关闭该功能。
2.加载winload.efi
加载winload.efi到内存中用于执行正常的操作系统启动流程。
3.hook程序winload.efi函数
对winload.efi(原bootmgrfw.efi)程序的函数进行hook, 该函数用于为恶意驱动分配足够的内存。
当winload.efi第一次调用该函数时, 执行恶意EFI程序hook代码, 在hook代码中判断目标内存是否是PE文件或者其他类型。如果不是PE文件则不做任何处理而是直接调用原函数。
当为PE文件时, 判断subsystem是否为内核驱动或者是否为EFI应用,EFI应用还会判断是否为bootmgr.efi。如果不属于这两类则判断PE文件中是否包含资源名为bootmgr.xsl或winload.xsl的资源。
在hook代码中只对包含资源名为winload.xsl或bootmgr.xsl的PE文件做了处理。函数install_MmAllocPhy_hook主要对内存分配函数进行hook, 与前面的hook代码一样。
4.解密恶意驱动
恶意驱动与加密数据的硬编码形式存放在程序内, 并使用自定义的解密算法解密文件,解密后的数据被抹去了PE文件头,用于防止内存DUMP。
如果解密后的数据头两个字节为KH,则表示数据解密成功, 继续hook下一阶段要用的函数。
OslArchTransferToKernel:该阶段处于操作系统内核和一些系统驱动程序已经加载到内存但是还没执行的时刻, 是对其他内核程序或者代码进行patch的完美时机。
BlImgAllocateImageBuffer:用于分配恶意驱动所需的内存
当函数OslArchTransferToKernel执行时,首先执行的是恶意EFI应用的代码,在该函数内对内核驱动disk.sys进行挂钩, 将该文件的入口点替换成恶意驱动的入口点,在恶意驱动执行完后再执行驱动disk.sys的入口点。
这样做的目的是为了在系统初始化的早期阶段执行内核驱动,避免被发现。
在遍历内核模式时顺便对两个驱动文件进行patch, 使其立即返回不执行其驱动入口代码,这两个驱动程序为WdBoot.sys和WdFilter, 分别是Windows Defender ELAM驱动程序和Windows Defender文件系统过滤程序。
2.恶意驱动
当操作系统内核执行驱动disk.sys的入口点函数时,已安装的hook会将其跳转到恶意驱动的入口点, 恶意驱动将HTTP下载程序注入到系统进程winlogo.exe中。
1. 注入http下载程序到winlogon进程
系统启动后,恶意驱动会一直等待进程winlogon执行,然后注入恶意程序到该进程。
在不存在内核调试器的情况下,解密内嵌在驱动文件内的程序并注入到winlogon进程内,在其进程空间内通过创建线程的方式执行恶意程序。
2.检测内核调试器
恶意驱动查询系统属性SystemKernelDebuggerInformation来判断是否存在内核调试器,如果不存在则开始注入恶意程序到winlogon进程。
3.文件保护
为了保护位于ESP目录上的bootkit文件,内核驱动程序使用了一种比较简单的方法。
恶意驱动打开所有需要保护文件,复制并保存它们的句柄,并将HandleFlags设置为1从而保护句柄不被其他任意进程关闭, 间接达到阻止任何试图删除或者修改受保护文件的尝试。
如果受害者使用ARK等具有较高权限的工具删除了受保护的文件,恶意驱动在循环中检测文件是否存在,如果检测到了被删除则会触发蓝屏作为另一种保护。
4.与HTTP下载程序通信
恶意驱动通过section对象的方式接收来自用户层的HTTP下载程序的命令并执行, 事件名格式为如下,
\BaseNamedObjects\{网卡设备mac}
位于用户层的程序将指令写入事件对象内, 恶意驱动读取该section对象获取指令并执行,恶意驱动支持的指令如下:
指令 | 描述 |
0x55(U) | 卸载bootkit, 删除bootkit文件 |
0x49(I) | 执行任意恶意驱动 |
卸载bootkit时删除所有bootkit相关文件,并将winload.efi恢复源文件名Bootmgrfw.efi。
指令为I时执行任意驱动程序,包括无数字证书的内核驱动。
5.ATT&CK矩阵
Tactic | ID | Name | Description |
Resource Develpment | T1588.005 | Obtain Capabilities:Exploits | 利用已知漏洞绕过UEFI Secure Boot |
Execution | T1106 | Native API | 使用Windows 内核 API函数 |
T1559 | Inter-Process Communication | 与内核层驱动通信使用section对象 | |
Persistence | T1542.003 | Pre-OS Boot: Bootkit | 将恶意文件部署在EFI系统分区内用于可持久化执行 |
Defense Evasion | T1497.001 | Virtualization/Sandbox Evasion: System Checks | 检测vmware、sanbox等虚拟化软件 |
T1622 | Debugger Evasion | 检测调试器 | |
T1014 | Rootkit | 恶意驱动保护bootkit文件不被删除 | |
T1055.002 | Process Injection: Portable Executable Injection | 内核驱动注入恶意程序到进程winlogon.exe | |
T1027.009 | Obfuscated Files or Information: Embedded Payloads | 恶意文件使用AES加密并嵌入在文件内 | |
T1027.007 | Obfuscated Files or Information: Dynamic API Resolution | 动态解析windows API | |
T1112 | Modify Registry | 修改注册表关闭HVCI功能 |
最后更新: 2023年10月17日 14:56:45
本文链接: http://shxi.cc/post/603ce62c.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!