如何防范PowerShell代码注入漏洞绕过受限语言模式
导语:受限语言模式是缓解PowerShell攻击的一种方式,能够阻止执行任意未签名的代码。
介绍
受限语言模式是缓解PowerShell攻击的一种方式,能够阻止执行任意未签名的代码。当Device Guard或者AppLocker处于强制模式时,它是最实际有效的强制安全措施,因为未被策略允许的任何脚本或者模块都位于受限语言模式下,这严重限制了攻击者执行未签名的代码。通过限制语言模式限制了Add-Type的调用。限制Add-Type明显是考虑到了它能编译并加载任意的C#代码到你的运行空间中去。
但策略允许的PowerShell代码运行在“Full Language”模式下,允许执行Add-Type。这样,微软签名的PowerShell代码就能调用Add-Type。不相信吗?运行下面的命令你就会发现我是正确的。
利用
现在想象如果以下的PowerShell模块代码(暂且被称为“VulnModule”)是由Microsoft签名的。
ls C:* -Recurse -Include '*.ps1', '*.psm1' | Select-String -Pattern 'Add-Type' | Sort Path -Unique | % { Get-AuthenticodeSignature -FilePath $_.Path } | ? { $_.SignerCertificate.Subject -match 'Microsoft' }
那么有什么可以影响来自受限语言模式的Add-Type的输入呢?
让我们一起思考下吧:
1. Add-Type作为类型定义传递给一个全局变量。因为它是全局的,它可以被任何人访问,包括我们和攻击者。
2. 问题是,签名的代码先于调用Add-Type就定义了全局变量,因此如果我们使用自定义的恶意C#代码,这将会被合法的代码覆盖。
3. 你知道能用Set-Variable cmdlet来设置变量只读吗?你知道我现在在想什么了吧?
武器化
好的,为了从受限语言模式注入代码到Add-Type,攻击者需要将它们的恶意代码定义为只读变量,从而设置全局“Source”变量来拒绝签名的代码。这是一个武器化的概念证明:
$Global:Source = @' public class Test { public static string PrintString(string inputString) { return inputString; } }'@ Add-Type -TypeDefinition $Global:Source
简要说明下Add-Type注入缺陷。受限语言模式的一个限制是你不能调用非白名单类的.NET方法,但有两个例外:属性(getter方法)和ToString方法。在上面的PoC中,我选择了实现一个静态的ToString方法,因为ToString允许传递参数(getter不行)。我的类也是静态的,因为.NET类的白名单只在New-Object实例化对象时适用。
那么上面的漏洞代码是否听起来不切实际呢?你可以这么认为,但是Microsoft.PowerShell.ODataUtils 模块中的Microsoft.PowerShell.ODataUtils也有这个漏洞。微软在 CVE-2017-0215, CVE-2017-0216, CVE-2017-0219中修复了它。说实话,我不太记得了。Matt Nelson 和我都报告了这些注入bug。
缓解攻击
尽管微软在推动解决这个漏洞,我们有什么可以做的呢?
有个关于UMCI绕过二进制的有效的黑名单规则是文件名规则,其能基于PE文件中版本信息资源中的原始文件名来阻止程序执行。PowerShell很明显不是个PE文件,它是文本文件,因此文件名规则不适用。但是,你可以通过使用哈希规则强制阻止有漏洞的脚本。Okay…要是相同脚本有不止一个漏洞呢?目前为止你只阻止一个哈希。你开始注意这个问题了吗?为了有效的阻止之前所有有漏洞的版本的脚本,你必须知道所有有漏洞的版本的哈希。微软意识到了问题并尽最大努力来扫描所有之前发布的有漏洞脚本,且收集哈希将他们整合到了黑名单中。
通过他们的哈希阻止所有版本的有漏洞的脚本有一定挑战性,但能一定程度上阻止攻击。这就是为什么一直迫切需要只允许PowerShell 5的执行并要开启scriptblock日志记录。Lee Holmes 有篇关于如何有效的阻止老版本的PowerShell的博文。
另一种方式是系统中大部分脚本和二进制都是catalog和Authenticode签名的。Catalog签名不是意味着脚本有内嵌的Authenticode签名,而是它的哈希存储在微软签名的catalog文件中。因此当微软更新时,老版本的哈希将会过期,将不再是被签名的了。现在,一个攻击者也能将老的签名的catalog文件插入到catalog存储中。你不得不提权执行操作,关于这个,有很多方法可以绕过Device Guard UMCI。作为一个搜索有漏洞脚本的研究员,首先要寻找具有内嵌Authenticode签名的有漏洞脚本(有字符串“SIG # Begin signature block”的提示)。Matt Nelson说这种bypass脚本存在。
报告
如果你找到了一种绕过,请将它上报给secure@microsoft.com ,你将得到一个CVE。PowerShell团队积极解决注入缺陷,但是他们也主动解决用于影响代码执行的一些方式。
总结
尽管受限语言模式能有效的阻止未签名代码的执行,PowerShell和它的签名过的模块或脚本还是有很多攻击面。我鼓励每个人都来寻找更多的注入缺陷,上报他们,通过官方的MSRC获得荣誉,并使得PowerShell生态变得更加安全。同时希望,PowerShell的代码作者要自我检视。
现在我解释了所有的内容,但是因为设计缺陷允许利用竞争条件,所以调用Add-Type还是有注入的漏洞。我希望能继续阐述这些问题,且希望微软将考虑解决这个基础问题。
相关文章
- 本文为那些对学习 Windows PowerShell 命令行和脚本编写环境感兴趣的系统管理员提供了资源。也请告诉我们本网站如何才能对您更有用处。...2020-06-30
PowerShell中使用Get-Date获取日期时间并格式化输出的例子
这篇文章主要介绍了PowerShell中使用Get-Date获取日期时间并格式化输出的例子,本文讲解了直接调用Get-Date、在Write-Host中使用Get-Date、格式化输出的方法,需要的朋友可以参考下...2020-06-30- 这篇文章主要介绍了自动设置安卓手机wifi代理的PowerShell脚本,帮助大家进行抓包测试,感兴趣的朋友可以了解下...2020-10-17
PowerShell读取文件内容、替换文件内容、读取限定行的例子
这篇文章主要介绍了PowerShell读取文件内容、替换文件内容、读取限定行的例子,本文使用3个例子来说明实现这3个需求的操作技巧,需要的朋友可以参考下...2020-06-30- 下面小编就为大家带来一篇详谈Ubuntu PowerShell(小白入门必看教程)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-30
powershell解决win10开始菜单和通知中心无法打开
这篇文章主要介绍了powershell解决win10开始菜单和通知中心无法打开的相关资料,需要的朋友可以参考下...2020-06-30- 本文介绍PowerShell中使用match操作符,配合正则表达式从数组中筛选出想要的内容,需要的朋友可以参考下...2020-06-30
原创powershell脚本小工具ctracert.ps1跟踪路由(win8以上系统)
这篇文章主要介绍了原创powershell脚本小工具ctracert.ps1跟踪路由(win8以上系统),需要的朋友可以参考下...2020-06-30Windows PowerShell是啥?看完本文你就懂它了
这篇文章主要介绍了Windows PowerShell是啥?Windows PowerShell是什么?Windows PowerShell有哪些特性?Windows PowerShell有什么用?看完本文你就懂它了,需要的朋友可以参考下...2020-06-30- 这篇文章主要介绍了PowerShell 远程执行任务的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-30
添加powershell脚本来解决nuget打包文件丢失问题
这里给大家分享的是作者在使用nuget打包的过程中遇到丢失文件的问题的时候使用powershell脚本实现的解决办法,非常的巧妙,这里推荐给大家...2020-06-30- 这篇文章主要介绍了Powershell 脚本数字签名实现方法,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了Powershell 获取特定的网页信息的代码,需要的朋友可以参考下...2020-06-30
- 这篇文章主要给大家介绍了关于PowerShell中Job相关命令及并行执行任务的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。...2020-06-30
- win10已经正式发售了很多天了,那么他其中搭配的PowerShell 5.0又有什么新的变化呢,今天我们就来探询一下。...2020-06-30
PowerShell 读取性能计数器二进制文件(.blg)记录并汇总计算
由于监控及报告需要,要统计性能计数器每天数值情况,确认数据库服务器的运行状况。若打开计数器填写,比较麻烦,现在统计用 powershell 来读取计数器的值...2020-06-30用PowerShell删除N天前或指定日期(前后)创建(或修改)的文件
这篇文章主要介绍了用PowerShell删除N天前或指定日期(前后)创建(或修改)的文件,需要的朋友可以参考下...2020-06-30- 下面小编就为大家分享一篇基于PowerShell在Ubuntu系统的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-06-30
- 这篇文章主要介绍了Powershell错误处理之what-if的相关资料,需要的朋友可以参考下...2020-06-30
- 这篇文章主要介绍了通过DNS TXT记录执行powershell的相关资料,以及nishang的脚本使用,需要的朋友可以参考下...2020-06-30