华为数据通信产品线安全产品领域自2023年9月份以来,围绕华为终端防护与响应EDR新品推出的EDR“大安全,新思路”系列文章已经接近尾声,感谢各位华为安全爱好者的持续关注,希望这些文章能帮助您更好地了解新品利器。本期是2023年EDR期刊的收官之作,我们将带您深入了解高级威胁的常用伎俩,以及华为终端检测与响应EDR的应对方案。
高级威胁近年趋势
近年来,无文件攻击和基于内存的攻击变得越来越火热。根据研究机构的统计,2022年的无文件攻击相较于2021年,其增长速度超过了900%。需要注意的是,无文件攻击并不代表真的没有文件,而是一种攻击策略,旨在避免将真正的恶意代码放在磁盘上以避免被安全检测发现。所说的无文件,也未必是攻击全程无文件,而是其中的一部分采用了基于内存的攻击。
无文件攻击给传统安全软件的检测带来了极大的挑战,特别是对静态检测引擎来讲,在整个攻击过程中,能用于扫描的文件恶意代码成分比较少,真正的恶意部分都直接在内存中执行,所以对抗类似的现代威胁需要新的思路和产品。
华为终端检测与响应EDR团队在实际运营过程中发现,远控类无文件木马已经成为现网中最大的安全威胁。这种木马数量庞大,花样繁多,部分高级样本甚至借鉴了”三十六计”的军事思想,想方设法地隐蔽自己,对抗文件和内存检测。下面选取有代表性的样本进行分析,以飨读者。
三十六计之“李代桃僵”
白加黑远控木马是一种由黑产组织利用技术漏洞绕过终端安全软件的攻击手段,他们替换正常软件安装包并释放白加黑远控木马,从而控制用户的电脑。这种攻击手段犹如“三十六计之李代桃僵”的实现,已经由来已久,但由于其绕过终端安全软件的概率很高,所以仍然被广泛使用。最近,黑产组织“银狐”和“金眼狗”在国内用户中变得越来越活跃,他们的攻击行为对用户的网络安全构成了巨大威胁。
白加黑实际上是民间对一种DLL劫持技术(DLL Hijacking)的通俗称呼。所谓的“白加黑”,其实来说是“可信EXE”加“恶意DLL”。可信EXE一般是带有数字签名的正常EXE文件,那么“恶意DLL”当然是指与EXE在同一个目录下的恶意DLL文件。病毒借助那些带数字签名的知名程序去加载自己带有恶意代码的DLL文件,便绕过杀毒软件的主动防御,从而达到正常加载运行的目的。如果第三方软件在编写时未对调用的DLL文件进行校验,那就很容易被木马利用产生DLL劫持。
那么,为什么会发生DLL劫持呢?当一个Windows可执行文件运行时,PE Loader负责将DLL加载到进程的地址空间中。加载器会分析可执行文件的输入表,并找出其需要的DLL文件,并随后将它们一一加载。由于输入表中只包含DLL的名称而没有其完整路径,因此加载程序首先会在磁盘上搜索DLL文件。它会从当前程序所在的目录开始搜索,如果未找到,则会在Windows系统目录中查找,最后会在环境变量中列出的各个目录下查找。恶意程序利用这个特点,先伪造一个与正常DLL文件同名的DLL,并提供相同的导出函数。这样,当程序试图加载DLL文件时,它将优先调用当前目录下伪造的DLL,并执行黑客提供的导出函数。这个过程用个形象的词来描述就是,DLL文件被劫持了。
下文以华为终端检测与响应EDR团队在现网中发现的白加黑远控木马为例,分析木马的主要流程。该木马冒充正常的Telegram软件安装包,并通过搜索引擎打广告的方式提升网站排名,引诱用户到恶意网站下载假安装包。一旦安装包执行,就会将白加黑木马释放到User目录下,如图1-1所示。
图1-1白加黑木马释放的位置
在这个目录中,存在一个被签名的正常程序see.exe和一个名为libcurl.dll的文件,其中libcurl.dll包含少量恶意代码。该代码的作用是将加密文件readme.dat解密后反射加载到内存中执行。这意味着杀毒软件的静态检测很难发挥作用,而行为防御也只能检测到白名单程序的行为,因此这给检测带来了巨大的挑战。
如图1-2所示,see.exe被执行后,恶意libcurl.dll会被加载,该恶意DLL内导出函数会执行shellcode解密readme.dat文件。
图1-2白加黑木马执行流程
readme.dat实际是一个DLL文件,使用简单的异或加密。shellcode解密后会直接跳到DLL的反射加载Loader函数。该函数负责修复DLL的导入表和重定位表,然后再跳到入口点执行,如图1-3所示。
图1-3shellcode流程
反射加载器会从进程PEB结构中找到LDR_DATA成员,该成员包含三个双向链表,用于记录进程加载的模块信息。然后,加载器会从中获取kernel32.dll的基址,并遍历其导出函数,找到GetProcAddress和VirtualAlloc的地址。接着,加载器会分配内存,并将DLL文件主体代码复制到该内存中。最后,加载器会修复DLL的导入和重定位表,如图1-4所示。
图1-4反射加载器执行流程
修复完成后,反射加载器的使命已经结束,随后会将控制权交给已经在内存中加载的DLL。到这一步,用户的电脑已经被远程控制,其数据和财产都即将面临重大损失。
三十六计之“瞒天过海”
如今大多数终端防护软件都实现了用户态API HOOK。Hook英文翻译过来就是钩子的意思,在Windows操作系统中,它维护着自己的一套事件流程机制,该机制由大量的系统API函数支撑。应用程序实现某个具体功能,也是调用系统API函数根据事件流程一步步地向下执行。而钩子的作用就是在事件传送到终点前截获API函数并监控事件的传输,就像一个钩子钩上事件一样,并且能够在钩上事件时处理一些自己特定的逻辑。
HOOK的这个本领使终端安全软件能够将自身的代码融入到被钩住(Hook)的程序的进程中,成为目标进程的一个部分,并重定向Windows API(例如NtWriteVirtualMemory,这是恶意程序惯用函数,可将指定代码到其他的进程。)到自身的代码。这样,安全软件就能够检查函数参数及其上下文,判断是否需要阻止或允许该函数继续执行自身流程。
API HOOK技术上可以细分为不同类型,包括内联API挂钩、导入地址表(IAT)挂钩、导出地址表(EAT)挂钩、SSDT挂钩等。在微软引入内核补丁保护(KPP,又名Patch Guard)之前,防病毒产品一般使用SSDT挂钩。出于操作系统稳定性的考虑,微软通过Patch Guard阻止了对SSDT表的修改,导致安全产品纷纷转战用户态HOOK。
图1-5展示了NtWriteVirtualMemory是如何被安全软件HOOK后重定向到其自身逻辑的。安全软件修改了函数的前几个字节,利用JMP指令跳到自身处理流程,处理完成后再跳回原始函数执行。为了避开安全软件的HOOK,恶意程序采用了“三十六计之瞒天过海”策略,并利用各种高级技术手段,纷纷涌现出了可以绕过终端安全软件HOOK的恶意程序。其中,直接使用系统调用来绕过HOOK的恶意软件尤为突出。
图1-5NtWriteVirtualMemory
被安全软件HOOK后的结果
在现代Windows操作系统中,代码的运行级别被分为两个特权级:RING 0和RING 3。通常我们把RING 3称为用户层,RING 0称为内核层。应用程序运行于用户层,并通过操作系统提供的应用程序接口(API)获得各种运行的支持。用户层与内核层的数据是隔离的,用户层无法直接访问内核层的数据。
如图1-6所示,在Windows系统上,实际上使用了其中的两个环。应用程序运行在用户模式,相当于Ring 3;关键系统组件(如内核和设备驱动程序)运行在内核模式,对应Ring 0,操作系统通过系统调用实现用户层和内核层代码的切换,具体来讲是由ntdll库文件封装了系统调用序号,并负责切换到内核模式。
图1-6特权级别
从图1-7中,我们可以看到ntdll中的大多数系统API的实现非常简单,只需要进行参数赋值后,就直接将系统调用号保存到寄存器中,然后调用syscall指令切换到内核模式。然而,这种简单的实现方式也为恶意程序提供了机会,它们可以轻松地按照这个模板获取函数的系统调用号,并直接调用syscall指令来完成指定功能,从而绕过了安全软件对函数头字节的修改和重定向。
图1-7系统调用序号
图1-8展示了华为终端检测与响应EDR团队在现网发现的一个CobaltStrike远控木马运用直接系统调用绕过安全软件的检测。
图1-8CobaltStrike
远控木马运用直接系统调用
木马启动后,首先读取PEB->LDR_DATA结构,找到ntdll.dll的基地址。接着,在ntdll的导出表内循环比较预置的API HASH,该hash使用djb2算法生成。木马查找的函数主要包含一些内存操作API,如NtAllocateVirtualMemory、 NtProtectVirtualMemory等。当找到目标函数后,在函数体内比较机器码(0x8B、0xD1、0xB8),这三个码恰好对应了上述函数体内的mov r10、rcx指令。匹配成功后,下一条指令中正好保存了函数的系统调用号,从而可以被木马获取。此技术也被业内称为Hell's Gate (地狱之门)。
但是现实环境往往比较复杂,木马仍有可能遇到一些挑战,例如安全软件已经HOOK了需要调用的函数,导致函数的前5字节已经被破坏,这使得木马无法通过搜索机器码的方式获取系统调用号。在这种情况下,该样本还应用了其他技术。
如图1-9所示,Ntdll导出的函数中,有个规律是对应的函数系统调用号是根据函数地址从上到下逐渐递增分配的。
图1-9递增的系统调用号
木马在判断函数被HOOK后,会搜寻周围没有被HOOK的函数,并根据上下文关系计算出所需函数的系统调用号,如图1-10所示。
图1-10木马搜寻系统调用号的过程
此技术在业内也被称为Halo's Gate (光环之门)。
三十六计之“借刀杀人”
随着终端安全软件对内存空间检查的深入,一些比较流行的内存执行手段已经被防守方注意到并加以拦截,比如在内存中突兀的RWX内存块。在此背景下,高级攻击者开始部署越来越复杂的方法来将恶意代码隐藏在正在运行的系统上。其中一种技术就是华为终端检测与响应EDR团队在现网远控样本上观察到的Module Stomping“模块踩踏”技术,它会用恶意代码覆盖已加载的动态库模块,从而掩饰自己在内存中的痕迹。
传统的进程注入或者内存加载技术一般会涉及到多个敏感API调用,比如CreateRemoteThread 、WriteProcessMemory 、VirtualAlloc 、VirtualProtect等。这会带来两个问题,首先是这些敏感API容易被安全软件拦截,另外一个是内存中往往会有新增的带有可疑权限的模块。而模块踩踏技术不会主动进行内存分配,也没有异常的反射加载事件,因此想依靠一些简单的IOC来检测会非常困难。
为了实现模块踩踏,木马会先加载一些它不需要的合法模块。接着,它会在模块代码段中寻找空闲区域,并将该区域的权限更改为可写。最后,木马会将恶意代码复制到该区域,并将权限修改为可读可执行。这样,恶意代码就能隐藏在合法模块内存中,而且不会增加新的内存区域,权限也是合法的。这种策略类似于《三十六计》中的“借刀杀人”,让安全软件难以检测和防御。安全软件的内存扫描需要对照合法模块的硬盘文件与内存范围来检测,这对于实时扫描器来说是一项巨大的性能挑战。
如图1-11所示,恶意模块会加载user32.dll,并搜寻代码段上的空闲区域。
图1-11恶意模块搜索空闲区域
搜索到空闲区域后,修改内存权限,将恶意代码写入并跳转执行,如图1-12所示。
图1-12恶意模块搜索到空闲区域后的行为
至此,恶意代码已经被执行,但是从内存中看来不会有什么异常区块,给安全软件带来相当大的检测难度。
结束语
华为终端检测与响应EDR在与后门的对抗中,逐步形成了独特的思路和打法。通过轻量级的终端Agent截获终端的API、进程、网络、文件等系统行为,并结合独创的内存威胁溯源图,对全攻击链路进行行为分析,实现对后门木马的精准检测与关联,最终将整个攻击链路展示在图上,方便用户进行溯源、事件响应等。
针对上述流行的高级威胁攻击方式,华为终端检测与响应EDR选择迎难而上,制定了多层防护体系。首先,记录恶意程序的关键行为序列,结合独创的AI序列识别算法,精准识别白加黑威胁。其次,在进入内存的关键路径上,华为终端检测与响应EDR能智能将无文件高级威胁扼杀于攻击起始点。最后,即使有万分之一的概率木马绕过了前述检测,华为终端检测与响应EDR的深度系统监测模块还可以对进程做全面分析,高效识别模块挖空、反射注入、远程线程、系统关键白进程利用等高级内存攻击场景。此外,华为终端检测与响应EDR不仅能检测高级威胁,还能从恶意样本中提取攻击组织关键基础设施信息,方便用户取证和定位,从而在复杂的网络世界里保护企业的数字资产安全。
华为安全大咖谈 | 华为终端检测与响应EDR 第05期:挖矿木马防御新视角:从攻击链检测到深度处置
华为安全大咖谈 | 华为终端检测与响应EDR 第04期:如何对高级勒索攻击说“不”
华为安全大咖谈 | 华为终端检测与响应EDR 第03期:全栈数据采集如何使威胁“被看到”
华为安全大咖谈 | 华为终端检测与响应EDR 第02期:什么利器让病毒无所遁形
华为安全大咖谈 | 华为终端检测与响应EDR 第01期:小身材如何撬动安全大乾坤
原文标题:华为安全大咖谈 | 华为终端检测与响应EDR 第06期:斩杀幽灵-高级威胁之三十六计
文章出处:【微信公众号:华为数据通信】欢迎添加关注!文章转载请注明出处。
-
华为
+关注
关注
216文章
34433浏览量
251691
原文标题:华为安全大咖谈 | 华为终端检测与响应EDR 第06期:斩杀幽灵-高级威胁之三十六计
文章出处:【微信号:Huawei_Fixed,微信公众号:华为数据通信】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论