没有找到适合的图片
好久没写博客了发一篇笔记
MBR Bootkit不在叙述写这个的还是比较多的,UEFI Bootkit相较于MBR Bootkit从某种意义上来说开发要更为方便因为UEFI具有统一规范可以直接使用C/C++上手开发。
在正式介绍前先来简单说一下UEFI下Windows启动过程
- 基本过程如下
PC开机,加电自检固件UEFI加载执行,初始化硬件 - 固件UEFI根据启动项从EFI分区中加载并启动
\EFI\Microsoft\boot\bootmgfw.efi
(Windows boot manager) - bootmgfw.efi加载启动Winload.efi(Windows Os loader)
- Winload.efi加载执行Ntoskrnl.exe并将控制权移交给操作系统
我们此次开发的Bootkit从第二步入手直接替换bootmgfw.efi,为我们的loader,这个loader只有一个功能执行我们的UEFI驱动。我们的UEFI驱动在后门环境部署完成后回去加载执行原始的bootmgfw.efi进入正常的Windows引导流程(我们以上内容皆在Secure Boot关闭状态下为前提,如果Secure Boot开启会在执行我们的loader的时候就卡死因为签名校验不过)
UEFI驱动入口点如下
1 | EFI_STATUS EFIAPI UefiMain(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE* SystemTable) |
我们首先HOOK掉ExitBootServices因为此处是一个关键函数。
在Winload.efi中会对这个函数进行调用,此函数的作用是结束启动服务(EFI Boot Service)标志着操作系统已经准备就绪,官方文档
我们HOOK这里的目的是为了寻找被加载到内存中的ntoskrnl。为了寻找到ntoskrnl,我们需要先找到LOADER_PARAMETER_BLOCK这个结构体存储着所有的模块信息(具体请参照OslLoaderBlock函数)找到之后我们就可以开始遍历
随后搜索内核中的KeInitAmd64SpecificState函数这个是PG初始化执行的函数我们需要对它进行修补
继续搜索StartFirstUserProcess函数,这函数在内核中负责启动SMSS进程,但是我们并不能在这里直接HOOK它因为此时我们还处在物理地址,而StartFirstUserProcess函数在保护模式是虚拟地址等会系统启动我们需要转换后才能HOOK,我们这里只记录一下函数地址
在UefiMain函数中我们曾设置了一个回调函数NotifySetVirtualAddressMap,当os loader调用SetVirtualAddressMapEvent函数就会通知我们此时我们就可以在NotifySetVirtualAddressMap函数中通过ConvertPointer转换物理地址与虚拟地址对StartFirstUserProcess函数进行hook
剩下的就等待内核调用StartFirstUserProcess,然后我们创建一个系统线程去执行操作并调用原始的StartFirstUserProcess函数
在KernelMainThread线程里我们主要操作就是设置一个进程回调
设置进程回调的目的是等待用户登录时创建explorer.exe进程,当截获后我们就可以向其中注入shellcode
替换文件
1 | PS C:\Users\Admin\Desktop> Get-Volume | Select DriveLetter, FileSystemLabel, FileSystemType, Size, Path | Format-Table -Autosize |
当用户登录时会自动向其中注入shellcode启动木马
项目代码
https://github.com/WBGlIl/Test_UEFI
编译请替换samples.default.props文件中的EDK_PATH和LibraryPath
目标系统版本:Windows 21H1
总结
UEFI Bootkit木马的一大难题在于Secure Boot,上面我们演示了非固件类的UEFI Bootkit,固件的类的UEFI Bookit可以做到即使更换硬盘都不会失效极其隐蔽但是固件UEFI需要写入SPI,这需要绕过多种保护措施但是一旦成功效果会非常好
相关参考
https://github.com/SamuelTulach/rainbow
https://wikileaks.org/ciav7p1/cms/page_36896783.html
https://uefi.org/sites/default/files/resources/UEFI-Plugfest-WindowsBootEnvironment.pdf
https://www.4hou.com/posts/PrM2