终端入侵检测及防御规避之旅
2022-9-21 17:42:6 Author: 绝对防御局(查看原文) 阅读量:32 收藏

本文结构流程引用和部分有趣的图来源于 @ethan 在Div0上分享的议题 —— Evasion Adventures - A brief summary of modern offensive tradecraft  并结合笔者在终端入侵检测实践过程中的参考总结。

目前国内安全攻防的主流从服务器上的安全攻防逐渐走到了终端安全(钓鱼佬太多)。一方面原因在于大部分服务器对于其攻击面的收敛且HIDS基本已成为标配,蓝队对于检测能力的提升也使得红队的攻击一次次受挫,而在个人终端(Windows/Mac)上,由于通常只存在反病毒软件(AV),大部分企业的办公网内缺乏检测能力、用户本身安全意识参差不齐导致短板效应明显、攻击方能够获取的数据敏感度更高等方面原因也使得办公网下的终端逐渐成为攻击者的首选。

本文从红队/蓝队的攻防视角概述了对传统AV以及当前Windows EDR中常见检测及规避检测技术,并总结归纳了其中一些有趣的攻防手法,值得参考收藏品读。

0x00 Red VS Blue

前言先聊聊红蓝对抗,红队(攻击方)在实际对抗中的目的就是评估实际安全防御的有效性以及提供给蓝队(防守方/响应方)一个实战的场景,测试其防守响应能力。这点是国内目前部分做安全攻防团队所忽视的(或只是噱头),如果一次实际安全对抗没有提升防御水位,防御方无能力感知而做的"红蓝对抗",那和实际渗透测试是没什么区别的。红蓝对抗并不是Pentest,不能只沉迷并止步于漏洞利用,实际的入侵者会做更多的后渗透行为,更多的隐蔽的权限驻留、提权、横向移动,其中防御规避是红队在整体攻防中一个非常重要的阶段。而当防守方发现安全威胁时,需要能够做出直接阻断、威胁狩猎、反向查询IOC 等等操作进行安全攻击缓解/阻断,一旦蓝队意识到红队的入侵行为,红队达到实际的攻击目的就会变得更加困难。

Red team:  We much rather blue doesnt know we exist, rather than try to fight the them to stay in the network.

0x01 AV and EDR

返回主题,我们聊聊终端上最常见的传统反病毒软件(AV)的检测以及最近几年兴起的EDR检测。

1.传统反病毒检测方式

传统端上威胁检测方式,基本属于传统AV检测的范畴内。

包括:

  • 基于签名检测(特征码检测)
  • 沙盒分析(启发式)
  • 检测已知恶意结构,文件签名,函数等。

以上基本是对于恶意文件的检测,对于红队来说常见绕过检测的方式有:

  • 特征码混淆
  • 反调试、反逆向、反沙盒
  • 修改已知恶意结构

都是常见bypass AV的操作,但是如上的传统病毒检测模式已经不能适用如今的实际安全对抗,攻击者可以随意的通过各种手法进行免杀绕过、异或是通过可信二进制文件执行脚本(LOLbin已经不计其数了),防守方加的特征码针对于已知威胁,检测能力覆盖远不能达到发现实际威胁的目的。

2.目前的AV/EDR检测方式

端上检测,基于用户行为包括进程、注册表、网络等数据,统一上传到服务端进行分析检测发现威胁,当然对于比较明显的行为也能直接在端上进行第一时间的阻断,实际上可以把其类比于服务器上的HIDS,对应产品的我们通常称之为EDR(Endpoint Detection & Response)

当然也有部分主动防御的AV集成了上面的部分能力,部分EDR也会集成杀软的功能,用与终端安全的互补,甚至还有结合DLP的产品。

Endpoint Detection and Response (EDR), also referred to as endpoint detection and threat response (EDTR), is an endpoint security solution that continuously monitors end-user devices to detect and respond to cyber threats like ransomware and malware.
-- From CrowdStrike.

最重要的是通过EDR我们拥有了看见数据的能力,通过数据的统一分析存储,蓝队可以通过这些数据做安全分析、事件回溯排查等等拥有之前反病毒软件完全不具有的能力。

而EDR通常在收集端上主机数据后,标记异常行为以进行分析,并通过编写相应规则检测TTP和针对非基线的异常行为进行检测。

