导语:长期以来,网络犯罪分子一直渴望寻求一种能够将攻击痕迹降低至最小的合法工具,这样在进行渗透和攻击时,合法的工具就很容易获得攻击目标的权限,从而尽可能少地触发杀软工具,避免被检测到。而PowerShell正是一个这样的工具,比如近来肆

timg.jpg

长期以来,网络犯罪分子一直渴望寻求一种能够将攻击痕迹降低至最小的合法工具,这样在进行渗透和攻击时,合法的工具就很容易获得攻击目标的权限,从而尽可能少地触发杀软工具,避免被检测到。而PowerShell正是一个这样的工具,比如近来肆虐的Petya/NotPetya都使用到了它。

POWERSHELL攻击性能进化史

PowerShell是Windows和Windows Server的自动化平台和脚本语言,它允许你简化系统管理。与其他基于文本的shell不同,PowerShell利用了.NET Framework的强大功能,提供了丰富的对象和大量的内置函数来控制Windows环境。

ResizedImage600635-Windows-PowerShell.png

为什么POWERSHELL会成为黑客的最爱

PowerShell已经被大量地用于网络攻击,特别是最近肆虐的Petya/NotPetya。攻击者利用的是PowerShell的.NET Framework本地集成功能,为感染或操纵目标提供多种选择。

PowerShell对攻击者最有吸引力的属性包括:

1.对网络套接字的简单访问;
2.能够动态地在内存中组装恶意的二进制文件;
3.直接访问Win32应用程序编程接口(API);
4.使用Windows管理工具的简单接口(WMI);
5.强大的脚本环境;
6.动态的调用运行时间方法;
7.轻而易举地访问密码库,例如IPSec,哈希算法;
8.能够钩住托管代码;
9.完全绑定组件对象模型(COM)。

上述所有的属性都可以为攻击者提供一个非常有效的攻击矢量。

PowerShell作为一个攻击的平台的概念首次出现在2010年Dave Kennedy & Josh Kelley 在DEF CON 18一个演讲,该演讲虽然提出了攻击者可以利用PowerShell进行攻击,但也仅仅是演示了在PowerShell中编写的绑定和反向shell如何在相同的环境中进行攻击。2012 年,Matt Graeber 开发了 PowerSploit并在Monday.com发表了一篇题为“为什么PowerShell是一个强大的攻击平台”的博文。自从"PowerSploit"被发布后,PowerShell的利用率就大幅提升。2013年Mimikatz 开始支持 PowerShell调用(aka Invoke-Mimikatz),这样PowerShell就彻底的流行起来了。

如今有许多成熟的PowerShell工具,如Nishang,PowerSploit和Empire,其中Empire出现在2015年,是一个纯碎的PowerShell后期漏洞利用代理工具,它建立在密码学、安全通信和灵活的架构之上。Empire实现了无需powershell.exe就可运行PowerShell代理的功能。快速部署后期漏洞利用模块,从键盘记录器到Mimikatz,并且能够适应通信躲避网络检测,所有的这些功能都封装在一个以实用性为重点的框架中。

另外,随着对抗策略、技术和通信知识、Mitre的ATT&CK的发展,PowerShel已经可以提供大量的攻击载体、策略和技术,攻击者可以使用它来执行各种操作。

POWERSHELL安全最佳实践

由于PowerShell不能被禁用或从包含它的架构中被移除,所以下面的一些操作是我在实践中总结的一些最佳安全实践方法,这样你可以有效地使用PowerShell,同时也是防止它作为攻击向量被攻击者使用。

PSLockDownPolicy和PowerShell约束语言模式

限制语言模式限制了PowerShell基础的功能,进而消除了诸如.NET和Windows API调用和COM访问之类的高级功能支持。 缺少高级功能会阻止大多数PowerShell攻击工具,因为它们依赖于这些高级功能的支持。 然而,在企业环境中,该方法会对合法脚本产生一些不利影响,因此强烈建议你使用该方法之前先进行测试,以避免对合法使用的代码进行影响。

使约束语言模式:

[Environment]::SetEnvironmentVariable(‘__PSLockdownPolicy‘, ‘4’, ‘Machine‘)

通过组策略使用:

Computer ConfigurationPreferencesWindows SettingsEnvironment

具有Applocker和Device Guard的PowerShell 5

PowerShell 5研发过程中投入很多时间和精力,增加了许多新功能特性。这些特性对企业环境下的运行安全特别重要,这些安全功能包括:

