揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  翻译:興趣使然的小胃

  稿费:200RMB(不服你也来投稿啊!)

  投稿方式:发送邮件至linwei#360,或登陆网页版在线投稿

  一、前言

  在过去的几年中,随着框架不断完善成熟,PowerShell也在不断获得人们的关注和欢迎,因此,在攻击行动中越来越多地看到PowerShell的身影也就不足为奇了。PowerShell为攻击者提供了系统各种原生功能支持,通过快速查看PowerShell恶意工具的泛滥形势,你可以对此类工具的增长态势有个整体了解。

  微软对高版本的PowerShell做了些处理,提供了包括Transciption、ScriptBlock等多种方式来记录PowerShell的活动日志,因此基于PowerShell的攻击需要在运行时对其代码进行混淆编码。

  首先让我们来看一下PowerShell的“-EncodedCommand”参数。

  

揭开PowerShell编码攻击的神秘面纱

  如PowerShell上述的使用说明,“EncodedCommand”是其一个命令,旨在对复杂字符串进行封装以便PowerShell在命令行中进行执行。你可以利用此命令对关键字符串进行隐藏,以躲避防护软件的探测。

  本文主要有两个目的,其一,本文在“整体分析”中会分析利用Palo Alto Networks AutoFocus服务识别收集的4,100个PowerShell攻击样本(这些样本均使用了EncodedCommand技术),来了解PowerShell攻击中所使用的技术及攻击方式;其二,我将利用解码后样本对PowerShell代码进行分类,为后续识别或研究工作提供参考。

  二、整体分析

  在开始分析前,我首先需要识别使用该技术的样本。因为PowerShell为用户提供了多种灵活调用参数的方法,因此样本的识别工作并不像想象中的那么容易。

  以下三个样本使用那个了三种不同的方法来调用EncodedCommand参数:

  

揭开PowerShell编码攻击的神秘面纱

  大多数编码数据都是利用模板或公开工具生成而来,每当攻击者需要运行shellcode或下载另一个恶意文件时,他们并不需要重复造轮子。这一点可以通过以下情况证实:攻击代码中的底层代码基本一致,只有其中的文件下载地址及其他信息存在略微不同。为了对数据进行分析,我需要尝试识别代码并确定代码的生成方式,或者至少能够对代码进行分组归类。

  2.1 分析方法

  为了说明这个工作的困难程度,我们可以回看2012年Matthew Graeber发布的一篇关于PowerShell脚本的博文,脚本可以加载shellcode至内存并运行。这个脚本也是此类技术的基础模板,大多数公开工具参考了脚本以期获得同样功能。

  以下是TrustedSec系列工具中的社会工程学工具集(Social-Engineer Toolkit,SET)和Magic Unicorn工具经过两次迭代后的表现形式。对比两个样本,你可以发现,初始变量名上SET使用的是“$c”,而Magic Unicorn使用的是“$nLR”。与此类似,SET中“$size”与Magic Unicorn中“$g”对应,“$sc”与“$z”对应,“$x”与“$kuss”对应。

  SET:

  

揭开PowerShell编码攻击的神秘面纱

  脚本使用3到4个随机数字字符对一些变量进行处理,但不是所有的变量都会被替换,因此我可以得知其变量生成机制。此外,如果没有经过Magic Unicorn脚本或其他形式的随机化处理,当这个特定片段被复制到其他工具中时我也可以鉴别出来。

  对代码进行分析时,如果代码经过了许多人多年的重度重复使用,那么你总会碰到不适合分析的代码。我试图通过特征值尽可能准确地对代码进行分类,但不一定能做到足够准确,因为没有什么能够阻止别人简单地将代码复制粘贴到自己的工具中。

  总体而言,我分析了27类公开工具或技术,它们具有独特的标识符,可以作为归类依据。在编号归类后我会对每个变种进行深度分析。首先我们来看一下变种的分支细目、样本数以及所占的样本百分比,如下表所示:

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  我们所分析的样本中,超过一半使用了“DownloadFile-StartProcess”技术或前文所述的shellcode注入技术。

  2.2 整体分布及统计

  我们在4,100个样本中发现了4中文件格式。如下表所示:

  

