| 样本简介
TrickBot是世界上最臭名昭著且适应性最强的僵尸网络恶意软件之一,该恶意软件在《》排名在第二位。据报道和微软赛门铁克、ESET、FS-ISAC和Lumen的合作伙伴称,迄今为止,TrickBot僵尸网络已经累计感染了超过一百万台计算机。
UEFI(Unified Extensible Firmware Interface)是一种详细描述全新类型接口的标准,是适用于电脑的标准固件接口,旨在代替传统BIOS,UEFI旨在提高软件互操作性和解决BIOS的局限性。
TrickBot病毒最早以银行木马身份出现在2016年,2019年深信服千里目安全实验室 团队就对TrickBot的演变进行了总结。可以参考链接
https://www.secpulse.com/archives/120146.html。微软和其他公司于10月份捣毁了该恶意软件的僵尸网络,然而此次TrickBot复仇式攻击的方式更偏向于Bootkit功能,和以往不同的是,此次发现的TrickBot变种使用商业软件RWEverything工具的RwDrv.sys驱动程序来检查包含UEFI / BIOS固件的SPI闪存芯片,通过检查是否启用BIOS写保护来检查是否可以修改固件。UEFI/BIOS初始化过程要先于操作系统,一旦感染此种病毒即便重装系统也无法清除,这也给安全厂商的彻底清除工作带来了巨大的挑战。由此看来,针对BIOS/UEFI的硬件攻击将来会成为更有持久性更有挑战性的攻击方式。
| 流程图
| 病毒行为分析
使用PEStudio查看到病毒最早编译时间是在今年10月19日的19:21:09时间,直到11月9日第一次被提交到VirusTotal。可见病毒可能已经隐藏了相当长一段时间。
恶意DLL共五个导出函数,从函数名字来看恶意软件有三种功能模块:释放恶意文件模块、释放缓冲区模块、控制功能模块。
使用X32DBG启动LoaderDll.exe直接在DllEntryPoint断下来,计算出Start导出函数相对于DllEntryPoint的偏移,从Start函数地址点设置为新的EIP开始调试。
病毒样本首先在sub_1000D554地址函数处使用SID相关操作函数和IsUserAnAdmin函数,主要目的是判断程序是否运行在管理员权限下。
如果是当前运行程序环境具有管理员权限则创建新线程执行恶意行为。
新线程中首先使用GetWindowsDirectory函数获取Windows的目录“C:Windows”并拼接出rwdrv.sys的释放路径字符串。TrickBot使用来自https://github.com/andrivet/ADVobfuscator的字符串和库调用混淆库,DLL中的大多数字符串都被混淆了。
病毒不是将混淆字符串包含在可执行文件的数据部分中,而是将所有字符串编码为内联指令,以将混淆字符串写入本地堆栈帧缓冲区,然后在使用时立即对其进行解码。如上图所示,病毒在栈中通过拼接字符串形成了RwDrv.sys驱动的最终释放路径,并和 ”wb”一起放入栈中准备使用。其中”w”代表write写入,“b”表示二进制数据形式写入。
从逻辑上看出释放驱动之后使用OpenSCManagerA、CreateServiceA、StartServiceA函数注册服务形式用来加载释放出的RwDrv.sys。
通过暴力异或(最多256种可能)并搜索PE结构的十六进制特征的方法得到解密RwDrv.sys的异或密钥是0x75h并从中获取大小为11776 字节的驱动程序。
同时得到以下URL:
http://ocsp.thawte.com/
http://crl.thawte.com/
http://crl.globalsign.net/
http://secure.globalsign.com/
http://ts-ocsp.ws.symantec.com/
http://ts-aia.ws.symantec.com/
http://ts-crl.ws.symantec.com/
经查询这些都不是恶意URL。
解密得到的驱动具有正常的数字签名,但Rootkit一般都会用带有签名的驱动,这里还不足以说明它是白文件。
通过在VirusTotal搜索样本哈希值确定该PE驱动是正常商业驱动程序RwDrv.sys。由于驱动是白文件,这里不再进行驱动的逆向分析。
RwDrv.sys是RWEverything的驱动。该工具是一种非常强大的底层硬件内存读写工具。其强大的硬件读写能力与方便的接口经常被底层硬件开发人员使用。如图是RWEverything官网中的介绍,从介绍中可以得知该工具几乎可以修改所有硬件内存,包括BIOS、PCI、DIMM SPD、SMBus设备、CPU的MSR寄存器等。
上图是用RWEverything来读取主机MBR数据的使用测试,从界面图标也可以看出该工具的硬件操作空间很大,该进程运行时释放并加载了RwDrv.sys驱动程序。遗憾的是该工具对外并不开放源代码。
既然有驱动就肯定存在用户层与内核层的通信。病毒文件通过八次调用DeviceIoControl函数打开驱动设备并用八种IOCTL控制码控制RwDrv.sys,分别是0x222808,0x22280C,0x222810,0x222814,0x222818,0x22281C,0x222820,0x222824。
通过windbg解析IOCTL控制码格式可以知道设备类型是0x22,代表(FILE_DEVICE_WINLOAD) (FILE_DEVICE_USER_MODE_BUS) (FILE_DEVICE_USB) (FILE_DEVICE_UNKNOWN)四种可能类型,同时驱动采用缓冲I/O读写方式通信。
在函数sub_1000B4AC中由于传入固定参数2给a2,分支中DeviceIoControl函数的控制码0x22281C、0x222824、0x222814中实际只有0x222824控制码实际通信驱动程序。
通过查询相关资料得知使用RwDrv.sys驱动程序访问硬件接口来自于GitHub上https://github.com/Cr4sh/fwexpl/blob/master/src/libfwexpl/src/libfwexpl_rwdrv.cpp的函数。上表是根据相关资料总结出的控制码的对应关系。
使用I/O命令访问PCI总线配置空间。上图中该函数(先命名为PciReadReg)和Sub_1000A45A两个函数分别通过0xCF8和0xCFC端口访问CONFIG_ADDRESS寄存器和CONFIG_DATA寄存器,这两个寄存器分别对应PCI配置空间地址端口和PCI配置空间数据端口。PCI配置空间中Vendor ID标记了一个设备的生产厂商和具体的设备,比如Intel的设备Vendor ID通常是0x8086,Device ID需要厂家自定义,它们占用PCI配置空间的00h地址。而查找的目的是获得该设备的总线号和设备号。
使用病毒中的PciReadReg函数读取上面提到的VendorID,DeviceID和RevisionID字段。
PCH全称为Platform Controller Hub,可以认为是Intel公司的集成南桥,不同于CPU的是,主要用来集成一些慢速设备,例如SATA磁盘接口,USB接口,主板集成网卡等IO设备。病毒将包含的PCH设备ID存储在.data数据段的0x1002402Ch-0x100240C9h地址处,以便于查找受害主机所使用的PCH设备ID,进而确定受害主机的CPU型号。
将从硬件读取的PCH设备ID与已知的集合进行比较,以确定代码运行在哪一代特定型号的PCH和CPU上。
上表列举了几项与底层固件写入保护有关的寄存器。病毒要想把恶意代码植入进固件中就必须要检测并设置这些寄存器的值,才能绕过固件的写入保护的机制,然而部分厂商在出厂产品时默认并没有开启这些安全保护机制。
病毒在该函数中读取了BIOS控制寄存器并检查上述列表中多个寄存器的值,包括BLE(BIOS Lock Enable)、EISS(Enable InSMM.STS)、WPD(Write Protect Disable)以及指定SPI保护范围的寄存器PR0-PR5。如果符合条件,那么读取BIOS的基地址以及大小,准备进行感染写入。
读取BIOS_HSFSTS_CTL寄存器,以检查H_SCIP(SPI Cycle In Progress)位的状态。
Intel的CPU手册上对应该位的位置及解释。当SPI硬件正在处理请求时该位会被置为1,所以该函数的作用是等待SPI硬件循环直至空闲。病毒dll含有“user_platform_check.dll”字样,该病毒实际主体功能是检查受害主机是否符合感染条件,至于SPI闪存的读取和写入可以参考APT28的ReWriter_read.exe和ReWriter_binary.exe中的实现,这里不再赘述。参考链接https://www.freebuf.com/news/185828.html
此外病毒程序在整个过程中有些代码问题被曝光,在TryDisableBWP函数在检查EISS / SMM_BWP位时读取BIOS控制寄存器出现了错误。可见该病毒样本仍在研发以及测试阶段,但未来BIOS/UEFI的固件安全问题将会成为焦点。
| 病毒的一些其他功能
除此之外,病毒还通过SetUnhandledExceptionFilter()设置了一个高层的exception Filter,然后抛出一个违规访问异常。再通过UnhandledExceptionFilter函数检测进程是否处于调试状态。如果进程被调试,调试器将收到两次异常通知,否则exception Filter将修改CONTEXT.EIP并继续执行。
使用Windows API 函数 GetACP 和GetOEMCP获得当前系统的代码页编码,如简体中文是 936,主要目的是获取用户主机使用的语言。并使用IsValidCodePage 函数判断代码页的有效性。
| 总结
此次TrickBot变种植入UEFI/BIOS固件的方式和2018年APT28组织的LoJax Bootkit有很多相似之处,由此推测两个犯罪组织之间可能存在一定联系。由于病毒采用了写入硬件实现恶意代码驻留的方式,直接将恶意代码植入UEFI/BIOS中,此次Trickbot新模块的开发属于无文件攻击方式之一。从这次病毒样本的攻击情况来看,基于底层UEFI/BIOS固件的攻防将很有可能会成为未来的主战场,呼吁安全公司要及时加强底层固件安全的防护能力。深信服团队将会持续追踪此类恶意样本,持续向群众曝光黑客组织的恶意行为。
| 防护建议
一、深信服安全产品解决方案。深信服下一代防火墙AF、终端检测响应平台EDR、安全感知平台SIP等安全产品,已集成了SAVE人工智能引擎,均能有效检测防御此恶意软件,已经部署相关产品的用户可以进行安全扫描,检测清除此恶意软件,如图所示:
二、为减轻此类威胁,建议保持固件最新,启用BIOS写保护,并验证固件完整性以防止未经授权的修改。
三、可以使用诸如Intel提供的CHIPSEC之类的开源工具检查是否已启用BIOS写保护或通过Eclypsium平台检查系统是否具有BIOS写保护缺失漏洞。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...