写在前面的话
其实很早之前,攻击者就已经开始使用合法工具来渗透目标网络并实现横向攻击了。理由很简单:使用合法工具可以降低被检测到的几率,而且进过授权的工具(而并非恶意工具)可以更容易绕过安全防护机制。因此对于攻击者来说,PowerShell就成为了一个绝佳的工具。在这篇文章中,我们将跟大家讨论PowerShell的最佳实践方式,而本文的内容将能够帮助你对抗那些使用PowerShell来攻击你的人。
PowerShell是什么?
PowerShell是一种专为MicrosoftWindows和Windows Server设计的自动化平台兼脚本语言,它可以简化系统管理步骤。与其他基于文本的shell不同,PowerShell还可以利用Microsoft .Net Framework的强大功能,并给用户提供多种对象和内置功能来帮助用户管理自己的Windows环境。
为什么是PowerShell?
目前有很多网络攻击都在使用PowerShell,尤其是近期的Petya/NotPetya攻击活动。对于攻击者来说,最重要的是PowerShell是Windows自带的工具,并且整合了.NET Framework组件,而在攻击者的入侵和感染活动中,这个框架组件能够提供多种操作选项。
对于攻击者而言,PowerShell最吸引人的方面有以下几个:
- 可以轻松访问网络套接字;
- 可以在内存中动态编译恶意代码;
- 可直接访问Win32应用程序编程接口(API);
- 可以轻松访问WMI接口;
- 强大的脚本环境;
- 动态、运行时方法调用;
- 轻松访问加密库,例如IPSec和各种哈希算法;
- 轻松绑定COM;
上面列出的这些因素让PowerShell成为了一种高效的攻击向量。
PowerShell首次被当作一种攻击平台被提出是在2010年,当时在DefCon18上有研究人员演示了利用PowerShell的PoC。
目前,社区中有很多类似Nishang、PowerSploit和PowerShell Empire平台的攻击工具,攻击者可以利用这些工具来进行网络侦察、持续性感染以及横向攻击活动。当然了,考虑到PowerShell的自身属性,它还可以进行各种形式的编程,攻击者可以采用编程的方式将其打造成一款自定义工具。
PowerShell安全最佳实践
考虑到某些组织因为需求关系不能禁用或删除PowerShell,下面给出的几条安全实践建议可以帮助你在享受PowerShell的高效性时免受网络威胁的困扰。
1. PSLockDownPloicy以及PowerShell的受限语言模式
受限语言模式能够将PowerShell限制在基础功能状态,并移除其高级功能的支持,例如.NET和Windows API调用以及COM访问。一旦PowerShell失去了这些高级功能,那么绝大多数的基于PowerShell的攻击工具都将会失效。但是在企业环境中,这种方法将会对合法脚本产生负面影响,因此我们建议在采用这种方法之前,一定要进行多次测试,以保证合法代码的正常运行。【 配置参考资料】
启用受限语言模式:
通过组策略启动:
2. PowerShell v.5 Applocker DeviceGuard
PowerShell v.5自带了很多优秀的安全增强功能,非常适合企业环境使用。这些安全增强功能包括:
脚本块日志:将反混淆化的PowerShell代码记录到事件日志中; 系统范围的脚本拷贝:该功能可通过组策略开启,可记录下每一条在系统中执行过的PowerShell命令和代码块; 受限语言模式的PowerShell:进入受限语言模式; 整合反恶意软件(Windows 10):Windows 10的反恶意软件扫描接口(AMSI)允许所有的脚本引擎(PowerShell、VBScript和JScript)请求对动态内容进行安全分析,包括脚本文件、命令行输入的命令以及内存中下载和执行的代码。它可以在PowerShell代码执行之前对其进行安全扫描。
除此之外,用户还可以使用Applocker来阻止未知来源的PowerShell代码。
Device Guard是Windows 10和Windows Server2016新推出的功能,它可以利用先进的硬件功能来增强受限语言模式和应用程序白名单功能。
3. 记录PowerShell活动
我们可以通过组策略来开启PowerShell模块记录功能:
Microsoft.PowerShell.* (例如Microsoft.PowerShell.Managementmodule):记录大多数PowerShell的核心功能; ActiveDirectory:记录活动目录的使用; BITS Transfer:记录BITS(后台智能传输服务)的使用; CimCmdlets (2012R2/8.1) :记录CIM(公共信息模型)的使用; Microsoft.WSMan.Management:记录WS-Management以及WinRM的使用; NetAdapter/NetConnection:记录与网络相关的活动情况; PSScheduledJob/ScheduledTasks (PSv5) :记录管理计划任务; SmbShare:记录SMB共享活动;
为了让这些日志发挥作用,我们需要将其提供给一个中央日志系统,并针对已知的攻击方法进行警告配置。
相关活动:
涉及到.Net的下载活动(New-Object Net.WebClient).DownloadString) Invoke-Expression BITS活动 计划任务创建/删除 远程PowerShell
检测PowerShell攻击代码最好的方法就是查找关键标识符,即关键代码段。
例子:检测Mimikatz(一种收集登录用户凭证的工具)
相关的Mimikatz事件日志关键词:
“System.Reflection.AssemblyName” “System.Reflection.Emit.AssemblyBuilderAccess “ “System.Runtime.InteropServices.MarshalAsAttribute” “TOKEN_PRIVILEGES” “SE_PRIVILEGE_ENABLED”
对于经过混淆处理的PowerShell,我们应该设计自定义规则。比如说:
寻找大括号{ } 寻找单引号或双引号’ “
因为它们都是在混淆技术中会经常使用的,而合法软件或正常的管理员一般是不会使用它们的。
4. 移除PowerShell V.2
由于微软给最新版本PowerShell整合的安全增强功能并不适用于PowerShell v.2,因此v.2版本的PowerShell将有可能被用于攻击者的横向渗透或持久化攻击之中。处于类似原因,微软近期宣布将在下一个Windows10更新中废除PowerShell v.2。因此,我们建议广大用户尽快移除系统中的PowerShell v.2。
5. 脚本代码签名
如果你需要在企业环境中使用PowerShell脚本的话,代码签名也是另一种可以增强安全性的方法。这种功能将只允许经过数字签名的脚本代码在计算机中运行。但是我们haixuya噢考虑到某些攻击者可能会使用恶意文件签名来绕过这种防护机制,因此我们还需要添加额外的安全层以防止这种绕过技术。
6. PowerShell检测绕过技术
由于使用PowerShell的攻击事件越来越多,因此PowerShell也逐渐开始吸引到了社区研究人员的注意。而针对各种各样的检测技术,攻击者也研发出了相应的绕过方法。其中包括:
将目标主机中的PowerShell降级至PowerShellv.2 自定义使用.NET Framework(不涉及到PowerShell.exe的执行) PowerShell脚本混淆
上面列举出的只是其中的一小部分技术,但“记录PowerShell活动”那部分的安全实践建议可以检测其中的绝大部分绕过行为。
总结-PowerShell的安全并没有那么容易实现
在对目前绝大多数已知的攻击技术进行了分析之后,我们强烈建议大家升级至Windows 10和PowerShell v.5,并移除PowerShell v.2。虽然这种操作可能不适用于某些特殊的企业环境,但相关的网络管理员也应该尽量部署并激活本文所介绍的安全保护技术,并及时更新攻击识别信息。