揭开PowerShell编码攻击的神秘面纱

  可知,EXE和DOC格式占了绝大部分。进一步后我们发现,77%的DOC文件(即1,326个样例)可以归到“Downloader DFSP”变种,该变种通过DownloadFile-StartProcess方法实现下载器功能,如以下代码所示:

  

揭开PowerShell编码攻击的神秘面纱

  有1,159个DOC文件样本(占比87%)可以归到Cerber勒索软件变种中,这意味着存在一款生成恶意Word文档的模板工具,可以用来创建带有启动PowerShell功能的恶意宏文档。

  投递DOC文档的主要渠道是使用SMTP/POP3协议,这与现今勒索软件使用电子邮件进行恶意Word文档投递的情况一致。

  

揭开PowerShell编码攻击的神秘面纱

  图1. 投递恶意PowerShell文档的渠道

  图2描述了攻击目标的行业分布,其中高等教育、高科技、专业领域、律政行业及医疗保健方面的分布所差无几。

  

揭开PowerShell编码攻击的神秘面纱

  图2. 检测到恶意PowerShell文档的行业分布

  

揭开PowerShell编码攻击的神秘面纱

  图3. AutoFocus在过去12个月捕获的恶意Powershell文档样本数。

  接下来让我们看一下EXE样本。在分类方面,这些样本基本都是恶意软件家族的变种,没有特别的地方。有趣的是,它们的攻击目标似乎倾向于高科技行业。

  

揭开PowerShell编码攻击的神秘面纱

  图4. 检测到恶意PowerShell可执行文件的行业分布

  与DOC类别样本相比,其在时间上的分布更为均匀。

  

揭开PowerShell编码攻击的神秘面纱

  图5. AutoFocus在过去12个月捕获的恶意PowerShell可执行文件样本数

  以上状况的一种可能性是两类样本的分发渠道不同。比如DOC样本主要是通过电子邮件附件进行分发投递,而EXE样本主要是通过Web浏览器进行投递。

  在对具体命令分析前,我要说的最后一件事是我们所检测到的使用EncodedCommand技术的一个DLL文件。这个DLL文件不包含导出函数,通过DLLMain入口调用后,该DLL会启动一个PowerShell Empire stager,从网站下载一个经过异或处理的脚本,并使用PowerShell的Invoke-Expression cmdlet运行。该样本与2021年10月Symantec发布的一篇博文中描述的Odinaff恶意软件家族的有关。

  三、数据前期分析及统计

  开始分析base64编码数据前,我观察了每个进程的启动方式,这种分析方法可以了解与EncodedCommand配合使用的附加参数情况。

  3.1 EncodedCommand:(4,100个样本,占比100%)

  使用此参数向PowerShell传递base64编码字符串并运行。

  

揭开PowerShell编码攻击的神秘面纱

  3.2 WindowStyle Hidden:(2,083个样本,占比50.8%)

  使用此参数避免PowerShell执行时显示运行窗口。其中“-window hidden”方法使用最多主要与前文提到的Cerber勒索软件有关。

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  3.3 NonInteractive:(1,405个样本,占比42.4%)

  使用此参数避免显示一个交互对话窗口。此方法与WindowStyle隐藏方法配合使用以隐藏执行痕迹。

  其中使用“-noni”的变种中76%是通用型的shellcode注入代码或SET工具,而使用“-NonI”的变种主要是PowerShell Empire工具。

  

揭开PowerShell编码攻击的神秘面纱

  3.4 NoProfile:(1,350个样本,占比32.9%)

  使用此参数阻止PowerShell在开机时加载配置文件脚本,以避免载入非预期的命令或设置。与非交互方式类似,“-nop”方法主要由SET和通用型shellcode注入变种采用,而“-NoP”方法主要由PowerShell Empire使用。

  