蓝队可以对特定文件/主机生成基线,其中不限于对文件的行为、进程链、外连请求的IP/Domain。而常规恶意文件本身经常访问/执行一些非基线下的操作,有着异常进程链,我们从传统基于特征转变为基于行为的检测方式。

0x02  检测技术

1.ASMI / ETW

这里举例了2个Windows端上原生内置安全常用的数据收集机制 -- AMSI和ETW。

AMSI(Antimalware Scan Interface) ,在内存中扫描恶意代码并且可以转发至av用于检测恶意程序执行,具体API落于amsi.dllAMSI内置于Powershell中,所以会经常见到很多Powershell恶意利用都需要先去bypass AMSI,其中有许多有趣的方法,后续会部分介绍到,但这个不是我们的主要内容。

ETW(Event Trace for Windows) 是一个高效的内核级别的事件追踪机制,它可以记录系统内核或是应用程序的事件(进程、文件、网络、注册表等行为)到Windows日志文件, Process Monitor工具以及大名鼎鼎的Sysmon也是基于ETW进行事件跟踪,有很多的EDR都是基于该数据源进行检测。

而蓝队可以通过这些Windows内置的能力进行进一步的数据收集并进行分析,从而发现安全威胁。

2. Memory scanners

基于内存的扫描,主要基于特征进行扫描,可针对于无文件的恶意行为,本身这种检测就会有一定的开销,端上可能会做些限制,比如只会基于特定函数/Syscall调用时触发(比如发现内存权限设置为rwx)才进行内存扫描。

3. Function Hooks  and  Kernel Callback

函数hook及syscall调用监控永远是主机对抗的绕不开的话题。在Windows下,蓝队通常会Hook相关的Windows API函数(kernel32)或ntdll,并获取其调用参数进行分析,发现安全威胁。

3.1 Windows函数执行流程

以上图为例,某个程序include了processthreadsapi.h 这个头文件,并执行其头文件的CreateRemoteThread这个API函数调用(这个Win32 API常用来进行线程注入),经过基础的函数参数验证,会调用ntdll.dll中的非导出函数NtCreateThreadEx,通过这个函数执行系统调用(通常是将系统调用号SSN放入EAX(RAX),之后执行syscall(systenter)),交到内核态执行线程创建,完成后将结果返回到用户态。

所以假设防守方需要进行Function Hook监控,无非是在常见的Win32 API(kernerl32.dll) 亦或是 ntdll.dll 进行,通过Hook程序用户态内存中的上面的动态链接库,EDR可以获取正在运行的进程信息,检测可疑活动并收集信息。

当然实际的来说,对于EDR来说通常会更倾向Hook ntdll.dll中的函数,并且使用inline hook的方式,将函数第一条指令修改为跳入EDR加载库的 jmp 指令。EDR 会检查这些输入参数,进过自己的规则判断逻辑,要么放行执行命中 syscall 指令并进入内核模式,将执行返回到未导出的函数,完成正常的函数调用流程,要么 EDR 将检测到一系列被其识别为恶意的系统调用并告警或终止进程。

这里可能就有做Linux HIDS的同学会问了,应用层的Hook不靠谱,为什么不在内核进行Hook。当然这在Windows早期是通用做法,无论是当初的杀软或者rootkit基本都是修改内核态的SSDT进行Hook,但是微软在Windows XP x64之后新增了PatchGuard,保证了一定的内核系统稳定性,无论是rootkit或者是杀软都不能随意的修改内核态的函数调用及逻辑。(Bypass PatchGuard 不在此处讨论) 

当然微软同时也提供了Callback机制,使用Kernel callback可以在限定的范围内获取系统调用,而一般来说,在Windows下会使用driver(驱动)去注册Kernel callback的方式进行。

如上图,EDR通过drvier注册了 PsSetCreateProcessNotifyRoutine()的callback来监控进程启动,当用户态创建执行新进程时触发回调,使其通知EDR用户态程序执行注入到用户应用程序的虚拟地址空间,并Hook ntdll.dll来将执行传递给它自己。

0x03  防御规避

1. 规避的一些手法

那对于红队应该如何应对现有的防御手段,通过那些方式其进行突破呢?无非以下几种方式:

  • 规避数据源的收集
  • 关闭数据源
  • 数据混淆

