购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 PowerShell基础

2005年,Microsoft发布了PowerShell。PowerShell是一种功能强大的脚本语言和Shell程序框架,用于取代默认命令提示符,便于系统管理员更灵活、更便利地管理计算机系统。然而,任何事物都具有两面性,PowerShell既是管理者的工具,也是攻击者的利器,已被广泛用于不同规模的网络攻击载体—计算机病毒的设计中,无论是下载器、内网横向移动,还是权限维持,都可见PowerShell技术的身影。因此,了解PowerShell对于计算机病毒攻防是大有裨益的。

2.2.1 PowerShell简介

PowerShell是一种强大的交互式命令行Shell和脚本语言,默认安装在Windows操作系统上,2016年后支持开源和跨平台。PowerShell基于.Net架构,既兼容原CMD命令提示符的所有功能,又吸收了Linux系统中Bash命令行的诸多优点。PowerShell具有如下特性:

(1)强大的系统管理功能。可直接操作注册表、WMI(Windows Management Instrumentation)及API。

(2)支持管道操作。所谓管道,就是前一条命令的返回结果可直接作为后一条命令的参数。通过管道将多条命令组合成一条命令,且可通过查询、筛选等命令对经过管道传输的数据进行过滤。

(3)支持网络和远程处理。除下载和传输文件等常规网络操作之外,还支持通过远程管理的方式在计算机中执行PowerShell命令或脚本。

(4)支持对象操作、后台异步运行等。

由于PowerShell具有广泛的Windows内部访问权限,系统管理员经常使用它来管理和配置操作系统,并自动完成复杂的任务。与此同时,攻击者也经常使用内置的Windows命令行和脚本工具来运行其命令,使PowerShell成攻击者手头的必备工具之一。

在技术层面上,PowerShell通过应用程序编程接口(API)、进程(如WMI)和.Net框架享有访问Windows操作系统的特权。PowerShell可直接将Shellcode加载至内存执行,并使用模糊命令和反射注入以规避检测与查杀。攻击者利用PowerShell可实现如下功能:

(1)创建在内存中运行的无文件恶意代码;

(2)访问操作系统调用以执行复杂操作;

(3)加载恶意代码至内存中以实现持久化驻留;

(4)发现信息、收集和泄露数据;

(5)网络横向移动以进一步渗透攻击。

尽管PowerShell技术归类于MITRE ATT&CK框架的执行(Execution)策略中,但其依然能通过代码混淆、远程下载至内存执行等来实现防御规避(Defense Evasion)策略。

2.2.2 PowerShell基本概念

1.PowerShell脚本

PowerShell脚本类似于CMD控制台上的批处理文件,是包含PowerShell代码的文本文件。常用的PowerShell扩展名为.ps1、.psc1、.psd1和.psm1,分别表示通用脚本、命令行脚本、清单脚本和脚本模块。可通过文本编辑工具创建PowerShell脚本。

当运行PowerShell脚本文件时,如只输入脚本的文件名,会出现报错,需要使用相对路径或者绝对路径方式来运行PowerShell脚本文件。例如,利用记事本创建一个PowerShell脚本文件gpnu.ps1(见图2-25)。

$PopUpWin=new-object-comobject wscript.shell

$PopUpWin.popup("Hello World,Welcome to School of Cybersecurity,GPNU!")

图2-25 PowerShell脚本文件gpnu.ps1

运行上述创建的PowerShell脚本文件gpnu.ps1会显示出弹出框(见图2-26)。

图2-26 运行PowerShell脚本文件

2.执行策略

为预防执行恶意脚本,PowerShell规定有相应的执行策略。PowerShell脚本能否执行取决于所设定的执行策略。PowerShell的执行策略主要有以下4个。

(1)Restricted:脚本不能运行(默认设置);

(2)RemoteSigned:本地创建的脚本可运行,但从网上下载的脚本不能运行(拥有数字证书签名除外);

(3)AllSigned:仅当脚本由受信任的发布者签名时才能运行;

(4)Unrestricted:权限最高,允许所有脚本运行。

如要查看PowerShell所支持的执行策略,可输入如下命令(见图2-27):

图2-27 PowerShell所支持的执行策略

如要获取PowerShell当前的执行策略,可使用如下命令(见图2-28):

图2-28 获取PowerShell当前执行策略

当需要更改PowerShell当前执行策略时,可使用命令Set-ExecutionPolicy[策略名]来完成(见图2-29)。

3.管道(Pipeline)