揭开PowerShell编码攻击的神秘面纱

  3.5 ExecutionPolicy ByPass:(453个样本,占比11%)

  使用此参数绕过默认的PowerShell脚本执行策略(即受限策略),可以执行任何代码。有趣的是,使用EncodedCommand参数执行的代码不受执行策略影响。

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  3.6 Sta:(219个样本,占比5.3%)

  使用单线程模式(现在是PowerShell 3.0的默认模式)。此参数基本上是PowerShell Empire在使用。

  

揭开PowerShell编码攻击的神秘面纱

  3.7 NoExit: (23个样本,占比0.5%)

  使用此参数阻止PowerShell在运行启动命令后退出。这是PowerWorm恶意软件除EncodedCommand参数外使用的唯一参数。

  

揭开PowerShell编码攻击的神秘面纱

  3.8 ExecutionPolicy Hidden(5个样本,占比0.12%)

  这实际上不是一个有效的参数,因此PowerShell会忽略该参数。使用该参数的每个样本我都标记为与“TXT C2”脚本有关,该脚本试图加载一个包含另一段PowerShell脚本的DNS TXT记录,与PowerWorm类似。可能攻击者本来想使用的是ByPass参数,因为他们的后续命令中使用了“-w hidden”参数。

  

揭开PowerShell编码攻击的神秘面纱

  3.9 NoLogo:(33个样本,占比0.8%)

  避免PowerShell启动时显示版权信息。

  

揭开PowerShell编码攻击的神秘面纱

  3.10 ExecutionPolicy Unrestricted:(1个样本,占比0.02%)

  与ByPass类似,但会在运行从Internet下载的未签名脚本前警告用户。使用此参数的脚本在试图执行从Internet下载的脚本时会触发警告信息。

  

揭开PowerShell编码攻击的神秘面纱

  3.11 Command:(1个样本,占比0.02%)

  利用该参数可以执行参数后面的命令,就如同直接在PowerShell提示符下输入命令一样。我只捕捉到一个样本,它直接附加到某个恶意软件中,该恶意软件在FireEye发布的一篇关于绕过基于签名的检测方法的博文中提到过。该PowerShell脚本包含在一个DOCM文件的“Comments“域中,通过Word文档的宏加载执行。以下是该样本的恶意PowerShell代码片段,通过将多条命令组合在一起,可以实现FTP传输和NetCat建连目的。

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  现在,让我们整体看一下样本集中排名前十的PowerShell参数组合。

  

揭开PowerShell编码攻击的神秘面纱

  即使将代码的多样性考虑在内,以上排名结果也不会出现太大变化,只是使用某些参数的样本个数有些许改变而已。

  在整个研究过程中,我发现有些代码作者对新版本的工具特征进行了修改,如下所示,新版本中作者稍微对参数形式进行了变化:

  

