一种绕过EDR内存保护的新方法:NTDLL IAT钩子 | 申博官网
登录
  • 欢迎进入Sunbet!
  • 如果您觉得Sunbet对你有帮助,那么赶紧使用Ctrl+D 收藏Sunbet并分享出去吧
  • 您好,这里是Sunbet!

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

Sunbet_安全预警 申博 329次浏览 已收录 0个评论

一、概述

在近来的内部渗入测试中,我遇到了一个EDR产物(在本文中将不会说起产物称号)。该产物极大水平的障碍了我接见lsass内存的历程,而且使我们没法运用自定义的Mimikatz对象来转储明文的凭证。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

二、毛病的途径

现在,假设我是一个恶意软件的作者,我实际上可以编写特定的驱动程序来匹配检测和阻塞。我的第一个想法是尝试Obregistercallback,它是许多常用杀毒产品的关键。因为很多杀毒产品都是非常粗略地重新组装的恶意软件Rookit WinAPI hook,所以微软实现了这一轮。然而,在MSDN的底部,我们可以看到一行“这个回调首先在Windows Vista Server Pack 1 (SP1)和Windows Server 2008中可用”。为了提供一些缺少的上下文,我现在保存Windows Server 2003上的操作。因此,该系统缺乏阻止检测杀毒产品所需的功能。

经过几个小时的试验,我尝试应用csrss。通过csrss进行exe和实验。继续lsass.exe的句柄。毕竟,胜利获得了对lsass.exe具有PROCESS_ALL_ACCESS的句柄。通过滥用CSRSS生成过程,然后继续使用现有的lsass句柄,我们最终实现了这一点。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

但是,当我行将沉浸在高兴当中时,得到了使人扫兴的效果。EDR照样阻挠了ShellCode注入csrss,同时也阻挠了经由过程RtlCreateUserThread建立线程。由于某种原因,代码未能作为子历程天生,而且没有继续句柄,但我们依然能以某种体式格局取得lsass.exe的PROCESS_ALL_ACCESS句柄。

接下来,我们试着翻开一个lsass.exe的句柄,代码只要这一行:

HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, lsasspid);

如今,我竟然取得了一个完全控制lsass.exe的句柄。EDR没有对此举行隐约测试。在这时候,我意想到,我走向了毛病的途径,由于EDR从来没有存眷我们是不是取得句柄接见权限,而是我们接下来要举行的操纵会遭到严厉搜检。

三、回到正轨

我们已取得lsass.exe的完全控制句柄,如今能够继续前进,处置惩罚下一个症结的突破口。我们马上实验运用句柄挪用MiniDumpWriteDump(),但效果是失利的。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

我们来进一步剖析这个正告内容:“Violation: LsassRead”(违规:lsass读取)。现实上,我们并没有做任何读取操纵,只想对历程举行转储。但是,要转储长途历程,必需在MiniDumpWriteDump()中挪用某种范例的WinAPI,比方ReadProcessMemory(RPM)。我们来看看ReactOS上的MiniDumpWriteDump的源代码。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

正如人人所看到的,函数(2) dump_exception_info()和很多其他函数都依赖于(3) RPM来实行其功用。这些函数由MiniDumpWriteDump (1)援用,这能够就是题目的泉源地点。如今,我们有一些履历能够发挥作用。我们必需相识Windows体系内部事情道理,和怎样处置惩罚WinAPI的历程。以ReadProcessMemory为例,其事情体式格局以下。

ReadProcessMemory只是一个包装器,它会举行一系列健全性搜检,比方nullptr搜检。现实上,这就是RPM所做的统统。但除此之外,RPM还挪用函数NtReadVirtualMemory,该函数在实行体系挪用指令之前设置寄存器。体系挪用指令会关照CPU进入内核形式,然后挪用另一个名为NtReadVirtualMemory的函数,它实行ReadProcessMemory应当实行的操纵的现实逻辑。

— — — — — -Userland — — — —- — — — | — — — Kernel Land — — — —
 
RPM — > NtReadVirtualMemory --> SYSCALL->NtReadVirtualMemory
 
Kernel32 — — -ntdll — — — — — — — — — - — — — — — ntoskrnl

在有了上述学问后,我们如今必需肯定EDR产物怎样检测并阻挠RPM/NtReadVirtualMemory挪用。谜底实在非常简朴,就是“挂钩”(Hook)。有关挂钩的更多信息,能够参考我之前宣布的文章。简而言之,该操纵使得我们能够将代码安排在恣意函数的中央,并取得对参数和返回变量的接见权限。我非常肯定,EDR是经由过程我提到的一种或多种手艺,运用了某种挂钩手艺。

