-
-
[翻译]PowerShellRunBox - 利用 PowerShell debugging 调试的方法自动化分析混淆的 PowerShell 样本
-
发表于: 2019-11-30 23:27 6916
-
[翻译]PowerShellRunBox - 利用 PowerShell debugging 调试的方法自动化分析混淆的 PowerShell 样本
当今,恶意的 PowerShell 脚本是最普遍的威胁之一。有许多高级持续威胁(APT)参与者已使用 PowerShell 作为分发或移动。商业恶意软件使用 PowerShell 也已经有很长时间了。在许多情况下,Microsoft Office 宏恶意软件使用 PowerShell 脚本继续进行进一步的攻击。 MITER ATT&CK矩阵 很好地总结了这些趋势 。有一些攻击工具包,例如 PowerShell Empire 和 PowerSploit ,使用 PowerShell 作为主要实现语言。
PowerShell在攻击者中如此地受欢迎是有很多原因的。从Windows 7开始,Windows 平台会默认安装PowerShell。 PowerShell 在与 Windows 子系统交互方面非常强大。使用 PowerShell 可以轻松实现大多数常见的恶意软件活动,例如投递文件并运行它们,以及与命令与控制(C&C)服务器进行通信。一些攻击框架通过将 下载的可执行文件反射地加载到内存中来支持无文件操作。通过这些方面,PowerShell 是执行无文件不落地攻击的理想工具。反恶意软件行业的传统防御机制非常关注基于文件的威胁,在涉及到这种新的无文件趋势方面仍然存在巨大的技术差距。
从攻击者的角度来看,PowerShell 的唯一问题是源代码容易泄露。为了避免简单的分析和检测,他们花了很多精力来混淆 PowerShell 脚本。他们还将脚本分成许多部分,并逐一分发。在多次混淆的 PowerShell 执行之后实现最终威胁。这些策略在许多情况下都非常有效。由于这些事实,在大多数情况下,分析和理解基于 PowerShell 的威胁是相当耗时的工作。
通过本文,我们将分析使用混淆和 payload 拆分的最典型情况之一,并将讨论可以帮助分析人员更有效地执行工作的新方法。
以下代码显示了一例通过 Office Excel VBA 脚本脚本传递的PowerShell威胁。 使用沙盒技术可以很好地观察到这种威胁的行为。 例如,通过 any.run session,您可以观察 Excel 如何运行 PowerShell 脚本来运行进一步的攻击。 在命令提示符下将混淆的脚本设置为Windows环境变量后,将使用 PowerShell 实例。
图1 — 威胁的进程树
PowerShell 脚本代码被严重混淆,手动消除这种威胁可能需要研究人员付出巨大的努力才能完全理解这些威胁。
图 2 — 严重混淆的 PowerShell 代码
许多因素使得此脚本很难分析。 首先,它将 PowerShell 类和函数名称拆分为多个字符串,并即时进行组合。 其次,它使用 base64 编码对下一阶段的脚本进行编码,并将其顺序随机化,以防止对该脚本进行暴力破解。 第三,它使用压缩来防止对编码的 base64 代码进行部分解码。 而且,它使用多个变量在代码的不同位置拆分逻辑。
幸运的是,PowerShell 嵌入了调试器功能。 这篇文章 为在 PowerShell ISE 中使用调试功能提供了很好的指导。 可以使用 ISE 分析恶意 PowerShell 代码。 但是,在大多数情况下,您需要某种程度的自动化,因此自定义的PowerShell 调试器可能会更好。
您可以在独立程序中嵌入 PowerShell 调试器,并注册自己的 StopEvent 回调以实现一些自动化功能。 我们发布了使用 PowerShell 调试的项目 PowerShellRunBox,为分析高度混淆的 PowerShell 代码提供了一些方便的功能。 我们将分享这个新工具如何帮助分析高度混淆的 PowerShell 代码。
整个感染流程如下所示。 它有三个检查例程(黄色块),用于确保整个威胁在意大利语的 Windows 语言环境中运行。
图 3 — 恶意的 PowerShell 脚本执行流程
它使用 https://ipinfo.io/country 进行额外的检查,以检查计算机和网络的公共 IP 地址是否属于意大利。 基本上,它具有多层次的语言包和地理位置检查。 如果在特定的区域没有发现特定语言包的话,它将不会下载下一阶段的 payload。
对于动态分析,这是一个复杂的问题。 例如,任何会话贯穿式引爆(detonation)服务(如any.run)将无法完成,除非它在恶意软件期望的非常特定的环境中运行。 如果不分析 PowerShell 代码本身,则首先不会获得这些信息。 这可能是攻击者逃避动态分析的策略之一。
在许多情况下,我们需要了解 PowerShell 脚本的细节行为,主要是因为某些脚本执行了大量的对抗分析的操作。 通过观察宏行为(例如文件或进程创建)无法观察到这些行为。 PowerShellRunBox 可以通过详细了解脚本代码的运行方式来帮助解决此问题。
要准备调试环境,请首先在脚本中将 PowerShell 命令替换为 PowerShellRunBox。
图 4 — 修改命令行,运行 PowerShellRunBox
现在,在一次性的调试环境中运行脚本。 请注意,该工具将实际运行脚本,并可能感染计算机。
图 5 — 开始的断点
下面的截图显示了脚本第一条语句设置的“ mZug”变量。 PowerShellRunBox 将通过调试会话自动显示已修改或新创建的变量。
图 6 — 自动显示新的或修改的变量
下面截图显示了通过计算上一条语句创建的新 PowerShell 脚本。
图 7 — 新计算的脚本
该脚本具有一个“ if”条件,用于检查 PowerShell 环境的语言环境。 当我们在英语环境中运行脚本时,可以看到“ RAd”变量在此处设置为“ en-US”。
图 8 —“If”条件检查语言是否为意大利语
出现“ if”条件后,如果语言包不是意大利语,则脚本将退出。
图 9 —如果区域设置与意大利语言集不匹配就会退出
在遍历多个调试会话之后,我们可以提供恶意代码检查的变量名。 我们可以使用 Config.json 文件来设置要在调试会话中即时替换的变量。 这个自动化功能可以节省大量时间。
图10 — Config.json 设置变量
PowerShellRunBox 支持命令的多次执行。 下图显示了s(tep)命令 运行了100次。
图 11 — 重复运行 ‘s’ 命令 100 次
下面显示了从脚本中提取的URL。
图 12 — 编码的图片 URLs.
下载的图像看起来像是普通图像文件,但实际上包含带有下一阶段脚本信息的像素。
图13 — 编码的图片文件
下面的代码显示了从 imgbox.com 或 imgur.com 等图像服务网站下载的图像,其中包含解码下一阶段 PowerShell 脚本的循环。
图 14 — ‘For’ 循环
在循环内部,您可能希望使用“o”命令退出循环。
图15 — 调试器命令 — 使用 ‘o’ 命令跳出当前循环
下面是一个脚本块,它将重建下一阶段的脚本代码。
图 16 — 下阶段的代码赋值给 MICd 变量
MICd 变量包含下一阶段代码的反向字符串。
图 17 — MICd 变量
使用 https://ipinfo.io/country 确定运行脚本的计算机的位置。
图 18 —确定位置
使用 Get-Culture 函数再次检查语言设置。
图19 — 获取文化信息