揭开PowerShell编码攻击的神秘面纱

  图6. 代码作者对不同版本样本的参数修改对比

  这种修改会导致变种族群总数的变化,但我认为这些变化不会对总体结果造成特别大的影响。我的调查研究表明,代码作者很少对参数的顺序或长度做出动态改变以混淆其攻击活动,相反,他们更加关注代码基本功能的随机化,也更加关注代码的内在方面。这也使得我们可以使用PowerShell启动参数作为特征对样本进行大致精确的分类。

  此外,前三种参数使用方式占了样本总数的72%,这也说明攻击者更倾向于简单地执行PowerShell脚本,而不关心后续攻击行动的隐蔽性。

  四、数据后期分析及统计

  接下来我会讨论识别出来的每个变种类别并分析他们的功能。对具备下载文件或脚本功能的变种,我将它们使用的IP地址/域名/URL信息附在本文末尾。这些地址中有些是恶意性质的,有些是用来做渗透测试的,有些只是人们用来做新技术的随机测试。不幸的是,在大规模批量分析中,我们很难推测每个地址的真实用处,因此我将这些信息直接提供给读者加以鉴别。

  (一)下载器类别

  此类PowerShell代码的主要目的是下载运行远程主机的载荷或PowerShell脚本。

  4.1 Downloader DFSP(1,373个样本,占比33.49%)

  这是使用PowerShell下载和运行文件的一个典型类别,也基本就是你在使用Google搜索如何利用PowerShell下载和执行文件时所得到的搜索结果。我使用以下模板作为此类样本的筛选器。

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  (二)嵌入型载荷类别

  此类PowerShell代码的主要目的是运行嵌入型载荷(如shellcode)。

  4.12 Shellcode注入(1,147个样本,占比27.89%)

  4.13 Unicorn(611个样本,占比14.90%)

  4.14 SET(199个样本,占比4.85%)

  4.15 Unicorn修改版(14个样本,占比0.34%)

  我在前文描述了SET和Magic Unicorn的Shellcode注入技术的实现方法,我决定利用这种shellcode注入模板对这类变种进行归类(4.12-4.15)。以下是“Shellcode注入”变种的一个样本,来源于Matt Graeber的原始博文,你可以从中发现该样本与SET和Magic Unicorn的相似性。

  

揭开PowerShell编码攻击的神秘面纱

  这四类变种几乎覆盖了在启动EXE文件整个过程中所用到的所有技术

  以上代码片段的要点是样本按照以下顺序从DLL文件中导入函数。

  “kernel32.dll”中的VirtualAlloc函数,

  “kernel32.dll”中的CreateThread函数,

  “msvcrt.dll”中的memset函数。

  之后他们使用“0x”十六进制表示方法将shellcode载入字节数组中,然后调用VirtualAlloc函数分配至少4,096字节大小的RWX内存页面空间,通过memset函数将字节数组拷贝至内存中,利用CreateThread函数将执行权交给shellcode。

  在1,971个样本中,有1,211个不同的shellcode载荷,这表明有50%以上的shellcode载荷被多个样本重复使用。这些工具大多数都使用Metasploit来生成shellcode,在不指定载荷情况下,通常都会选择反弹型Meterpreter shell。例如,下面是一行来自于Magic Unicorn中的代码,用来打印如何指定MSF载荷。

  print("PS Example: python unicorn.py windows/meterpreter/reverse_tcp 192.168.1.5 443")

  以来代码用来在指定系统平台、架构及编码条件下生成载荷:

  

揭开PowerShell编码攻击的神秘面纱

  从shellcode长度来看,两种常见的长度分别是294字节和312字节,对应的样本数分别是846个和544个,其他长度所对应的样本数则相差较大。

  

揭开PowerShell编码攻击的神秘面纱

  我认为造成这种现象的原因在于它们可能使用相同的工具来生成shellcode载荷,除了在某些地方(如4字节的IP地址,C2服务器的URL地址等)做了稍微改动。

  本文对变种的分类主要是基于特征值法,以下是筛选这四类变种的正则表达式:

  Shellcode注入:

  

揭开PowerShell编码攻击的神秘面纱

  4.16 Powerfun Reverse(100个样本,占比2.44%)

  4.17 Powerfun Bind(2个样本,占比0.05%)

  我们在Powerfun中还发现了另一种代码执行方法,它们使用Metasploit的“

  windows/powershell_reverse_tcp”以及“powershell_bind_tcp”载荷来创建与目标系统的交互式shell。反弹型载荷通过base64进行编码,并通过使用

  System.Diagnosticscess来实现进程的后台启动。

  反弹型载荷:

  

揭开PowerShell编码攻击的神秘面纱

  4.18 PowerWorm(19个样本,占比0.49%)

  PowerWorm是TrendMicro在2014年定义的一个恶意软件族群,具有通过感染Office文DOC(X)、XLS(X)文档进行传播的能力。此类PowerShell代码在真正的命令之间插入了垃圾数据进行混淆。

  