PowerShell的管道作用是将一个命令的输出作为另一个命令的输入,两个命令之间用管道符号“|”连接。管道的概念与真实生活中的生产线比较相似:在不同的生产环节进行连续的再加工。在DOS系统的CMD控制台中,也有管道的概念,如Dir|More可将结果进行分屏显示。CMD管道是基于文本的,而PowerShell管道则是基于对象的(见图2-30)。

图2-29 更改PowerShell当前执行策略

图2-30 PowerShell管道

上述图例中,“Get-ChildItem”是获取当前路径的所有项目,“|Where-Object{$_.Length-gt 5000000}”是查看上一步结果,取所有长度大于5000000的项目,“|Sort-Object-Descending Name”是查看上一步结果,按照Name进行倒述排列。

4.管理Microsoft Defender防病毒软件

从Windows 10开始,Microsoft Defender防病毒软件成为Windows安全中心的一部分,列在“病毒和威胁防护”子项中。它提供了强大的实时保护,可抵御有害病毒、勒索软件、间谍软件、Rootkit,以及许多其他形式的恶意软件对系统的威胁。尽管Windows安全中心的“病毒和威胁防护”提供了日常的防病毒功能,但有时在实验PowerShell命令或运行PowerShell脚本时,也会被Microsoft Defender防病毒软件查杀,以至于无法完成实验、达不到实验目的。此时,可利用PowerShell来管理Microsoft Defender防病毒软件。

1)检查Microsoft Defender状态

如要使用PowerShell检查Microsoft Defender的当前状态,可使用以下命令并确认AntivirusEnabled为True(见图2-31)。

图2-31 查询Microsoft Defender的当前状态

2)查询Microsoft Defender所有可用首选项

如要查询并列出Microsoft Defender的所有可用首选项,可使用如下命令以了解其防病毒软件的所有设置(见图2-32)。

图2-32 查询Microsoft Defender的所有可用首选项

3)禁用Microsoft Defender防病毒软件

尽管Microsoft Defender提供了禁用防病毒软件命令,但它受防篡改功能的保护,我们可以通过Windows安全中心提供的“病毒和威胁防护”设置来禁用它。如要禁用防病毒,请关闭“篡改防护”,并使用如下命令(见图2-33)。

图2-33 禁用Microsoft Defender防病毒软件

如需启用防病毒软件,则可使用如下命令(见图2-34)。

图2-34 启用Microsoft Defender防病毒软件

类似地,可使用以下命令禁用/启用Microsoft Defender防病毒软件的防护功能:

(1)Set-MpPreference-DisableIOAVProtection$true(禁用)。

(2)Set-MpPreference-DisableIOAVProtection$false(启用)。

或者,使用以下命令禁用/启用Microsoft Defender防病毒软件的行为扫描功能:

(1)Set-MpPreference-DisableBehaviorMonitoring$true(禁用)。

(2)Set-MpPreference-DisableBehaviorMonitoring$false(启用)。

当然,也可顺便使用以下命令关闭/打开防火墙:

(1)netsh advfirewall set allprofiles state off(关闭)。

(2)netsh advfirewall set allprofiles state on(打开)。

5.管理反恶意程序扫描接口

Microsoft公司开发的反恶意软件扫描接口(Anti-Malware Scan Interface,AMSI)是防御恶意软件攻击的一种解决方案。通常情况下,Microsoft Defender防病毒软件已自动与AMSI API交互集成,以确保其能实时扫描PowerShell脚本、Windows Script脚本、VBScript脚本、JavaScript脚本、Jscript脚本等恶意脚本,防止随意执行恶意代码。当脚本运行时,AMSI会实时检测脚本代码,并通过接口将结果传递给Windows系统内安装的安全软件。如安全软件发现脚本代码存在恶意特征,会拦截并中止脚本执行。

