PowerShell是微软为Windows平台制作的新一代命令行操作环境。和传统的命令行环境相比,PowerShell的功能更加强大,使用方式也非常灵活。但这些新特性给用户和系统运维人员带来便捷的同时,也存在很大的安全风险。美国赛门铁克公司发布的一份报告指出,该公司在2016年分析的49127个PowerShell脚本样本中,有95. 4%的样本是恶意的。腾讯公司发布的2019年度企业安全报告也指出,在被恶意利用的系统组件中,利用PowerShell组件实现远程下载占比达90%。敌对势力在近年来对我国发起的网络攻击中,PowerShell恶意脚本也成为经常使用的攻击手段之一。本文将在介绍PowerShell的功能特点和安全机制的基础上,概述部分安全机制绕过方法,并提出针对PowerShell攻击的检测和防御方法。
一、PowerShell简介
从Windows 95正式脱离DOS系统、成为可独立运行的操作系统到现在,微软在各版Windows系统中都保留了命令行窗口,即“命令提示符”,用于兼容DOS程序、便于用户执行命令操作。随着技术的演进,功能有限的“命令提示符”已经不能满足运维需求。为此,微软于2006年发布了新一代命令行环境,即PowerShell1.0。从Windows7和Windows Server2008 R2开始,微软正式将PowerShell集成到系统中,便于管理员进行系统管理。在2016年,微软将PowerShell开源,并提供了跨平台支持,使用户在Linux等系统中也可以使用PowerShell的部分功能。
PowerShell基于.Net架构研制,既兼容原“命令提示符”的所有功能,又吸收了Linux系统中Bash命令行的诸多优点。PowerShell的主要特性有:一是具备强大的系统管理功能,不仅可以直接操作注册表,还可以通过WMI(WindowsManagement Instrumentation)接口对操作系统进行各类配置;二是支持管道操作,即前一条命令的返回结果可直接作为后一条命令的参数,因此可以通过管道将多条命令组合成一条命令,而且可以通过查询、筛选等命令对经过管道传输的数据进行过滤;三是支持网络和远程处理,除下载和传输文件等常规网络操作之外,还支持通过远程管理的方式在一组网络可达的计算机中执行PowerShell命令或脚本。此外,PowerShell还支持对象操作、后台异步运行等特性。
PowerShell最大的优势是支持脚本解析运行和调试,而且脚本编写方式非常灵活。在脚本文件中,除PowerShell的内置命令外,还可以直接调用.Ne t框架的类库实现非常复杂的程序逻辑。PowerShell脚本文件的正文一般为纯文本形式,语法规则与其他脚本语言类似,常用的扩展名为ps1、psc1和psm1,分别表示通用脚本、命令行脚本和脚本模块。可以根据上述特征初步判断一个文件是否为PowerShell脚本文件。
二、 PowerShell安全机制
PowerShell强大的功能在给运维人员和用户带来方便的同时,也给攻击者带来了可乘之机。从上节介绍的PowerShell特性可以看出,攻击者一旦能够从远程执行PowerShell脚本,或诱使用户执行恶意的PowerShell脚本,就可能执行非常危险的操作,例如修改系统安全配置、窃取用户数据文件等,甚至可以进一步植入后门进行持续性攻击。为了降低可能存在的安全风险,微软为PowerShell提供了一些基本安全机制,限制恶意脚本的直接运行。最常见的安全机制有“执行策略” 和反恶意程序扫描接口(Anti-Malware ScanInterface,AMSI)。
“执行策略”主要通过检测和验证签名的方法限制脚本文件的运行,该策略的默认取值为Restricted,即除了部分带有微软数字签名的脚本文件外,其他脚本一律无法直接运行。此外常见的取值还有:AllSigned,即经数字签名后的脚本才可运行;RemoteSigned,即本地脚本可直接运行,远程脚本则需数字签名才能运行;Unrestricted,即所有脚本文件均可运行。用户可以在PowerShell命令行中运行Get-ExecutionPolicy命令查看当前的策略取值。
AMSI用于为Microsoft Defender等杀毒软件提供PowerShell脚本检测接口。脚本在运行时,AMSI将对脚本的代码进行检测,并通过接口传递给系统内的杀毒软件。如杀毒软件发现代码存在恶意特征,将中止脚本的执行,并将结果反馈给用户。
除了以上2种安全机制外,PowerShell还能够对可运行的语言和函数进行限制,这些机制都可以在一定程度上提高PowerShell运行环境的安全性。
三、PowerShell攻击方法
利用PowerShell进行攻击一般分为2个方面:一方面是攻击者利用系统漏洞向用户终端释放恶意的PowerShell脚本,另一方面是攻击者通过发送钓鱼邮件等方式诱导用户下载和运行恶意PowerShell脚本。尽管PowerShell提供了相应的安全机制,但是攻击者依然可以通过多种方法绕过这些机制进行攻击。针对“执行策略”对运行脚本文件的限制,攻击者可诱导用户关闭这一限制,或通过参数设置等方法绕过该限制,而由于脚本文件大多为纯文本形式,攻击者可以很容易地对脚本的内容进行编码、混淆,使其绕过AMSI机制的检测,也绕过用户肉眼的识别。
下面以输出“Hello World”为例介绍几种常见的绕过“执行策略”、对代码进行编码和混淆的方法。为了便于介绍,我们首先创建一个脚本文件,内容为“write-host'HelloWorld'”,保存在D:\test.ps1。如果用户在该文件的图标上点击右键,选择“使用PowerShell运行”,是可以作为主动执行的方式运行该脚本文件的。如果在PowerShell命令行中直接输入上述内容,同样可以运行,如图1的①所示。但是,受“执行策略”的限制,在PowerShell命令行中无法直接运行该脚本文件,如图1 的②所示。然而,如果通过Get-Content方法读取文件内容,再将内容通过管道作为PowerShell的输入,则可绕过这一限制,如图1的③所示。