揭开PowerShell编码攻击的神秘面纱

  进行初步整理后,代码如下:

  

揭开PowerShell编码攻击的神秘面纱

  该代码通过请求DNS TXT记录获取软件的URL下载地址,从该地址下载Tor和Polipo,利用这些软件持续请求传递给Invoke-Expression的新的PowerShell命令。Matt Graeber在分析这类恶意软件的全部功能方面做了非常出色的研究工作,给出了软件底层PowerShell代码的去混淆和注释版本。

  4.19 Veil Stream(7个样本,占比0.17%)

  此类变种使用的技术与“Powerfun Reverse”变种类似,将bae64字符串中的PowerShell代码插入内存,使用Invoke-Expression执行真正的shellcode载荷。代码的结构与Veil框架对应。

  

揭开PowerShell编码攻击的神秘面纱

  (三)本地持久化类别

  此类PowerShell代码的主要目的是实现宿主机的本地持久化。

  4.20 Scheduled Task COM(11个变量,占比0.27%)

  此类变种创建计划任务运行恶意二进制文件以实现持久化机制。样本中使用的PE文件来自于所下载的“minicraft.exe”,通过下面所示的PowerShell代码执行。之所以这么做可能是因为使用PowerShell比使用原始下载二进制代码更容易完成这一任务。

  代码所用到的技术与之前的Retefe银行木马有关。

  

揭开PowerShell编码攻击的神秘面纱

  4.21 VB Task(10个样本,占比0.24%)

  此类PowerShell代码最初来自于某个内嵌PowerShell脚本的PE文件,通过运行VB脚本来创建计划任务。VB脚本一旦执行就会启动另一个PowerShell脚本。

  

揭开PowerShell编码攻击的神秘面纱

  4.22 DynAmite Launcher (6个样本,占比0.15%)

  4.23 DynAmite KL(1个样本,占比0.02%)

  DynAmite是一个“恶意软件生成工具包”,可以根据用户定制功能,创建恶意软件。

  DynAmite允许用户组合他们所需要的功能,生成一个PE封装文件,利用PowerShell命令执行所定制的任务。我所收集到的此类代码主要来自于公开工具,其中变量名和变量位置可以有多种不同表现。

  “DynAmite Launcher”变种通过计划任务完成本地持久化目的。以下是此类变种的三种不同表现形式,这三种样本可能由DynAmite使用不同的版本和配置生成。

  

揭开PowerShell编码攻击的神秘面纱

  “DynAmite KL”变种是该套件的键盘记录器组件,但其直接来源于对老版本PowerSploit的Get-Keystrokes函数的改造升级。以下是对老版本Get-Keystrokes以及“DynAmite KL“代码的比较,从中我们可以看出后者对变量位置及类型进行了修改。

  Get-Keystrokes代码:

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  (四)其他技术类别

  4.24 AMSI Bypass(8个样本,占比0.20%)

  反恶意软件扫描接口(Antimalware Scan Interface, AMSI)是微软在Windows10中新增的一项功能,旨在为应用程序和反病毒软件建立顺畅的通信渠道。理想情况下,应用程序(在本文中为PowerShell应用)在运行时会对从本地或远程获取到的脚本去混淆处理,通过AMSI接口传递给反病毒软件进行安全性扫描。如果反病毒软件判定脚本具有恶意性质,应用程序会阻止脚本的进一步运行。

  Matt Graeber发布了一行Twitter短文,告诉人们如何通过将“amsiInitFailed“设置为”True“来绕过AMSI机制,这种设置会让防病毒软件误以为AMSI失效从而绕过此项检查。

  

揭开PowerShell编码攻击的神秘面纱

  以上代码与PowerShell Empire中的EncryptedScriptDropper存在类似异或处理特征,可能与之直接有关,或者参考了其中部分代码。

  4.25 PowerSploit GTS(3个样本,占比0.07%)

  此类变种直接来源于PowerSploit的Get-TimedScreenshot模块。以下代码每隔两秒抓取一次屏幕截图。

  