AMSI只是一个通道,真正检测出恶意脚本还需要靠安全软件。AMSI与安全软件的区别在于:无论恶意脚本是经过多次混淆模糊处理还是远程执行,AMSI都可在恶意脚本注入内存前检测出来,而安全软件则不一定能检测到。当用户执行脚本或启动PowerShell时,AMSI.dll将会动态加载至内存。在执行脚本之前,防病毒软件使用如下两个API函数来扫描缓冲区和字符串以查找恶意软件特征:AmsiScanBuffer(0,AmsiScanString(0。

目前,AMSI功能已集成至Windows 10和Windows Server 2016系统中,位于C:\windows\system32\amsi.dll。Windows 10系统中的如下组件已集成了AMSI:

(1)UAC(User Accout Control,用户账户控制),位于%windir%\System32\consent.exe。

(2)Powershell(System.Management.Automation.dll).

(3)Windows脚本宿主(wscript.exe、cscript.exe)。

(4)JavaScript(%windir%\System32\jscript.dll).

(5)VBScript(%windir%\System32\vbscript.dll).

(6)Office VBA宏(VBE7.dll)。

(7).NET Assembly(clr.dll).

(8)WMI(%windir%\System32\wbem\fastprox.dll).

为了绕过AMSI以免被检测扫描,攻击者在利用PowerShell脚本时,通常会使用如下方法。

(1)降级攻击。由于低版本(2.0)的PowerShell中没有集成AMSI,可降低版本至PowerShell 2.0上执行恶意脚本,就不会被检测到。使用如下命令改变PowerShell运行版本至2.0(见图2-35)。

如要在脚本中使用低版本PowerShell,则需要在脚本开头加入#requires-version 2,这样系统如能降级至PowerShell 2.0,则以2.0执行脚本;如不能,会按照当前PowerShell版本执行。当然,并非所有脚本都能在低版本的PowerShell上执行。

(2)拆分字符。当PowerShell脚本中含有敏感的特征字符时,拆分字符也是绕过AMSI检测扫描的一种方法(见图2-36)。

图2-35 切换Powershell版本

图2-36 拆分字符执行

(3)禁用AMSI。通过修改注册表,将HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable的键项值设置为0(见图2-37)。

图2-37 通过注册表禁用AMSI

6.管理Windows防火墙

为了保护系统免受未经授权的传入和传出网络连接的侵害,Windows系统内置了防火墙管理系统。使用Windows防火墙,用户可设置特殊规则来控制出站和入站的网络连接。如Windows防火墙无法正常工作,或者安装了第三方防火墙软件,或者实验需要禁用/启用Windows防火墙,可利用PowerShell命令管理(禁用/启用)Windows防火墙。

1)禁用Windows防火墙

(1)在任务栏的搜索框中输入“PowerShell”,在搜索结果中选择“以管理员身份运行”,打开PowerShell。

(2)在PowerShell窗口中,使用以下命令禁用Windows Defender防火墙(见图2-38):

2)启用Windows防火墙

如要启用防火墙,需要以管理员身份在PowerShell窗口中运行以下命令(见图2-39):

图2-38 禁用Windows防火墙

图2-39 启用Windows防火墙

2.2.3 PowerShell安全技术

由于PowerShell集成于Windows系统内,已成为攻击者设计攻击载体(计算机病毒)的一种常见安全技术。PowerShell具有如下特性。①无文件性。PowerShell无须磁盘文件,可直接从远程加载至内存执行,能防御多数安全软件。②离地攻击性。由于PowerShell是已集成于Windows系统中的系统自带的、受信任的工具,因此攻击者无须增加额外的工具,就能有效规避安全软件。③易混淆性。PowerShell是一种脚本语言,易实现多种混淆方式,以对抗规避安全软件。④功能适应性。PowerShell可支持WMI和.NET框架,且内置了远程管理机制,可适用于多种攻击场景。本节重点探讨PowerShell混淆技术和绕过技术。

1.混淆技术

混淆就是将PowerShell脚本程序代码,转换成一种功能上等价而又难于阅读和理解的形式的行为,即故意模糊源代码,使人类或安全软件难以理解的行为。就本质而言,混淆完全改变了源代码,但仍在功能上等价于原始代码。

根据PowerShell的语法特征,混淆对象主要分为3类:①命令本身;②函数与对象;③参数。针对上述对象,可分别采用不同的混淆技术。

1)针对命令本身的混淆技术

(1)采用别名/缩写方法。PowerShell的命令支持别名或缩写方式输入。在PowerShell中输入alias命令即可查看所有命令的别名/缩写(见图2-40)。

图2-40 PowerShell中命令的别名

为演示混淆技术,我们使用Python命令建立简易的Web服务器如下(见图2-41):

图2-41 利用Python建立简易的Web服务器

由于某些敏感命令会被安全软件拦截,此时可尝试使用命令别名/缩写方式执行。例如,原来要执行的PowerShell命令如下:

可用IEX替代Invoke-Expression命令,即

尽管使用了别名替换,但执行结果仍然相同(见图2-42)。

图2-42 利用别名进行混淆

