EDR检测与绕过原理
在创建R3进程的时候,EDR会hook用户层的相关windows API调用,从而完成对进程动态行为的监控。比如,hook VirtualAlloc,监控内存分配。hook CreateProcess,监控进程创建。可以在用户层完成hook,也可以在内核层hook。用户层hook的好处是对性能的影响较小,相对于内核层hook更稳定,不容易导致系统蓝屏,所以很多EDR会选择在用户层hook,同时在内核层使用回调监控重要的内核api调用。一个进程分配了RWX属性的内存,或者修改了内存属性,将RW的内存修改为了RWX,由于RWX内存属性是shellcode或反射型DLL加载所用的内存属性,因此EDR会对申请的内存进行扫描,匹配到恶意软件的yara规则后,将会杀死恶意进程,并向控制中心发送告警。为了避免在用户层被EDR hook的敏感函数检测到敏感行为,利用从ntdll中读取到的系统调用号进行系统直接调用来绕过敏感API函数的hook。
SysWhispers2
国外的师傅开源一个仓库SysWhispers2,代码原理是从内存当中的ntdll中根据导出函数的地址顺序,确定系统调用号。SysWhispers2的优点是对于开发者而言,只需要正常调用Nt*系列函数即可,封装比较便捷,缺点也很明显,会增加代码所占用空间。
首先程序需要调用SW2_PopulateSyscallList从内存当中搜索NTDLL内存模块,需要注意的是,这里作者是通过名称比较来判断的。
找到这个ntdll模块之后,遍历导出函数表确定导出的Zw的函数地址,并保存到全局syscall表中。
对函数地址倒序排序存储,系统调用ENTRY的数组下标即为系统调用号。
这之后就可以像调用正常的Nt*函数一样直接走syscall调用,syscall的调用号通过预先定义的HASH值从存储的函数数组中搜索,比较相等的函数HASH的下标即为调用号。
Hell’s Gate
Hell’s Gate方式是另一种syscall动态调用方案,其原理是从内存中已经加载的ntdll.dll模块中通过解析导出表,定位函数地址,再通过特征码获取系统调用号,这种方式的好处是可以准确的获取系统调用号,缺点是需要一个干净的内存ntdll模块,否则将无法完成syscall调用号的获取(遇到hook ntdll系统调用的EDR就不行了)。
首先获取进程PEB信息,并判断系统版本,如果不是windows 10,则直接退出程序。
获取导出表信息,如果没有找到导出表,则直接退出。
通过遍历导出表,找到与函数HASH相同的地址信息,然后简单粗暴的比较几个字节,判断函数是否被HOOK,如果被HOOK就直接返回FALSE。
最后通过传入函数获取到的系统调用号,执行payload,完成direct syscall调用。
Halo’s Gate
Halo’s Gate是对Hell’s Gate的增强。Halo’s Gate的原理是EDR不可能HOOK全部的Nt*函数,总有一些不敏感的函数没有被HOOK,程序当中以STUB_SIZE(这个长度为32)上下循环遍历,找到没有被HOOK的STUB后获取其系统调用号再减去移动的步数,就是所要搜索的系统调用号。这种方式的优点是可以避免所要搜索的函数被hook之后,程序直接返回。
Tartarus’ Gate
Tartarus’ Gate其作者声称是对Halo’s Gate的增强,然而当读完代码之后,笔者觉得新增的check没有意义。
比较第一个字节和第四个是否是0xe9(jmp指令),来判断是否被hook,这种例外已经被特征码匹配所包含,所以笔者觉得新增的代码判断没有意义。
另一种获取干净的ntdll的方式
这一点已经被EDR作为异常行为监控的特点之一,可以参看检测使用syscall的恶意软件tips。原理是从系统磁盘读取一份ntdll(x86进程是C:WindowsSysWow64ntdll.dll,x64进程是C:WindowsSysten32ntdll.dll)的数据到内存,通过原始文件中的导出表数据获取没有被hook的Nt函数,进而获得系统调用号。github上有利用这一技术的poc实现,HellsGatePoc。
测试bypass效果
笔者这里以64位加载器为例,测试windows defender bypass效果。
使用shellcode生成框架生成上线的shellcode,转换为C语言数组格式,利用syscall编写的加载器执行上线,shellcode未经过编码加密。
windows defender保护状态为全开,桌面文件夹也没在排除项中。
绕过defender查杀上线成功,其他杀软请自行进行修改测试,这里只是验证syscall绕过查杀的效果。
参考文献
-
processhacker 2.39
-
Sysinternals Suite
-
SysWhispers2
-
implementing-direct-syscalls-using-hells-gate
-
Hell’s Gate
-
检测使用syscall的恶意软件tips
-
Halo’s Gate
-
Tartarus’ Gate
-
SysWhispers2_x86
知识星球介绍:
【一次付费 永久免费,到期联系运营即可免费加入】 星球面向群体:主要面向信息安全研究人员. 更新周期:最晚每两天更新一次. 内容方向:WEB安全|内网渗透|Bypass|代码审计|CTF|免杀|思路技巧|实战分享|原创工具
原文始发于微信公众号(RedCode Team):edr免杀之syscall