这里提到的数据源(Data Collector) 指的是防守方端上数据获取途径的源头,在Linux上的HIDS可以通过 bash patch等方式获得shell命令行、也可以利用cn_prockprobeeBPF等方式得到系统调用的详细信息 、Windows EDR通过Kernel callback func hook、ETW进行数据收集分析。那么攻击者可以针对蓝队对应使用的方式进行专门的绕过甚至想办法关闭数据源,若数据源上没有攻击者操作的行为数据,自然不会检测到异常。

当然这块蓝队在做防御的时候也会意识到红队的可绕过方式,一样可以进行针对性攻防。这可能就是安全对抗的魅力,这里挖个坑,留个相关思路流程图,后续有机会进行详细分享写检测规则的一些心得。

2. 规避数据源收集

即使端上的数据源收集机制没有存在任何问题(包括数据不存在丢失、端上忽略的情况等),攻击者也可以直接进行绕过。比如上面举例Function Hook,攻击者可以不走函数调用通过直接系统调用的方式进行恶意代码的执行。

2.1 Direct Syscalls

虽然某些EDR可以通过Hook ntdll进行函数的劫持,但是红队同样也可以绕过,如果最终目的是执行syscall,那么红队也没必要再通过内置的ntdll去调用,直接执行系统调用即可。不过有趣的是Windows上的syscall 调用号不像Linux那样向前兼容一成不变,对于不同版本的Windows的系统调用号都是完全不一样的,甚至在一些小版本差别的系统上系统调用号都是变化的。所以在目标主机执行的时候需要知道其对应Windows的版本去获取系统调用号后硬编码的调用,或者直接通过NTDLL进行动态解析,解析获取相应汇编指令后在直接调用执行。

当然实际一个一个去反汇编ndtll.dll的API成本比较高,还得结合根据实际Windows版本,实际应用可以参考下github上的SysWhisper2/3项目。当然这种方法直接syscall调用的方式也存在一段时间了,蓝队也清楚目前需要对这种直接调用syscall的操作进行检测,比如可以直接检测相关二进制的关键字syscall,系统调用的返回地址不指向ndtll等等,这里就不细谈了。

3. 关闭数据源

当然直接通过一些方式关闭蓝队获取的数据源也是很好的手法,比如通过 Patching AMSI / ETW的关键函数使其不调用执行核心函数,删除应用层函数Hook,清除Kernel Callback等等。

3.1 AMSI/ETW patch

对于AMSI可以通过patch AmsiScanBuffer这个函数的返回值,可以看到amsi.dll 实际的流程发现存在无效参数会跳入loc_18000033E5 。

实际放入eax的值表示为E_INVALIDARG ,和流程一致表示无效参数返回,同时也表示实际AMSI检测结果为AMSI_RESULT_CLEAN

mov eax, 0x80070057 
ret

转为16进制字节数组就是如下的GetPatch返回值,之后patch即可。

针对ETW可以通过获取EtwEventWrite关键函数地址,函数的作用是记录ETW事件。我们可以获取该函数在ntdll.dll中的地址,替换为其函数的正常返回值 return 0x14

当然根据实际函数调用流程,也能对ETW用户模式和内核模式之间交互的NtTraceEvent进行patch。

3.2 Breaking Procmon via ETW

针对ETW,来自black hat 2021会议上介绍的Attacks on ETW Blind EDRs,有兴趣的同学可以研究下。


3.3 Removing function hooks from userland

如果希望将ndtll的Hook函数进行删除,可以从磁盘上复制一个干净的副本,覆盖NTDLL的整个.text部分或者找到hook点(jump xx)并用原始字节覆盖它。

