随着EDR等安全设备的不断普及以及基于行为威胁狩猎防御体系的不断完善,安全防御正逐步发展为基于情报响应和数据关联分析的综合安全运营体系。而EDR作为当下终端安全防御体系的新型解决方案,其自身存在的设计缺陷可被攻击者利用进行攻击行为的隐匿和检测绕过,因此终端安全防御中,仅仅依靠EDR的是不完整的,更需要严格的安全运营响应体系。
2021年RSAC会议上来自Optiv的安全研究员Matthew Eidelberg,分享了名为<<If EDR Is the Answer, You Asked the Wrong Question>>的议题,总结探讨现有绕过EDR检测缺陷的技术,并提出使用文件数字签名,利用windows系统文件属性手段进行伪装,以避免在突破EDR当前进程检后其他攻击行为依旧被安全团队捕获。
根据议题,国际企业现有的终端安全的攻击检测防御体系主要由三方面组成:AV/EDR等终端安全设备,自身安全运营团队和专业的第三方事件响应处理专家。
AV/EDR等终端安全设备,可以直接处理威胁并采集活动日志。后端的安全团队依赖于MSS/SOC/SIEM等设备对终端安全设备采集到的日志进行人工分类处理,排除正常活动和误报,处理异常行为和威胁。当安全团队发现复杂入侵活动而不足以应对时,将有更专业的事件响应专家处理。事件响应专家了解所有的TTPs和各种攻击手段,他们是整场游戏的终结者,当他们出现时就代表着整场入侵行动已经失败。
想象一下,在这样的一个防守体系下,你可能通过一个0day漏洞,很快的进入了目标网络并获得了一个shell,通过侦察对方的AV设备处理免杀后,开始进行常规的渗透攻击却收效甚微。在不知不觉中EDR已收集到你越来越多的活动数据,你的多项行为数据很快匹配到了一个APT攻击行为模型,引起了安全团队的注意,他们请来了专业的威胁狩猎人员分析整个的攻击链路,并清理shell修补漏洞添加规则,完善了防御机制。
当你下次攻击时,会发现比上一次更加艰难。
为了让我们的攻击行为能够得到攻击隐匿、防御规避、检测绕过的目的,需要在绕过第一道EDR防线的基础上,寻找可操作的灰色空间进行行为规避,而不引起第二道防线安全事件分析团队的注意。如果完成,即使应急响应专家进行处理时,也不会有数据和能力去做入侵分析。
如今的网络威胁已经由简单的个体炫技演变为有组织的网络犯罪和有国家情报支持的高级网络攻击。攻击者掌握了更隐蔽,持续性更强的攻击手段,使得企业和组织乃至国家不得不面临更复杂的高级威胁。在这种情况下,传统被动式的反病毒软件(AV)已经无法满足需求,而端点检测与响应(Endpoint Detection & Response, EDR)被认为是一种面向未来的终端安全解决方案,通过不同于传统的签名检测或启发式技术,EDR通过观察行为将检测技术提升到新的层次。
EDR专为检测终端上的可疑行为而设计,这些行为可能包括一系列攻击技术,例如进程执行或注入以及内存中的镜像加载。一旦识别出这些行为,EDR便开始发挥它的另一个作用,安全团队便可以根据EDR收集的端点日志,隔离受感染的主机,限制它的网络,提取内存,获取数据建立事件的时间线,这有别于传统反病毒的“检测并终止行为”,这样安全团队就可以更好的掌握该威胁信息,收集和记录威胁指标,建立模型并防止进一步的攻击产生。
通过挂钩程序用户态内存中的动态链接库,EDR可以监视正在运行的进程,检测可疑活动并收集信息,并进行基于行为的分析。
如通过挂钩kernelbase.dll中的VirtuallAlloc和Ntdll.dll中的NTAlloateVirtuall, 当应用程序调用时,就会将功能重定向到EDR自身代码,此时EDR便可以收集到相关API调用时参数等信息,然后将执行返回给系统DLL。
常见AV/EDR挂钩的用户态函数公开资料
https://github.com/D3VI5H4/Antivirus-Artifacts
https://github.com/Mr-Un1k0d3r/EDRs
现在的EDR的“钩子”代码存在于进程用户空间(Userland)中,用户空间内存可以被直接修改,因此可以被恶意代码绕过,这将导致EDR的挂钩被抹除失效,无法检测到恶意程序发起的行为活动。
自从Outflanknl在2019年6月19日的博客文章中发布了一个名为Dumpert的工具,syscall便成了最火热的EDR绕过研究方向,已有很多前辈对此已有很多详细说明,这里仅仅总结最主要的部分以便理解主题。
使用直接系统调用便是在运行的时候不加载任何的函数,而是直接使用相应的汇编来实现他们。查看ntdll的反汇编文件,我们就可以获取所包含函数的所有汇编代码。唯一存在的问题是,不同的 windows OS版本之间,程序汇编代码可能会有所不同。
自定义系统调用的汇编实现示例,使用此代码时EDR将不能够捕获到恶意软件发起的申请内存请求。
相关的公开工具和资料
“Windows X86-64 System Call Table”
https://j00ru.vexillium.org/syscalls/nt/64/
第一代syscall实现
https://github.com/jthuraisamy/SysWhispers
第二代syscall实现,通过计算导出表的字符串crc自动得到系统调用编号
https://github.com/jthuraisamy/SysWhispers2
Syswhispers和Syswhispers2当前仅支持x64 Syscall,如果需要x86 syscall, 推荐使用
https://github.com/mai1zhi2/SysWhispers2_x86
“Syscalls with D/Invoke”
https://offensivedefence.co.uk/posts/dinvoke-syscalls/
在野使用
https://www.cyberbit.com/blog/endpoint-security/malware-mitigation-when-directsystem-calls-are-used/
相关的检测技术
https://winternl.com/detecting-manual-syscalls-from-user-mode/
https://github.com/hzqst/Syscall-Monitor
通过读取磁盘中ntdll.dll的.text部分,并将其映射到内存中的ntdll.dll的.text部分之上,就可以完全解除对内存中加载的给定DLL的钩子代码,这有助于逃避依赖于UserlandHOOK的EDR解决方案。
相关的公开工具和资料
”Unhook windows apis“
https://www.ired.team/offensive-security/defense-evasion/bypassing-cylance-and-other-avs-edrs-by-unhooking-windows-apis
“Antivirus Artifacts”
https://github.com/D3VI5H4/Antivirus-Artifacts
“Unhooking in C++”
https://www.ired.team/offensive-security/defense-evasion/how-to-unhook-a-dll-using-c++
https://winternl.com/memfuck/
https://s3cur3th1ssh1t.github.io/A-tale-of-EDR-bypass-methods/
规避EDR的内存挂钩并不是攻击者着重避免检测的唯一障碍。被清除挂钩后的EDR仍然能够转发收集大量信息。该信息及其他的基于网络的监控仍然可以得出一些检测事件。例如,攻击者可以规避EDR加载到其恶意进程中的钩子,但仍将记录执行二进制文件和随后进行的脱钩的相关事件。比如,攻击者可能从用户的TEMP文件夹运行二进制文件“aw2r1941g.exE”,而可能不会触发任何EDR的警报,但当分析人员看到它时,便作为调查对象脱颖而出。即便删除了EDR的钩子,EDR仍然能够向安全团队报告此信息。
为了避免进一步的调查,议题引入说明了文件签名伪造(Code Signing)和文件属性(File Attribute)相关技术,并公开了一个伪造签名工具-LimeLighter使用该工具可以对恶意程序伪造windows系统程序属性和对其签名,这将保证恶意程序的行动看起来像是一个windows系统程序所发出的操作,一定程度上迷惑分析人员。
因为检测速度和业务兼容性的问题,AV/EDRs 并不会对每个进程和文件进行签名有效性验证,使用伪造的代码签名证书,可以增加了终端安全产品信任它的机会。
当文件缺少或含有较少文件属性时,也可能导致安全团队发生调查或告警。攻击者可以修改恶意文件的文件属性,使其看起来像是windows操作系统的一部分,结合伪造可执行文件签名一定程度可以迷惑安全团队的分析人员。
但安全团队想要识别出这种伪装windows系统文件程序的策略并不简单,这要求团队能够创建确立常见应用程序的行为指标基线,如关注其网络连接,初始位置,完整性hash和注册表项等,当出现异常行为活动时,能够快速识别威胁。
ScareCrow,议题作者开发的针对EDR绕过设计的载荷生成框架,用于将载荷通过侧载(非注入)到合法windows进程。
ScareCrow生成了一个加载器,该加载器在执行期间利用syscall技术将EDR的钩子从进程内存运行的系统DLL中清除,完成后加载程序使用sycall将shellcode载荷解密并执行,而不会被EDR检测到。
ScareCrow还会对生成的加载器使用伪造或合法的签名证书进行签名,使用合法的windows系统文件属性进行伪装。
假如根据攻击各阶段的攻击意图,我们可以将攻击行为IOC分为两大类。
第一类是目的性的攻击行为,指在攻击过程中,为了达成某些确切目的(权限提升,横向移动等)而产生的攻击行为,此类行为在高级攻击中必定存在,比如:
• 尝试读取%WINDIR%\system32\config 中的SAM文件
• 尝试读取lsass进程内存
• 访问用户浏览器cookie,密码等
• ...
针对这一类行为,它们的出现就说明已经遭受到严重攻击。如果防守方无法捕获到该类行为,则不能够确定遭受的攻击阶段和程度,无法对攻击事件进行串连分析。
另一类是辅助技术性的攻击行为,比如:
• 分配其他进程中的内存
• 创建其他进程中的线程
• 修改 appinit DLL 注册表项
• 修改 Windows 防火墙策略
• ...
这类攻击行为,常见于日志中的异常行为,如果使用议题提出的代码签名伪造和windows系统程序属性利用手段就可以对安全团队的日常日志审计造成误导,具有一定的欺骗性。
如议题中所说,蓝军研究人员需要模拟攻击者不断寻找现有的安全防线中可能存在的缺陷。在防御规避的策略上,不仅需要利用EDR等安全检测产品的缺陷实现检测绕过,还需要将自身攻击行为融入于合法的系统和网络环境中,对位于后序安全分析响应进行干扰欺骗。
为了构建更完善有效的安全防线,应对此类安全威胁,建议安全团队采取以下有效措施:
1. 收集各项活动信息,不能将信息来源仅局限于EDR等终端安全设备。
2. 建立常见应用程序行为基线。
3. 对活动的进程,文件建立时间线档案,不断更新记录其活动行为,及时审查其中出现的异常。
4. 对异常事件进行串联分析,匹配恶意攻击。
绿盟科技M01N战队专注于Red Team、APT等高级攻击技术、战术及威胁研究,涉及Web安全、终端安全、AD安全、云安全等相关领域。通过研判现网攻击技术发展方向,以攻促防,为风险识别及威胁对抗提供决策支撑,全面提升安全防护能力。