1. 概述
APT41早在2012年就开始活跃。据观察,该小组针对14个国家/地区的医疗保健,电信,技术和视频游戏行业,也进行一些经济私利驱动的入侵,尤其针对视频游戏产业,包括偷窃源代码和数字证书,虚拟货币操纵和尝试部署勒索软件。
卡巴斯基2022年曝光了恶意程序Moonbounce,并将其归因于APT41。恶意程序修改了UEFI固件中的dxe驱动文件。因为它不是存储在硬盘中,因此在格式化硬盘或者更换硬盘时不会清除恶意程序。
修改后的dxe驱动文件能够拦截和引导UEFI启动的流程,引入一个复杂的感染链,并且只在内存中运行,硬盘上没有留下攻击痕迹。这样的bootkit不仅更隐蔽而且更难以缓解。
2. 样本信息
UEFI固件中被修改的dxe驱动详细文件信息如下:
文件名 | Core_dxe |
---|---|
Md5 | 2d4991c3b6da35745e0d4f76dffbca56 |
文件类型 | EFI_BOOT_SERVICE_DRIVER |
映射到内存的驱动
MD5 | 2ce20fbf09f74a819486a7815ae8e47d |
---|---|
文件类型 | Kernel driver |
驱动APC注入到svchost的dll文件
MD5 | bcf786ac5cfe3b6e9ceacc6733827355 |
---|---|
文件类型 | Dll |
3. 流程图
3. 详细分析
3.1 UEFI启动过程
UEFI启动操作系统的过程如下:
- 完成UEFI平台初始化,完成CPU和芯片初始化。加载UEFI平台模块。
- UEFI boot manager枚举外部设备,加载UEFI设备驱动,加载boot应用。
- Windows boot manager(bootmgfw.efi)加载winows boot loader。
- Windows boot loader加载windows操作系统。
图1-来源:书籍 Rootkits and Bootkits
图1中标箭头的地方是bootkit攻击UEFI固件常用的攻击点,主要有以下几点:
- 修改未签名UEFI Option ROM里UEFI DXE驱动,使恶意代码能够在dxe stage执行。
- 修改UEFI固件中已经存在或者添加新的UEFI dxe驱动,使恶意代码能够在dxe stage执行。
- 替换windows boot manager,在UEFI固件将控制权交给系统bootloader时恶意代码得到执行。
- 添加新的bootloader
3.2 CORE_DXE
查看PE结构得知,subsystem为”EFI_driver_boot_service”,即64位的UEFI dxe驱动。
该dxe驱动编译时间为2014年,直到2022年1月份才被卡巴斯基曝光,由此可说明其隐蔽性。
从core_dxe发现一个字符串常量”E7846IMS.M30”,它就是core_dxe对应的UEFI固件名,由台湾微星公司硬件平台发布的固件更新。原core_dex文件与被修改的文件非常相似,除了三个被hook的函数。
1. EFI_BOOT_SERVICE hook
通过对efi_boot_service结构体中的三个函数进行hook,以下被hook的代码先恢复prologue,然后实现hook代码,然后返回原代码执行原流程。以下位各个被hook函数实现的hook代码。
coreAllocatePool用于分配存放驱动映射的shellcode的内存。
coreCreateEventEx用于创建传统启动方式的事件,将驱动映射的shellcode设为其回调函数。
ExitBootService 对函数OslArchTransferToKernel进行hook。
Hook后的代码如下,采用inline hook的方式将函数头部改为跳转到hook_dxe_code,三个函数都是跳转到同一个函数。
2. CoreAllocatePool函数分析
dxe驱动入口点函数为ModuleEntryPoint,创建全局结构体gDxeCoreST和gDxeCoreRT并为其分配内存时调用AllocateRuntimeCopyPool函数分配。
AllocateRuntimeCopyPool内部调用coreAllocatePool函数分配内存。
CoreAllocatePool为被hook的函数,因此进入hook_dxe_code函数。首先恢复prologue,现在rax指向的函数CoreAllocatePool没有被hook,使用”call eax”调用原函数分配内存存放用来映射windows 内核驱动的shellcode。
由于地址”rbx+0xB3”为函数CoreAllocatePool的第三个参数,分配内存成功时将该地址被覆盖成内存地址。
rbx+0xB3所在地址0x1801577EB的magic数字0x1122334455667788刚好被覆盖成刚分配的内存地址。
地址0x180157996(shellcode_1)处的shellcode第一条指令也有magic数字0x1122334455667788用刚分配的内存地址覆盖。
3. CoreCreateEventEx分析
首先恢复函数prologue,调用原函数创建针对EFI_EVENT_Legacy_BOOT的事件,回调函数被设置成地址0x1801577E7处的shellcode。当启动方式为传统启动方式时,以回调函数的形式执行0x1801577E7的shellcode,
传统启动方式启动时,直接执行驱动映射的shellcode将驱动映射并执行,如果是UEFI启动方式还需要做一些额外的工作。
4. CoreExitBootServices分析
首先恢复函数prologue。
查找函数OslArchTransferToKernel尾部指令,0xCB485541对应的指令为“push r13” 和”retfq”,将”retfq”指令修改成跳转指令”jmp 0x98000”。
5. OslArchTransgerToKernel分析
该函数的主要功能是将控制权从winload.exe或者winload.efi交接给内核入口点KiSystemStartup,在这里进行内核初始化。由于返回指令被修改,当初始化完准备返回时跳转到地址0x98000执行代码。Shellcode主要功能是找到ntoskrnl.exe的模块基址,保存到全局变量g_ntoskrnl_exe_image_base。
将地址0x18015791C处的shellcode拷贝到ntoskrnl的重定位表处,Inline hook函数ExAllocatePool跳转到shellcode2_hook。
在x64_Serach_Ntoskrnl_Export函数中通过hash来找到ntoskrnl.exe导出的三个API。
由于需要往ntoskrnl.exe写入shellcode或者修改代码,因此需要将区段属性改为可写。
Macgic数字在运行被动态修改为第一阶段使用coreAllocatePool分配的内存地址。使用x64_MmMapIoSpace将该shellcode映射到windows内核内存并执行。
恢复ExAllocatePool函数prologue, 加载恶意驱动并执行驱动入口点。
3.3驱动加载
使用函数load_driver将驱动malious_driver加载到内存。
1. 分配内存
调用ExAllocate分配足够大小的内存地址,驱动将被映射到这段内存。
2. 拷贝头部数据
3. 拷贝区段数据
4. 修复重定位
5. 解析导入表函数地址
使用RtInitAnsiString和RtlAnsiStringToUnicodeString将函数名初始化并作为MmGetSystemRoutineAddress的参数来获取对应函数名的函数地址然后写入到导入函数地址表中。
6. 调用驱动入口点
获取驱动入口点并调用。
3.4 驱动分析
驱动入口点DriverEntry使用PsSetLoadImageNotifyRoutine实现对模块加载的监控,即每当有新的模块被加载时,都会执行回调函数NotifyRoutine。
判断加载的是否是kernel32.dll并且所属进程的命令行是”svchost.exe -k”等,因为需要kernel32导出的api函数来映射pe文件到内存,所以需要等待kernel32.dll加载成功。创建结构体作为内核APC回调函数
kernelRoutine的参数。
在内核APC回调函数kernelRoutine中初始化需要传给回调函数的参数并将workItem插入Work队列中等待被执行。
在workItem的回调函数中,创建用户APC用于向svchost注入shellcode,KeInitializeApc的第6个参数为要注入的shellcode,也就是加载恶意dll的代码,最后一个参数为保存着加载dll时需要用到的数据,比如api地址、恶意文件等等。
3.5 恶意dll分析
查壳后得知被加了MPRESS壳,脱壳后查看代码得知主要功能就是下载文件。
文件下载部分代码如下,链接由dll入口点DllEntryPoint的第三个参数提供。这里给的下载链接是”hxxp://mb.glbaitech.com/mboard.dll”,可能是年代已久,现在已经失效了。
4. IOC
hxxp://mb.glbaitech.com/mboard.dll
2d4991c3b6da35745e0d4f76dffbca56
2ce20fbf09f74a819486a7815ae8e47d
bcf786ac5cfe3b6e9ceacc6733827355
5. 参考
Https://www.binarly.io/posts/A_deeper_UEFI_dive_into_MoonBounce/index.html
Https://securelist.com/moonbounce-the-dark-side-of-uefi-firemware/105468
ebook: rootkit and bootkit
最后更新: 2023年10月18日 16:12:42
本文链接: http://shxi.cc/post/e6b73205.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!