实际操作上,有个RefleXXion(https://github.com/hlldz/RefleXXion)项目可以参考下。

3.4  注册Driver Kernel Callback

既然蓝队是通过驱动去注册回调的,如果红队有能写入驱动的权限,处在相同的层级下,是能够删除相关的内核回调。恶意驱动将首先定位并读取callback array,然后通过用ret (0xc3)替换其回调函数(0xFA7F)中的第一条指令来修补属于 EDR/AV 驱动的条目。

4. 数据混淆绕过

当然无论是remove hook、还是将源数据阻断,其实是和攻击者需要隐蔽性进行渗透相违背的。蓝队一样可以提前监控特定的事件函数(driver load等等)以及通过证书完整性检查等防御手段做限制,并且其中需要的获取的权限要求更高。相对常规目标来说,红队还是更倾向于将shellcode进行混淆,这两种方式(阻断数据源、对shellcode混淆/特征绕过)不能说哪个比哪个更优秀,只能说红队需要根据在不同的场景下的条件选择或结合成最优解。

基于EDR混淆绕过的方式非常多,还在不停的被挖掘出来。这里提供几个技术参考,这些技术无论红蓝队都可以想办法深挖进行绕过利用以及了解原理加以检测。

Sleep protection

https://adamsvoboda.net/sleeping-with-a-mask-on-cobaltstrike/

D/Invoke

https://offensivedefence.co.uk/posts/dinvoke-syscalls/
https://thewover.github.io/Dynamic-Invoke/

Hook Heap

https://www.arashparsa.com/hook-heaps-and-live-free/

以及这些绕过技术是否会被一些防御手段进行检测。

Last but not least.

对于安全领域来说,防守检测方经常处于被动。并且在安全产品实际应用过程中,无论是产品的设计能力、开发能力、对于数据源的开销取舍及过滤、数据处理分析能力、检测规则响应等等都是对一个安全团队实际能力的挑战。

而对于防守方来说目前正在逐步在改善这些劣势,这也是属于真正在建设安全能力路上的必经流程。

本文也只是一个引子,介绍了一些通用的终端攻防对抗手法。实际终端安全下除了检测领域,还需有许多方面需要增强(漏洞检测、自保护、阻断能力、规则建设能力、取证能力等等),同时也需要逐步提升这些方面的安全水位。

优秀的安全从业者需要保持对安全技战术的积累以及加强对系统应用/底层的熟悉并挖掘,终端也只是其中一片战场,实际的安全攻防绝不会止步于此,共勉。

参考及推荐

Understanding Sysmon Events using SysmonSimulator 

https://rootdse.org/posts/understanding-sysmon-events/

Creating AV Resistant Malware — Part 2 

https://blog.securityevaluators.com/creating-av-resistant-malware-part-2-1ba1784064bc

Blinding EDR On Windows 

https://synzack.github.io/Blinding-EDR-On-Windows/

Evasion Adventures 

https://docs.google.com/presentation/d/19CZ0ufddtOHAQ78RoEawM7_9VSN3aFglRiHQDyr1yZw/edit

A blueprint for evading industry leading endpoint protection in 2022 

https://vanmieghem.io/blueprint-for-evading-edr-in-2022/

A Beginner’s Guide to EDR Evasion 

https://kylemistele.medium.com/a-beginners-guide-to-edr-evasion-b98cc076eb9a

Kernel Karnage – Part 1 

https://blog.nviso.eu/2021/10/21/kernel-karnage-part-1/

Attacks On ETW Blind EDR 

https://i.blackhat.com/EU-21/Wednesday/EU-21-Teodorescu-Veni-No-Vidi-No-Vici-Attacks-On-ETW-Blind-EDRs.pdf

SysWhispers is dead, long live SysWhispers! 

https://klezvirus.github.io/RedTeaming/AV_Evasion/NoSysWhisper/

A Beginner’s Guide to EDR Evasion 

https://kylemistele.medium.com/a-beginners-guide-to-edr-evasion-b98cc076eb9a

Bypassing Cylance and other AVs/EDRs by Unhooking Windows APIs 

https://www.ired.team/offensive-security/defense-evasion/bypassing-cylance-and-other-avs-edrs-by-unhooking-windows-apis

Memory Patching AMSI Bypass 

https://rastamouse.me/memory-patching-amsi-bypass/

Bypassing ETW For Fun And Profit 

https://whiteknightlabs.com/2021/12/11/bypassing-etw-for-fun-and-profit/

Hiding your .NET - ETW 

https://blog.xpnsec.com/hiding-your-dotnet-etw/


文章来源: http://mp.weixin.qq.com/s?__biz=MzkxMTE5MjQ3NA==&mid=2247483848&idx=1&sn=fa061b0f5cf3dc6a4b9920c9c9c244bc&chksm=c11eb93df669302b677d5025ddb36a791b33cc2e274b0270a99d3af3e89930e2fdbd605ec126#rd
如有侵权请联系:admin#unsafe.sh