(2)使用invoke命令。在PowerShell中,可使用invoke命令调用其他命令,从而达到混淆目的。可使用(‘DownloadString’).invoke(’http://127.0.0.1∶8000/gpnu.txt’)来替换原来的DownloadString(‘http://127.0.0.1∶8000/gpnu.txt’)。尽管这两条命令看似不同,但其执行结果相同(见图2-43):

图2-43 利用Invoke命令进行混淆

(3)使用NewScriptBlock命令。PowerShell中,可使用$ExecutionContext.InvokeCommand.NewScriptBlock(“”)的方式创建脚本块,再将需要执行的语句嵌入其中,也可达到混淆目的(见图2-44):

(4)使用Invoke-Command命令。由于Invoke-Command命令具有执行其他命令的功能,可将Invoke-Expression命令行嵌入Invoke-Command命令中以达到混淆目的(见图2-45):

图2-44 利用NewScriptBlock命令进行混淆

图2-45 利用Invoke-Command命令进行混淆

2)针对函数与对象的混淆技术

(1)采用大小写与特殊字符。首先,PowerShell对于大小写不敏感,可采用大小写搭配的方式进行混淆。其次,可在PowerShell脚本中增加空格,通常不会影响脚本运行,以达到混淆目的。最后,还可在脚本中的对象函数上使用“括号与引号”,将其转化为字符串执行,以达到混淆目的(见图2-46)。

图2-46 利用括号与引号进行混淆

(2)采用字符串变换。首先,可在字符串中使用Split与Join或者Replace等方法分割、替换原来的PowerShell命令行字符串(见图2-47)。

图2-47 利用Split、Join、Replace等方法进行混淆

其次,可使用引号对PowerShell命令行字符进行分段拼接(见图2-48)。

图2-48 利用引号进行拼接混淆

最后,可将PowerShell命令行字符串进行反转,以达到混淆目的(见图2-49)。

图2-49 利用字符串反转进行混淆

3)针对参数的混淆技术

(1)采用base64编码。首先,可使用base64编码对参数进行混淆,再使用PowerShell-EncodedCommand命令来解码执行(见图2-50)。

图2-50 利用base64编码进行混淆

其次,还可将要执行的PowerShell命令行进行base64编码(见图2-51)。

再使用FromBase64String函数,将经过base64编码后的命令解码为正常的PowerShell命令执行,以达到混淆目的(见图2-52)。

图2-51 对PowerShell命令行进行base64编码

图2-52 利用base64编码进行混淆

(2)采用SecureString混淆。SecureString是一种加解密方式,可以通过密钥对PowerShell脚本进行加解密,以实现脚本混淆。例如,可使用如下命令来替代原来的命令行(见图2-53):

图2-53 利用SecureString进行混淆

目前,网上还有很多针对PowerShell脚本的混淆工具,如Invoke-Obfuscation、Invoke-CraftCraft、Chimera等,可利用这些混淆工具对PowerShell脚本进行有针对性地混淆。

2.绕过技术

攻击载体(计算机病毒)在传播至目标系统后,通常面临着本地执行策略与安全软件的拦截与查杀。由于PowerShell默认的执行策略是Restricted,即执行受限模式。如要运行PowerShell脚本,则须将Restricted策略更改成Unrestricted或Bypass。为了能成功执行,PowerShell类恶意脚本需要采取相应的绕过技术。常用的绕过技术大致包括如下三类。

1)绕过本地权限执行

在将PowerShell脚本gpnu.ps1上传至目标系统后,通过修改执行策略为Bypass(PowerShell.exe-ExecutionPolicy Bypass)来绕过本地默认的执行策略。在CMD环境下输入如下命令即可绕过执行策略并顺利运行该脚本(见图2-54):

图2-54 在CMD环境中执行PowerShell脚本

2)隐藏绕过权限执行

PowerShell脚本在目标系统执行时,如能隐匿执行自身,则可有效规避用户和安全软件,达到绕过目的。可输入如下命令来隐藏绕过权限执行:

或者采用别名缩写方式输入如下命令(见图2-55):

图2-55 隐藏执行PowerShell脚本

在CMD环境中执行上述脚本后将会自动退出CMD命令提示符环境,从而达到既绕过本地执行权限又隐匿执行并退出的目的。

3)用IEX远程下载并绕过权限执行

为模拟远程下载,可利用Python建立简易的Web服务器。假设系统的IP地址为192.168.1.7,且PowerShell脚本存放在H:\tests目录下,使用如下命令即可建立Web服务器(见图2-56):

图2-56 利用Python建立简易Web服务器

再利用PowerShell的IEX(Invoke-Expression)命令从远程下载PowerShell脚本至内存执行,使用的命令如下(见图2-57):

图2-57 利用IEX远程下载并执行PowerShell脚本 VEAuVBvBStychcF46tDiwLYsYTuPX0yS5J1Jw47+l71OldqAzxCZXt/N8qu+b4fr

点击中间区域
呼出菜单
上一章
目录
下一章
×