1.脚本块日志记录(Script block logging),脚本块日志记录提供了将非混淆的PowerShell代码记录到事件日志的能力。
2.系统级记录(System-wide transcripts),系统级记录可以通过组策略实现,并提供一个“即时权限提升(over the shoulder)”的记录文件,这样每个用户就可以在系统上执行相应的PowerShell命令和代码块。
3.Powershell约束语言模式,上文已经提到过。
4.各种反恶意软件的集成功能,该功能在Windows 10以后的版本中才有。在Windows 10中,微软公司引入了反恶意软件扫描接口(AMSI),这个接口可以用来扫描基于脚本的入侵攻击和恶意软件。

对于企业安全而言,基于脚本的入侵攻击往往是致命的,而且随着PowerShell的开源和添加了跨平台的支持,这类攻击将会变得越来越常见。

AMSI针对的是那些采用PowerShell、VBScript、以及JScript等语言开发出来的恶意脚本,它可以大大提升恶意脚本的检测准确率,并帮助用户有效地屏蔽这类恶意脚本。在脚本宿主准备运行某一段脚本代码之前,AMSI便会介入并尝试扫描出代码中潜在的恶意内容。

此外,使用AppLocker 可帮助你控制用户可以运行的应用和文件。它们包括可执行文件、脚本、Windows Installer 文件、动态链接库 (DLL)、封装应用和封装应用安装程序。在 Windows 10 中,AppLocker 增添了一些改进,Windows 10 中的新增功能:

1.已向 New-AppLockerPolicy Windows PowerShell cmdlet 添加了一个新参数,该参数可使你选择可执行文件和 DLL 规则集合是否适用于非交互过程。若要启用此功能,请将“ServiceEnforcement”设置为“已启用”。

2.已添加了新的 AppLocker 配置服务提供程序来允许你使用 MDM 服务器启用 AppLocker 规则。

除此之外,在正常情况下,通过使用AppLocker+Device Guard可以防止普通用户使用PowerShell。Device Guard也适用于Windows 10和Windows Server 2016,可以通过利用支持的高级硬件功能来加强受约束的语言模式和应用白名单

记录PowerShell活动

PowerShell日志记录可以通过PowerShell模块的组策略启用:

1.Microsoft.PowerShell即Microsoft.PowerShell.Management模块,记录PowerShell的大部分核心功能。
2.活动目录(ActiveDirectory) ,记录Active Directory的cmdlet。 一个执行单个功能的轻量级Windows PowerShell脚本。
3.BITS Transfer ,记录后台智能传送服务 (BITS) 使用 cmdlet。
4.CimCmdlets(2012R2 / 8.1) - 记录与CIM接口相关的cmdlet的使用情况。
5.GroupPolicy-记录组策略相关的cmdlet的使用情况。
6.Microsoft.WSMan.Management - 记录管理Web服务(WS管理)和Windows远程管理(WinRM)的cmdlet。
7.NetAdapter / NetConnection - 记录网络相关的cdmdlet。
8.PSScheduledJob / ScheduledTasks(PSv5) - 记录cmdlet以管理计划作业。
9.ServerManager - 记录Server Manager cmdlet的使用。
10.SmbShare - 记录服务器消息块(SMB)共享活动。

PowerShell的日志记录会返回到中央日志记录系统中,以为未来的攻击做出预警。

PowerShell日志比较关注的活动:

1.通过.Net下载 (New-Object Net.WebClient.DownloadString)
2.Invoke-Expression或者iex。
3.BITS的活动
4.计划任务的创建或删除。
5.PowerShell的远程连接功能。

检测PowerShell攻击代码的最佳方法是查找代码关键指示符,即PS攻击代码能正确运行所需的关键代码段。

Invoke-Mimikatz事件日志关键词:

“System.Reflection.AssemblyName”
“System.Reflection.Emit.AssemblyBuilderAccess”
“System.Runtime.InteropServices.MarshalAsAttribute”
“TOKEN_PRIVILEGES”
“SE_PRIVILEGE_ENABLED”

对于混淆的PowerShell来说,应该开发自定义规则。例如:

1.查找大量的括号{}
2.寻找大量的引号"

这两种方法都被大量使用在混淆技术中,通常不被合法的软件或普通管理员使用。

弃用PowerShell 2

很明显,在最新版本的PowerShell中集成的安全特性并不适用于PowerShell 2,这样PowerShell 2就成了攻击滋生的地方。PowerShell 2可用于具有相同功能的横向传染和持久性攻击。 PowerShell的额外吸引力还在于,由于它没有本地日志记录功能,因此很难被被检测到,这就为攻击者提供隐身攻击保护。

