适用于基于 UEFI 平台的 SMM 后门
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这是一个已弃用的遗留项目,当前版本的后门请 查看 SMM Backdoor Next Gen 项目页面及其 文档:
https://github.com/Cr4sh/SmmBackdoorNg
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
有关此项目的更多信息,请阅读以下文章:
http://blog.cr4.sh/2015/07/building-reliable-smm-backdoor-for-uefi.html
仓库内容:
SmmBackdoor.py —— 一个 Python 程序,可以将后门代码注入 UEFI DXE 驱动程序的 PE 镜像,与已安装的后门通信以读取 SMRAM,并执行其他一些有用的操作。
SmmBackdoor/ —— 在系统管理模式(System Management Mode)下运行的 UEFI 部分源代码。
SmmBackdoor.efi, SmmBackdoor.pdb —— UEFI 部分二进制文件及其调试符号。
smm_call/ —— 概念验证(proof of concept)Linux 程序,与已安装的后门交互,为其进程获取 root 权限。
要构建 SmmBackdoor 项目,你需要一台装有 Visual Studio 2008 的 Windows 机器,以及 EDK2 源代码(https://github.com/tianocore/edk2)。
分步说明:
将 SmmBackdoor 子目录复制到 EDK2 源代码目录。
编辑 Conf/target.txt 文件,将 ACTIVE_PLATFORM 属性值设置为 OvmfPkg/OvmfPkgX64.dsc。
编辑 OvmfPkg/OvmfPkgX64.dsc,并在文件末尾添加以下行:
#
# 3-rd party drivers
#
SmmBackdoor/SmmBackdoor.inf {
<LibraryClasses>
DebugLib|OvmfPkg/Library/PlatformDebugLibIoPort/PlatformDebugLibIoPort.inf
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
}
4. 打开 Visual Studio 2008 命令提示符,并 cd 到 EDK2 目录。
执行 Edk2Setup.bat --pull 来配置构建环境并下载所需的二进制文件。
cd SmmBackdoor && build
编译后,生成的 PE 镜像文件将位于 Build/OvmfX64/DEBUG_VS2008x86/X64/SmmBackdoor/SmmBackdoor/OUTPUT/SmmBackdoor.efi
以 Intel DQ77KB 主板为例,将 SmmBackdoor.efi 作为感染载荷运行:
使用硬件 SPI 编程器转储主板固件。
在 UEFITool 中打开转储的闪存镜像。
提取 GUID = 26A2481E-4424-46A2-9943-CC4039EAD8F8 的 FFS 文件的 PE 镜像,并将其保存为 extracted.bin 文件。
使用 SmmBackdoor.py 将 SmmBackdoor.efi 注入提取出的镜像:
$ python SmmBackdoor.py --infect extracted.bin --output infected.bin --payload SmmBackdoor.efi
在 UEFITool 中,用 infected.bin 替换原始 PE 镜像。
将修改后的闪存镜像保存到文件,并使用编程器将其写入主板 ROM。
该后门还具有调试输出功能,可以在屏幕上查看 DXE 阶段的调试消息,并通过 COM 端口接收运行时阶段的调试消息。
要使用 SmmBackdoor.py,你需要安装 pefile Python 库(https://pypi.python.org/pypi/pefile)和 CHIPSEC 框架(https://github.com/chipsec/chipsec),包括其 Python 绑定。
支持的命令:
SmmBackdoor.py --infect <source_path> --output <dest_path> --payload <payload_path> - 使用指定的后门代码感染 DXE 驱动程序的 PE 镜像。
SmmBackdoor.py --test - 检查后门是否存在,并打印来自 BACKDOOR_INFO 结构的状态信息。
SmmBackdoor.py --dump-smram - 将所有可用的 SMRAM 区域转储到文件中。
SmmBackdoor.py --read-phys
- 打印给定地址处物理内存页的十六进制转储。SmmBackdoor.py --read-virt
- 打印给定地址处虚拟内存页的十六进制转储。SmmBackdoor.py --timer-enable - 启用周期性定时器 SMI,这是 smm_call 所必需的(默认已启用)。
SmmBackdoor.py --timer-disable - 禁用周期性定时器 SMI。
smm_call 用法:
smm_call [<arg_1> [<arg_2>]] - 向 SMM 后门发送指定的控制代码和参数。
-
smm_call --privesc - 请求后门为调用者进程授予 root 权限,并运行命令 shell。
请注意,此代码仅在 Intel DQ77KB 主板上测试过。你可以尝试在任何其他兼容 UEFI 的硬件上运行它,但部分后门功能可能无法正常工作。
作者:
Dmytro Oleksiuk (aka Cr4sh)