揭开PowerShell编码攻击的神秘面纱

  对于此类攻击,PowerShell代码只是攻击者在行动中使用的整套工具集中的一小部分,攻击者利用PowerShell代码以节省所需功能的研发时间。在这种攻击情况下,Excel宏文档首先会对内嵌的PowerShell进行解码运行并开始抓取屏幕截图,与此同时,宏也解码运行了其他PE文件执行后续攻击动作。

  

揭开PowerShell编码攻击的神秘面纱

  图7. Excel宏对内嵌的PowerShell脚本及PE文件进行解码

  4.26 Remove AV(2个样本,占比0.05%)

  此类变种利用PowerShell强制卸载x86系统和x64系统下的反病毒软件,它遍历注册表中程序卸载键值,查找含有“*AVG*“的条目,在后台静默卸载所找到的每个实例。

  

揭开PowerShell编码攻击的神秘面纱

  (五)其他小众类别

  在对样本进行尽可能细的分类之后,还有大约100个样本无法具体归到某一类中,这些样本通常使用了上文所述技术的定制组合。在此我会对其中值得注意的一些样本做个简单描述。

  4.27 Hidden Messages

  这个样本通过PowerShell将当前时间与内置时间进行比较,如果当前时间早于内置时间,样本则放弃运行。在代码尾部,攻击者留下了一个注释以表明他们所属的黑客组。

  

揭开PowerShell编码攻击的神秘面纱

  分析该样本从GitHub上所下载的drupal.js文件,该脚本文件会终止PowerShell进程,并输出“Hello SOC/IR team! :-)“信息。鉴于文件中多处使用了“Test”字符串,我认为它可能是渗透测试或攻防演练中所用的脚本文件。

  

揭开PowerShell编码攻击的神秘面纱

  图8. 结束PowerShell进程的JavaScript文件

  4.28 Process Killing

  此样本使用PowerShell完成特定目的,通常用来终止与恶意软件分析相关的多个进程。

  

揭开PowerShell编码攻击的神秘面纱

  4.29 Layers of Obfuscation

  这是本文分析的最后一个样本,它似乎与“PowerSploit GTS”变种中的代码有关,两者使用的原始宏基本一致,但此样本没有使用“PowerSploit GTS”的其他代码。

  该样本使用多层混淆技术以掩盖其攻击行为。

  第一层:

  带有宏的Excel文档从单元格中提取base64编码的数据,将数据传递给PowerShell的EncodedCommand参数加以运行。

  

揭开PowerShell编码攻击的神秘面纱

  第二层:

  解码后的base64数据是一长串int类型数组,转换为char型字符串后作为另一个PowerShell脚本运行。

  

揭开PowerShell编码攻击的神秘面纱

  第三层:

  解码后的数据使用了多种技术对自身进行混淆处理。第一种技术是在其他字符之间插入反引号字符,该字符将在运行时被忽略。这种技术与命令行中的字符注入技术类似。

  第二种技术是在其他脚本语言中常见的技术,通过将字符串拆分为随机列表,通过调用特定值完成原始字符串的重建。

  

揭开PowerShell编码攻击的神秘面纱

  五、结论

  PowerShell是一个强大的脚本框架,可以提供很多功能,不管是防御方面的功能还是攻击方面的功能。希望本文能够覆盖当前工具和攻击中PowerShell所使用的一些先进技术点。

  通过本文所分析的样本,我们可知大多数攻击活动依然依赖于公共工具的使用,这也在我们的意料之中。随着PowerShell框架不断得到探索和成熟,我认为在将来人们可以看到利用PowerShell开展攻击的更多形态。随着对PowerShell使用方式的逐步创新,攻击者将开始使用PowerShell以利用系统的更多原生功能,而不仅仅是现阶段对PowerShell常见功能的使用。

  六、捕获的C2服务器地址或下载链接

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  

揭开PowerShell编码攻击的神秘面纱

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值