然则,读者应当清晰,大多数EDR产物都在运用效劳,特别是内核形式下运转的驱动程序。经由过程接见内核形式,驱动程序能够在RPM的callstack中的任何级别实行挂钩。然则,若是任何驱动程序挂起任何级别的函数都是眇乎小哉的,这会在Windows情况中发生一个伟大的安全漏洞。因而,必需要提出一种处置惩罚方案来防备这类性子的转变,这类处置惩罚方案就是中心补钉珍爱(又称为KPP或Patch Guard)。KPP几乎在每一个级别都举行内核扫描,若是检测到修正,将会触发BSOD。这包孕ntoskrnl局部,个中包罗WinAPI内核级别的逻辑。在控制这些配景学问后,我们能够确信,EDR不会挂钩挪用栈中的任何内核级别函数,我们就可以够运用用户空间的RPM和NtReadVirtualMemory挪用。

四、挂钩

要检察函数在应用程序内存中的地位,与具有%p花样字符串的printf和函数称号作为参数一样简朴,以下所示。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

然则,与RPM分歧,NtReadVirtualMemory不是ntdll中的导出函数,因而我们不克不及像一般情况下一样援用该函数。我们必需指定函数的署名,并将ntdll.lib链接到项目中,能力实行该操纵。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

统统停当,让我们实验运转。

————————————-

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

如今,我们得到了RPM和NtReadVirtualMemory的地点。接下来,我将运用我最喜欢的逆向对象Cheat Engine来读取内存并剖析其构造。

ReadProcessMemory:

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

NtReadVirtualMemory:

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

关于RPM函数,它看起来统统一般。它会实行一些栈和寄存器的设置,然后在Kernelbase内挪用ReadProcessMemory。终究将致使我们进入到ntdll的NtReadVirtualMemory。然则,若是我们检察NtReadVirtualMemory并相识基础的钩子是什么样的,我们就可以发明个中的非常的处所。函数的前5个字节被修正,其他字节则连结原样。我们能够经由过程检察四周的其他类似函数来推断这一点。一切其他函数都遵照非常类似的花样:

0x4C, 0x8B, 0xD1, // mov r10, rcx; NtReadVirtualMemory
 
0xB8, 0x3c, 0x00, 0x00, 0x00, // eax, 3ch — aka syscall id
 
0x0F, 0x05, // syscall
 
0xC3 // retn

个中的一个区分就是体系挪用ID(它标识了内核域中挪用的WinAPI函数)。然则,关于NtReadVirtualMemory,第一条指令现实上是对内存中其他地点的JMP指令。我们来详细看一下。

CyMemDef64.dll:

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

好吧,以是我们并非在ntdll的模块中,而是在CyMemDef64.dll的模块中。啊,如今我邃晓了。

EDR安排了原始NtReadVirtualMemory函数中应当存在的跳转指令,将代码流重定向到他们本身的模块中,然后搜检一切范例的歹意运动。若是搜检失利,那末Nt*函数将返回毛病代码,不会进入内和空间,并实行最先的局部。

五、绕过要领

如今,我们已控制了EDR怎样检测并阻挠我们WinAPI挪用的体式格局,这是非常显着的。然则,我们怎样处置惩罚这一题目呢?有两种处置惩罚方案。

5.1 从新修补补钉

既然我们晓得NtReadVirtualMemory函数应当是什么模样,那末我们就可以够运用准确的指令轻松掩盖JMP指令。这将阻挠我们的挪用被CyMemDef64.dll阻拦,并会进入到他们没法控制的内核当中。

5.2 Ntdll IAT Hook

我们也能够建立本身的函数,类似于在5.1中所举行的操纵,但不是掩盖挂钩函数,而是在其他处所从新建立它。然后,我们进入到Ntdll的导入地点表,交流NtReadVirtualMemory的指针,并将其指向我们新的fixed_NtReadVirtualMemory。这类要领的长处在于,若是EDR搜检了它们的挂钩,看起来就像没有经由修正一样。它永久不会被挪用,而ntdll IAT指向其他处所。

六、效果

终究,我挑选了第一种要领,该要领更加简朴。但是,第二种要领也其实不庞杂,我打算在以后的几天再实验一下这类要领。

一种绕过EDR内存保护的新方法:NTDLL IAT钩子

七、总结

这类体式格局适用于这个特定的EDR,然则逆向类似的EDR产物并建立通用的绕过要领也是非常简朴的。该要领也一样适用于64位一切版本的Windows,但我没有在32位上举行过测试。

谢谢人人浏览本篇文章,若是人人发明存在任何题目,还请指教。


Sunbet|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明一种绕过EDR内存保护的新方法:NTDLL IAT钩子
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址