导语:受限语言模式是缓解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 } |
 "htmlcode">
  $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还是有注入的漏洞。我希望能继续阐述这些问题,且希望微软将考虑解决这个基础问题。

标签:
PowerShell攻击,PowerShell,受限语言模式,PowerShell注入漏洞

免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com

《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线

暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。

艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。

《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。