由于Microsoft最近宣布了PowerShell 2将不再适用于今年9月份的下一次Windows 10 Update,所以强烈建议你从你的运行环境中检查和删除PowerShell 2。

你可以通过运行以下操作来检查是否安装了Windows PowerShell 2:

1.在Windows 7/8.1/10上,输入以下内容将返回“启用或禁用”的状态:

Get-WindowsOptionalFeature -nline -FeatureName MicrosoftWindowsPowerShellV2

2.在Windows Server上,输入以下内容将返回安装或删除的.installstate文件:

Get-WindowsFeature PowerShell-V2

JEA

Just Enough Administration (JEA) 是一项安全技术,委派的管理员可通过它执行可通过 PowerShell 处理的任意操作。使用JEA,你可以:

1.通过利用代表普通用户执行特权操作的虚拟帐户或组托管服务帐户,减少你计算机上的管理员数量。
2.通过指定用户可运行的 cmdlet、函数和外部命令,限制用户可执行的操作。
3.使用准确显示用户在会话中所执行命令的脚本和日志,更好地了解你的用户进行的操作。

JEA适用于最新更新的Windows管理框架5.0和5.1。

更棒的是,JEA包含了创建一个到被管理服务器的远程会话。PowerShell远程会话可以通过会话配置文件或者脚本来进行限制。JEA工具包运行允许这些限制以简单的文本文件来配置,这可以控制用户被授权运行哪些PowerShell cmdlets。JEA工具包同时也可以被设置执行审计的功能。那样的话,如果一个用户尝试非授权的行为,这个行为会被阻止并且记录下来以待查看。

1.PowerShell会话配置文件,此文件用于指定连接到端点的管理员。这样,用户和安全组可以映射到特定的管理角色。这些文件是特定于每台设备的,因此每个设备都有一个访问控制,它们包含关于JEA端点的名称信息。此外,该端点的管理员可以被重新分配。这些文件是以.pssc扩展名结尾的PowerShell数据文件。
2.角色权限文件(Role Capability file),这些文件可以让特定角色中的用户执行特定的操作。例如,可以限制使用某些预先选择的cmdlet,函数和外部程序,这样攻击者就不可能使用潜在的恶意cdmlet执行自定义的攻击。应该限制的潜在危险命令'Start-Process,New-Service,Invokde-Item等,点此你可以详细了解如何创建这样的文件。
3.JEA配置案例,案例和模板可以在Microsoft的JEA Github资源库中找到。

最后,JEA的另一个显着优点是可以以Windows事件日志格式提供可操作的日志记录和报告,因为通过JEA端点执行的所有操作都可以被记录下来,除此之外,连谁进行了访问,何时进行了访问以及访问时都做了些什么……都有记录。

脚本代码签名

如果在企业环境中使用PowerShell脚本,则代码签名是通过确保真实性和完整性来改善安全状态的另一个控件。AllSigned 和 RemoteSigned 执行策略可防止 Windows PowerShell运行没有数字签名的脚本。

AllSigned——只能运行经过数字证书签名的脚本。

RemoteSigned——运行本地的脚本不需要数字签名,但是运行从网络上下载的脚本就必须要有数字签名。

然而,目前已经有几次攻击使用了数字签名的恶意文件,因此这种控制只是增加了另一个安全层,它还是可以被绕过。

PowerShell检测的逃避技术

由于PowerShell的攻击利用率逐年提高,所以攻击者们想出了一些逃避检测的技术,包括:

1.将目前的PowerShell版本降到PowerShell 2。
2.自定义使用没有PowerShell.exe执行的.NET Framework。
3.PowerShell混淆(invoke-obfuscation)。

以上三种方法只是一些粗略地指导意见,不过利用“记录PowerShell活动”将会检测到大部分恶意运行,是目前最佳的安全做法。

总结:保护PowerShell并不简单

从以上的分析可以看出,每种安全预防建议都有被攻破的可能,所以,在查看了最近使用的大多数攻击技术之后,最佳做法还是建议大家升级到Windows 10和PowerShell 5。目前,所有的安全功能都允许删除PowerShell 2。然而,对于大多数企业环境来说,这种方法实现起来并不现实,对于他们,我的建议是激活已经嵌入的安全属性和对应的安全日志功能,这样就可以及时将已潜在的攻击标记出来。

源链接

Hacking more

...