[随着黑客行动主义[1]](javascript:void())的兴起和网络犯罪分子对更高利润的渴望[[2]](javascript:void())不断增长,使用恶意电子邮件的针对性攻击在过去十年中逐渐扩大。根据知识丰富的 MITRE ATT&CK Matrix for Enterprise,1通过电子邮件传播的无文件恶意软件是主流的隐形攻击类型之一[[3]](javascript:void()),逃避大多数安全解决方案的检测并阻碍取证分析工作。即使安全监控和防御效力提高,电子邮件和诱饵 Office 文档仍然是恶意软件传播媒介的最佳组合。由于人们仍然容易受到操纵,人类的心理弱点导致了可通过社会工程学(例如鱼叉式网络钓鱼攻击)利用的主要漏洞。在这种情况下,攻击者通常会将包含 PowerShell 命令(PSCmds)的精心定制的恶意文档附加到伪造的电子邮件中。此外,发件人姓名或联系信息中经常使用冒充来引诱目标打开恶意文件。
离地攻击 (LotL) 策略和无文件攻击技术是定向攻击的新兴趋势[[4]](javascript:void())、[[5]](javascript:void())。攻击者使用合法且预装的系统工具,或直接在内存中运行 PSCmds 等脚本,在企业网络内进行横向移动。通过在目标系统上留下更少的痕迹和痕迹,攻击者可以最大限度地降低被安全防御系统检测到的风险,并提高攻击的成功率。考虑到 PowerShell 被广泛用于管理 Windows 操作系统,PowerShell 已成为无文件攻击中使用的主要攻击工具之一。
PowerShell 是一种基于 Microsoft.NET 框架构建的强大脚本语言、交互式命令行界面和脚本平台。PowerShell 拥有丰富的库和实用的命令,凭借其多功能性和可靠性,在软件开发人员和 IT 运维人员中越来越受欢迎。然而,网络犯罪分子和恶意软件编写者也在迅速利用 PowerShell 进行恶意攻击[[6]](javascript:void())。与其他恶意软件使用的脚本语言一样,PSCmds 广泛使用多种混淆策略和加密方法,使其难以被发现。因此,攻击者可以利用 PowerShell 的灵活性将恶意意图隐藏在代码上下文之外,从而影响安全分析师的分析。
表 1显示了来自本机 Windows 命令行、Powershell cmdlet 和 dotNet 代码的三个命令。尽管 PowerShell 是三种不同的调用方法,但它们可以解释所有这三个命令以产生相同的输出。此外,PowerShell 支持多种编码和加密机制,例如 Base64、Hex、XOR 和 SecureString。利用 PowerShell 的自然属性,攻击者可以组合多种混淆策略,以防止恶意 PSCmds 被沙盒或分析师快速自动破解。此外,恶意软件作者通常通过自动混淆引擎[[8]](javascript:void())、代码生成工具、代码保护方法[[9]](javascript:void())和打包程序等领域的进步来制作具有多态和变形属性的新一代恶意软件[[7]](javascript:void()),以规避检测。随着混淆技术和变形引擎的快速发展,恶意软件和脚本数量急剧增加[[10]](javascript:void())、[[11]](javascript:void())。因此,逃避检测和混淆技术是当今 IT 环境中需要缓解的一个不容忽视的挑战。
表 1 PowerShell 中用于同一目的的不同调用方法
虽然安全供应商和研究人员已经从各个方面提出了许多工作和解决方案来应对此类威胁,但大多数主要集中于动态执行或静态解析来检测 PSCmds。使用 .NET 框架[[12]](javascript:void())、[[13]](javascript:void())和通过反恶意软件扫描接口 (AMSI) 2记录脚本块的监控方案需要深入了解系统和动态机制中的实现。静态机制[[14]](javascript:void())、[[15]](javascript:void())、[[16]](javascript:void())、[[17]](javascript:void())使用正则表达式 (regex) 手动选择以匹配字符串级或令牌级签名已被证明可以促进恶意 PSCmds 的分析和反混淆。虽然安全分析人员受益于分析恶意 PSCmds 的动态和静态解决方案,但包含各种混淆变种的变形恶意软件的传播速度仍然比现实世界的检测和分析过程更快。因此,恶意软件作者和安全分析人员之间的军备竞赛仍在继续,需要更有效的解决方案来对抗高度混淆和加密的威胁。
另一方面,机器学习 (ML) 和深度学习 (DL) 等新兴技术表明,它们可以为研究人员提供替代解决方案[[18]](javascript:void())、[[19]](javascript:void())、[[20]](javascript:void())、[[21]](javascript:void()),以开发应对网络安全挑战的尖端方法。总的来说,一些研究取得了比传统签名扫描和执行监控机制更好的性能,包括使用抽象语法树 (AST) [[22]](javascript:void())、[[23]](javascript:void())、[[24]](javascript:void())、 [25 []](javascript:void())、[[26]](javascript:void())的向量表示特征进行检测,自然语言处理 (NLP) [[27]](javascript:void())、[[28]](javascript:void())、[[29]](javascript:void())、[[30]](javascript:void())和图神经网络 (GNN) [[31]](javascript:void())推理以区分恶意和良性脚本。然而,据我们所知,先前机器学习和深度学习的研究尚不具有定论,因为它们主要侧重于区分恶意PSCmd和良性PSCmd的二分类方法,并且往往无法揭示混淆PSCmd背后的语义或恶意意图。因此,这个问题仍未得到解决,分析人员仍然需要投入大量精力,通过动态或静态分析来找出PSCmd的行为以及攻击者的目标,以进行取证分析。
为了应对这一挑战,我们提出了一个结合深度学习和程序分析的混合框架,通过静态多标签分类实现自动PowerShell 去混淆和行为分析(PowerDP)。我们首先从内部沙箱和外部开放数据集收集恶意 PSCmds,以生成基本事实,包括混淆和行为标签。然后,我们采用混淆多标签分类器来预测 PSCmds 的混淆类型。根据预测,我们利用静态正则表达式替换来准确地去混淆并恢复混淆后 PSCmds 的原始内容。之后,利用 AST(代码抽象语法结构的树状表示),我们将每个任意长度的去混淆 PSCmd 处理为实值向量表示,以便通过多标签分类进行行为分析。 PowerDP 不仅高效地自动化了劳动密集型任务,减轻了分析师的脑力劳动,还能根据多标签分类的结果提供由粗到细的粒度报告,并可轻松与先前检测恶意 PSCmd 的研究成果相结合。安全分析师可以利用所提出的自动化机制,发现恶意软件衍生 PSCmd 背后的恶意意图,并减轻恶意软件和取证分析的负担。
本研究的重要贡献可以概括如下:
- 我们提出了一项新颖的研究任务,通过字符分布特征和混淆多标签分类自动识别恶意 PSCmds 的混淆类型。
- 我们根据经验扩展了以前关于静态正则表达式的研究,开发了一个反混淆器,按照推荐的顺序使用精确的正则表达式替换将混淆的 PSCmds 恢复为原始内容。
- 为了解决法医分析的行为分析问题,我们使用 PSCmds AST 中的实值向量表示作为行为多标签分类器的输入来预测潜在的行为功能。
本文的其余部分安排如下。在第二部分中,我们提供了背景信息、攻击者用来阻止分析工作的各种 PSCmds 混淆类型,以及 PSCmds 去混淆和行为分析的挑战。第三部分概述了我们的框架,并介绍了我们如何静态去混淆和分析 PSCmds 的方法。我们在第四部分中介绍了基本事实数据集的创建和校正过程,包括我们如何收集和预处理 PSCmds 以检测混淆类型和 PSCmds 的分析行为。第五部分说明了评估结果,然后在第六部分简要讨论了所提出方法的局限性。第七部分总结了相关工作。最后,我们在第八部分总结了这项工作并提出了未来改进的方向。
第二部分
背景和动机
由于 PowerShell 的多功能性和可靠性,PowerShell 被滥用为网络犯罪分子最常用的脚本语言之一。在所有攻击中,PSCmd 通常用于下载和执行恶意负载。清单 1展示了一个典型的恶意 PSCmd 示例,该示例通常存储在精心定制的恶意文档中。在本节中,我们将介绍各种混淆类型,并讨论通过反混淆和行为分析来揭示 PSCmd 背后的恶意意图所面临的挑战。
清单 1.
Maclicious PSCmds 用于下载和执行恶意软件。
PowerShell 混淆
混淆是一种逃避检测和阻止恶意软件分析的技术,它为恶意软件和恶意脚本披上了一层隐形的外衣。通过混淆,攻击者可以在不知情的情况下有效地发起底层入侵。PSCmd 的混淆方法多种多样,其中许多方法在 Daniel Bohannon [[32]](javascript:void())于 2016 年创建的“Invoke-Obfuscation”框架以及其他工具(例如 PowerShell Empire 3和 PowerSploit)中实现。4恶意 PSCmd 通常采用 以下三类混淆方法:
-
**压缩。**此策略应用压缩来压缩恶意 PSCmds,然后利用 Base64 对结果进行编码。
-
**编码方案。**编码是 PowerShell 混淆中最常用的方法。我们简要回顾一下现实世界中常见的七种编码方案。
- Base64:将整个 PSCmds 编码为 Base64 编码字符串。
- ASCII:用 ASCII 码值表示 PSCmds 中每个可打印字符。
- 十六进制:将 PSCmds 中的每个可打印字符转换为十六进制值。
- 八进制:将 PSCmds 中的每个可打印字符转换为八进制值。
- 二进制:使用二进制表示为整个 PSCmds 生成编码有效载荷。
- 二进制异或:以 PSCmds 和指定密钥作为输入,并通过按位异或运算生成编码结果。
- SecureString:使用指定的密钥从 PSCmds 生成 AES 加密的 SecureString 对象。
-
**字符串操作。**由于 PowerShell 提供了许多字符串级和令牌级的操作方法,攻击者总是试图修改 PSCmds 中易于识别的函数、参数和变量模式,以达到恶意目的。以下是四种常见的字符串操作方法。
- 连接:将PSCmds拆分成多个部分,并使用“+”运算符或连接运算符将所有分割的内容组合在一起进行恢复。
- 重新排序:将PSCmds分成几个部分,并通过“-f”运算符按指定的索引重新组合字符串,以格式化和重新排列字符串表达式。
- 反转:使 PSCmds 以相反的顺序出现,并在执行原始命令之前使用一些辅助函数重新创建字符串表达式。
- 勾选:在字符串中插入反引号“'”(也称为重音符)。反引号是转义字符,执行 PSCmds 时不会被解释。
除了上述方法外,还经常采用三个辅助函数或与其他混淆方法结合使用来增加复杂性。
- **拆分。**此辅助函数将整个混淆字符串拆分为一个令牌数组,以删除原始 PSCmds 中不存在的无关符号或特殊字符。
- **替换。**除了使用拆分函数外,替换也是消除表达式字符串中无意义字符的另一种方法,其目的与拆分相同。
- **随机大小写。**在这种情况下,PSCmds 中的每个字母都会转换为随机混合的大小写,以破坏阅读理解并阻止恶意软件分析。
表 2列出了本文讨论的混淆方法的完整列表。公共 GitHub 存储库中给出了通过将上述 12 种混淆方法和 3 个辅助函数应用于清单 1中的 PSCmds 而得到的混淆 PSCmds 示例。5从示例中可以看出,PSCmds 的原始内容和意图被混淆所隐藏。此外,在不同的混淆中,PSCmds 的文本表示也发生了变化。因此,如果不进行去混淆,就很难理解 PSCmds 正在执行什么,从而影响取证分析和影响评估。但是,不同混淆策略的可能组合数量可能很大且很复杂。因此,我们需要一个程序或推荐的顺序来处理所有混淆方法的组合以进行恢复。
表 2 去混淆的完整列表和推荐顺序
B. PowerShell 行为分析
对恶意 PSCmds 进行行为分析可以让安全分析人员和研究人员快速查看代码执行后的恶意行为和潜在活动。此外,该过程有助于减少劳动密集型任务,例如在有限的时间内分析数千个文件。一些作者[[15]](javascript:void())、[[17]](javascript:void())提供了对 PSCmds 进行静态分析以进行 PowerShell 行为分析的实用方法。例如,在通过关