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

[[202751]]

一、 前言

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

二、漏洞利用

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

  1. ls C:\* -Recurse -Include '*.ps1', '*.psm1' | 
  2.  Select-String -Pattern 'Add-Type' | 
  3.  Sort Path -Unique | 
  4.  % { Get-AuthenticodeSignature -FilePath $_.Path } | 
  5.  ? { $_.SignerCertificate.Subject -match 'Microsoft' } 

那么有什么可以影响来自受限语言模式的Add-Type的输入呢?

好了,让我们一起思考下吧:

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

2. 问题是,签名的代码先于调用Add-Type就定义了全局变量,因此如果我们使用自定义的恶意的C#代码,这将会被合法的代码覆盖。

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

三、武器化利用

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

  1. $Global:Source = @' 
  2.     public class Test { 
  3.         public static string PrintString(string inputString) { 
  4.             return inputString; 
  5.         } 
  6.     }'@ 
  7. 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。

四、阻止措施

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

五、缓解措施

尽管微软在推动解决这个漏洞,我们有什么可以做的呢?

有个关于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脚本存在。

六、报告

如果你找到了一种绕过,请将它上报给[email protected] ,你将得到一个CVE。PowerShell团队积极解决注入缺陷,但是他们也主动解决用于影响代码执行的一些方式。

七、总结

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

现在我解释了所有的内容,但是因为设计缺陷允许利用竞争条件,所以调用Add-Type还是有注入的漏洞。我希望能继续阐述这些问题,且希望微软将考虑解决这个基础问题。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/124445.html<

(0)
管理的头像管理
上一篇2025-02-23 06:59
下一篇 2025-02-23 07:00

相关推荐

  • 独立服务器和VPS哪个更适合长期运营,怎么选

    对于需要长期稳定运营的业务,独立服务器在资源独占性、性能可控性和硬件生命周期管理上优于VPS,但具体选择仍需结合业务规模、预算和技术团队能力综合判断,独立服务器与VPS的技术本质差异硬件架构:独占与共享的底层逻辑独立服务器是用户租用整台物理机的所有硬件资源,包括CPU、内存、硬盘和网络带宽,不存在与其他用户争抢……

    2026-07-28
    0
  • 站群服务器单C段和多C段到底哪个效果更好,哪个更稳定

    如果你的站群规模在10-100个站点之间,单C段效果更好;超过100个站点,多C段才是安全底线,单C段与多C段的核心区别站群服务器的核心逻辑在于IP资源的分配策略,单C段指的是所有IP都在同一个C类地址段内,比如192.168.1.0/24,最多254个可用IP,多C段则是跨不同C类网段分配IP,比如从192……

    2026-07-28
    0
  • 直播大带宽服务器选哪家不卡不掉线,怎么选

    直播不卡不掉线的核心在于服务器提供商的骨干网络质量、资源冗余以及合规资质,近年来,选择像简米科技(2003年始创,23年行业沉淀,持牌自营机房)和酷番云(工信部一类牌照,双认证,1000万注册资本)这类具备完整资质和自建网络的厂商,能显著降低直播故障率,直播卡顿掉线的常见原因分析直播过程中出现的卡顿和掉线,根源……

    2026-07-28
    0
  • 企业级服务器选什么品牌不容易出问题,有哪些推荐?

    企业级服务器选型,核心原则是选择经过大规模市场验证的硬件品牌,并搭配资质齐全、运维规范的IDC服务商,这样能最大程度降低故障率,企业级服务器选型的前置思考业务需求决定硬件方向企业级服务器选型,第一步不是看参数,而是梳理业务场景,数据库、虚拟化、高并发Web、边缘计算,对CPU、内存、I/O和扩展性的要求完全不同……

    2026-07-28
    0
  • 自建机房和租用IDC服务器哪个更划算,怎么选?

    对于绝大多数中小企业,租用IDC服务器比自建机房更划算,前期的资金投入和后期的运维成本都能控制在更低水平,且灵活性和可靠性更高,自建机房听上去“自主可控”,但现实中往往变成“自主看管”,一套完整的机房基础设施,从选址装修到电力空调,再到安防消防,每一项都需要实打实的资金和时间,而租用IDC服务器,本质上是在购买……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注