作家
登录

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

作者: 来源: 2017-09-07 16:29:24 阅读 我要评论

一、 媒介

应用PowerShell代码注入马脚绕过受限说话模式

受限说话模式是一种异常有效的机制,能阻拦在PowerShell中履行随便率性未签名的代码。当Device Guard或者AppLocker处于强迫模式时,它是孜实际有效的强迫安然办法,因为未被策略许可的任何脚本或者模块都位于受限说话模式下,这严重限制了进击者履行未签名的代码。经由过程限制说话模式限制了Add-Type的调用。限制Add-Type明显是推敲到了它能编译并加载随便率性的C#代码到你的运行空间中去。但策略许可的PowerShell代码运行在“Full Language”模式下,许可履行Add-Type。如许,微软签名的PowerShell的代码就能调用Add-Type。不信赖吗?运行下面的敕令你就会发明我是精确的。

如今我说清楚明了所有的内容,然则因为设计缺点许可应用竞争前提,所声调用Add-Type照样有注入的马脚。我欲望能持续阐述这些问题,且欲望微软将推敲解决这个基本问题。

二、马脚应用

那么竽暌剐什么可以影响来自受限说话模式的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' } 

好了,让我们一路思虑下吧:

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的博文。


  推荐阅读

  大数据可能「说谎」非结构化数据将呈现更丰富的世界

被忽视的非构造化数据 在2017年的下半年谈论大年夜数据似乎已经没有什么新意,甚职苄些令人生厌了,毕竟这个词在中国已经风行太久,形形色色的产品、平台和公司早已贴满了大年夜数据标签,>>>详细阅读


本文标题:利用PowerShell代码注入漏洞绕过受限语言模式

地址:http://www.17bianji.com/lsqh/37230.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)