利用PowerShell代码注入漏洞绕过受限语言模式

  • 时间:
  • 浏览:0
  • 来源:5分3D官方_极速5分排列5

本文作者:myswsun

二、漏洞利用

简要说明下Add-Type注入欠缺。受限语言模式的一四个 限制这么 你这么 调用非白名单类的.NET最好的最好的办法,但有一四个 例外:属性(getter最好的最好的办法)和ToString最好的最好的办法。在上方的PoC中,我选者了实现一四个 静态的ToString最好的最好的办法,可能ToString允许传递参数(getter不行)。我的类也是静态的,可能.NET类的白名单只在New-Object实例化对象时适用。

最简单的阻止這個 注入攻击的最好的最好的办法是,直接在Add-Type使用单引号的here-string给TypeDefinition。单引号的字符串无需扩展任何内嵌的变量可能表达式。当然,這個 场景假设了你是编译静态代码。可能你动态生成代码给Add-Type,要特别注意攻击者可能影响你的输入。为了理解影响PowerShell中代码执行的最好的最好的办法,可不无需 参见我在PSConf.EU上的演讲“Defensive Coding Strategies for a High-Security Environment”。

这么 上方的漏洞代码不是听起来不切实际呢?给你这么 认为,或者 或者 Microsoft.PowerShell.ODataUtils 模块中的Microsoft.PowerShell.ODataUtils有的是這個 漏洞。微软在 CVE-2017-0215, CVE-2017-0216, CVE-2017-0219中修复了它。说实话,我不太记得了。Matt Nelson 和我都报告了那此注入bug。

四、阻止最好的最好的办法

一、 前言

2. 那此的问题是,签名的代码先于调用Add-Type就定义了全局变量,或者 或者 可能让我们让我们让我们 让我们让我们让我们 使用自定义的恶意的C#代码,这可能被合法的代码覆盖。

六、报告

现在我解释了所有的内容,或者 或者 可能设计欠缺允许利用竞争条件,或者 或者 调用Add-Type还是有注入的漏洞。假如有一天能继续阐述那此那此的问题,且希望微软将考虑处理這個 基础那此的问题。

来源:51CTO

受限语言模式是有三种非常有效的机制,能阻止在PowerShell中执行任意未签名的代码。当Device Guard可能AppLocker占据 强制模式时,它是最实际有效的强制安全最好的最好的办法,可能未被策略允许的任何脚本可能模块都占据 受限语言模式下,这严重限制了攻击者执行未签名的代码。通过限制语言模式限制了Add-Type的调用。限制Add-Type明显是考虑到了它能编译并加载任意的C#代码到你的运行空间中去。但策略允许的PowerShell代码运行在“Full Language”模式下,允许执行Add-Type。从前,微软签名的PowerShell的代码就能调用Add-Type。不相信吗?运行下面的命令你就会发现我是正确的。

可能你找到了有三种绕过,请将它上报给secure@microsoft.com ,你将得到一四个 CVE。PowerShell团队积极处理注入欠缺,或者 或者 让我们让我们让我们 让我们让我们让我们 也主动处理用于影响代码执行的或者 最好的最好的办法。

好了,给让我们让我们让我们 让我们让我们让我们 同时思考下吧:

三、武器化利用

1. Add-Type作为类型定义传递给一四个 全局变量。可能它是全局的,它可不无需 被任何人访问,包括让我们让我们让我们 让我们让我们让我们 和攻击者。

另有三种最好的最好的办法是系统中大次要脚本和二进制有的是catalog和Authenticode签名的。Catalog签名有的是意味脚本有内嵌的Authenticode签名,或者 或者 它的哈希存储在微软签名的catalog文件中。或者 或者 当微软更新时,老版本的哈希可能过期,将不再是被签名的了。现在,一四个 攻击者无需 将老的签名的catalog文件插入到catalog存储中。你不得不提权执行操作,关于這個 ,有或者 或者 最好的最好的办法可不无需 绕过Device Guard UMCI。作为一四个 搜索有漏洞脚本的研究员,首不能自己寻找具有内嵌Authenticode签名的有漏洞脚本(有字符串“SIG # Begin signature block”的提示)。Matt Nelson说這個 bypass脚本占据 。

有个关于UMCI绕过二进制的有效的黑名单规则是文件名规则,其能基于PE文件中版本信息资源中的原始文件名来阻止进程执行。PowerShell很明显有的是个PE文件,它是文本文件,或者 或者 文件名规则不适用。或者 或者 ,给你通过使用哈希规则强制阻止有漏洞的脚本。Okay…或者 或者 相同脚本有不止一四个 漏洞呢?目前为止你只阻止一四个 哈希。你开使英语 注意這個 那此的问题多会儿?为了有效的阻止前一天所有有漏洞的版本的脚本,你需要知道所有有漏洞的版本的哈希。微软意识到了那此的问题并尽最大努力来扫描所有前一天发布的有漏洞脚本,且分发哈希将让我们让我们让我们 让我们让我们让我们 整合到了黑名单中。通过让我们让我们让我们 让我们让我们让我们 的哈希阻止所有版本的有漏洞的脚本有一定挑战性,但能一定程度上阻止攻击。这或者 或者 为那此经常迫切需要只允许PowerShell 5的执行并要开启scriptblock日志记录。Lee Holmes 有篇关于如可有效的阻止老版本的PowerShell的博文。

尽管受限语言模式能有效的阻止未签名代码的执行,PowerShell和它的签名过的模块或脚本还是有或者 或者 攻击面。我鼓励每买车人都来寻找更多的注入欠缺,上报让我们让我们让我们 让我们让我们让我们 ,通过官方的MSRC获得荣誉,并使得PowerShell生态变得更加安全。同时希望,PowerShell的代码作者要自我检视。

3. 你知道能用Set-Variable cmdlet来设置变量只读吗?你知道我现在在想那此了吧?

这么 有那此可不无需 影响来自受限语言模式的Add-Type的输入呢?

现在,想像一下可能下面的PowerShell模块代码(姑且称为“VulnModule”)有微软的签名:

七、总结

五、缓解最好的最好的办法

好了,为了从受限语言模式注入代码到Add-Type中,攻击者需要定义让我们让我们让我们 让我们让我们让我们 的恶意代码为一四个 只读变量,拒绝签名代码设置全局变量“Source”。下面是PoC:

尽管微软在推动处理這個 漏洞,让我们让我们让我们 让我们让我们让我们 有那此可不无需 做的呢?