介绍:
随着最近的发展,恶意软件作者正在利用人工智能 (AI) 和机器学习 (ML) 来动态改变他们的规避技术。这意味着恶意软件现在可以实时适应安全环境的变化,例如防病毒软件或入侵检测系统的修改,使传统的基于静态签名的防御越来越无效。这一演变凸显了网络安全防御和恶意软件创建者之间日益激烈的军备竞赛,双方都在不断调整以超越对方。EarlyBird
技术最近在恶意软件规避领域获得了突出地位,它利用先进的方法绕过检测系统。这种复杂的策略建立在传统的 APC 注入方法之上,创建一个处于挂起状态的子进程并注入 shellcode,然后通过异步过程调用 (APC) 执行。这种细致入微的方法使恶意软件能够逃避传统的防病毒 (AV) 和端点检测和响应 (EDR) 系统,这些系统通常经过调整以识别更直接的 shellcode 模式。本文深入探讨了 EarlyBird 技术的机制及其对现代网络安全防御的影响。
概述:
传统的 shellcode 加载器通常按照以下简单的顺序运行:
-
在目标进程内分配内存。
-
将 shellcode 复制到分配的内存的基地址。
-
创建一个线程来执行shellcode。
虽然这种方法很有效,但它已经具有很强的签名,因此很容易被现代防病毒 (AV) 和端点检测和响应 (EDR) 系统识别。
然而,EarlyBird 技术却与这种传统方法不同,它能够规避与基本 shellcode 加载器相关的签名。通过采用更先进的执行策略,EarlyBird 成功绕过了许多检测机制,而这些机制原本会标记更传统的方法。
EarlyBird 技术是经典 APC 注射技术的“改良版”。
在深入研究 EarlyBird 之前,我们先了解一下 APC 注射的背景知识:
什么是 APC?
异步过程调用是一种 Windows 操作系统机制,它使程序能够异步执行任务,同时继续运行其他任务。APC 被实现为在特定线程上下文中执行的内核模式例程。恶意软件可以利用 APC 将有效负载排队,然后在安排时执行它。
注意:并非所有线程都能运行 APC 函数,只有处于可警告状态的线程才能运行。可警告状态线程是处于等待状态的线程。当线程进入可警告状态时,它会被放入可警告线程队列中,从而允许它运行排队的 APC 函数。
APC注射的流程如下:
-
使用各种 Windows API 函数(如 SleepEx、MsgWaitForMultipleObjectsEx、WaitForSingleObjectEx 等)创建处于可警报状态的线程
-
将 shellcode 注入内存
-
调用QueueUserAPC函数执行shellcode
回到 EarlyBird 技术。
现在我们了解了经典的 APC 注射,理解 EarlyBird 应该容易得多
EarlyBird 技术首先在调试模式或挂起状态下创建一个新进程(子进程)。
创建子进程的函数返回进程 ID、进程句柄以及新创建进程的主线程句柄。
图 1-上面的代码片段演示了根据我们提供的进程名称创建进程的功能
在“CreateSuspendedProcess”函数中,我们需要提供一个要创建的进程名称,在此上下文中,我们使用 GetEnvironmentVariableA API 来获取“C:Windows”环境变量。
之后,我们将保存“C:Windows”的变量与“System32lpProcessName”连接起来,在本例中它将是“C:WindowsSystem32notepad.exe”
接下来的函数负责将shellcode注入远程进程,并返回子进程中shellcode的基地址,
流程如下:
-
使用 VirtualAllocEx 在子进程内分配具有“PAGE_READWRITE”权限的内存
-
使用 WriteProcessMemory 将 shellcode 复制到远程缓冲区
-
将远程缓冲区的权限更改为PAGE_EXECUTE_READ,以便稍后执行。
图 2 - 上面的代码片段演示了我们如何使用从上一个函数中获取的进程 HANDLE,使用 VirtualAllocEx 和 WriteProcessMemory 将 shellcode 注入到新创建的进程中
当“InjectShellcodeToRemoteProcess”函数执行完毕后,返回子进程中shellcode所在的远程地址。
转到主函数(){}
我们首先将进程名称定义为“notepad.exe”,并初始化将保存函数返回输出的变量
-
hProcess:子进程的句柄
-
hThread:子进程主线程的句柄
-
dwProcessId:子进程的PID
-
pAddress:存储在子进程内存中的 shellcode 的基地址
一旦我们创建了进程并将我们的 shellcode 注入到该进程中,我们就会将子进程中 shellcode 的返回地址与进程的主线程一起传递到“QueueUserAPC”函数中。
子进程仍处于挂起模式,这意味着它不会立即运行,我们的 APC 调用排队到主线程,一旦使用“ResumeThread”恢复,就会执行。
使用调试的进程可以实现相同的操作,但是为了执行,我们需要使用“DebugActiveProcessStop”而不是“ResumeThread”来恢复线程。
图 3 - 上图展示了我们如何在主函数中一起实现这两个函数
让我们动态地跟踪这个过程:
在下图中,我们可以看到该程序创建了 notepad.exe,将 shellcode 注入记事本并使用 QueueUserAPC 执行了我们的 shellcode。
然后我们就得到了一个信标!:)
图 4 - 成功创建子进程并将信标发送到我们的 Sliver C2 服务器,最终绕过 Microsoft Defender
使用 x64dbg 进一步挖掘,我们可以看到 notepad.exe 中的 shellcode 地址:
图 5-使用 x64dbg 调试器查看注入到子进程的 shellcode
最后说明:
在当今不断演变的威胁形势下,防病毒 (AV) 和端点检测与响应 (EDR) 等传统安全措施往往不够有效。即使是最复杂的防御措施也可能被巧妙的技术和漏洞所绕过。
想象一下恶意软件可以相对轻松地躲过多家安全供应商的检测。我们的方法让我们得以一窥规避恶意软件开发的复杂世界。虽然单一技术可能并不总是足够的,但结合多种方法可以显著增强恶意软件逃避检测的能力。
此示例演示了创建规避恶意软件的基本原理。通过了解这些技术,您可以更好地预测和防御高级威胁。
不要让您的组织成为下一个受害者。使用我们的创新解决方案升级您的安全策略。
更多与该shellcode加载器结合的技术推荐如下:
• Shellcode 混淆/加密
• IAT 混淆
• 运行时函数加密和解密
• 对二进制文件进行签名
• 向二进制文件添加元数据
• 沙盒检测
直到下一个!(:
Liav Mizrahi
原文始发于微信公众号(Ots安全):EarlyBird 技术:一种先进的恶意软件规避策略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论