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

一、 前言

受限语言模式是一种非常有效的机制,能阻止在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脚本存在。

六、报告

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

七、总结

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

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

本文作者:myswsun

来源:51CTO

时间: 2024-09-17 03:56:39

利用PowerShell代码注入漏洞绕过受限语言模式的相关文章

绿盟科技网络安全威胁周报2017.12 关注fastjson远程代码执行漏洞 漏洞细节以及利用工具已经曝光

绿盟科技发布了本周安全通告,周报编号NSFOCUS-17-12,绿盟科技漏洞库本周新增44条,其中高危12条.本次周报建议大家关注 fastjson远程代码执行 .目前漏洞细节已经披露,可导致大规模对此漏洞的利用.强烈建议用户检查自己使用的fastjson是否为受影响的版本,如果是,请尽快升级. 焦点漏洞 fastjson远程代码执行 NSFOCUS ID 无 CVE ID 无 受影响版本 1.2.24及之前版本 漏洞点评 fastjson在反序列化时存在安全漏洞,攻击者可以通过提交一个精心构造

zabbix漏洞利用 Zabbix Server远程代码执行漏洞CVE-2017-2824 2.4.X均受影响

近日,Zabbix Server 2.4.X的trapper命令功能中被曝出存在可利用的代码执行漏洞(CVE-2017-2824). 一组特制的数据包可能导致命令注入,导致远程执行代码. 攻击者可以从活动的Zabbix Proxy发出请求以触发此漏洞.该漏洞位于Zabbix代码的"Trapper"部分,这是允许代理和服务器通信的网络服务(TCP端口10051). CVSSV3 SCORE: 9.0 - CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A

DedeCMS通杀SQL注入漏洞利用代码及工具介绍

近日,网友在dedecms中发现了全版本通杀的SQL注入漏洞,目前官方最新版已修复该漏洞,相关利用代码如下: EXP: Exp:plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\'   or mid=@`\'` /*!50000union*//*!50000select*/1,2,3,(select  CONCAT(0x7c,userid,0x7c,pwd)+from+`%23@__admin` limit+0,1),5,6,

最新DedeCMS通杀SQL注入漏洞利用代码整理

      dedecms即织梦(PHP开源网站内容管理系统).织梦内容管理系统(DedeCms) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,近日,网友在dedecms中发现了全版本通杀的SQL注入漏洞,目前官方最新版已修复该漏洞,相关利用代码如下:  代码如下 复制代码 /plus/recommend.php?action=&aid=1&_FILES[type][tmp_name]=\%27%20or%20mid=@`\%27`

Java Python的FTP注入漏洞 足以绕过大多数防护墙 目前没有官方补丁

这个漏洞足以绕过大多数防火墙的默认设置了,java和python都没有对恶意构造的FTP请求进行校验,目前Oracle和Python Software Foundation官方尚未修复该漏洞.绿盟科技发布<Java和Python应用的FTP命令注入漏洞安全威胁通告>,通告全文如下: 2017年2月20日,blog.blindspotsecurity.com 发布文章称,由Java开发的应用,存在潜在的FTP命令注入.攻击者可以利用该漏洞借助XXE或SSRF等其他漏洞发送未授权的电子邮件.攻击者

零日漏洞DoubleAgent的代码注入和持久性攻击技术分析

本文讲的是零日漏洞DoubleAgent的代码注入和持久性攻击技术分析, 近日Cybellum的安全专家发现了一种新型的零日漏洞病毒,该病毒会在攻击计算机前先破坏杀毒软件,Cybellum的安全专家将这种攻击手段命名为 DoubleAgent. DoubleAgent通过向杀毒软件注入代码从而修改杀毒软件的进程,进而获得设备的完整权限来对用户进行攻击. DoubleAgent利用了存在于Microsoft Application Verifier(应用程序检验器)的漏洞,目前确认的受影响的设备包

PHP-Nuke 存在绕过SQL注入保护及多个SQL注入漏洞

受影响系统: PHP-Nuke PHP-Nuke <= 8.0.0.3.3b 描述: PHP-Nuke是一个广为流行的网站创建和管理工具,它可以使用很多数据库软件作为后端,比如MySQL.PostgreSQL.mSQL.Interbase.Sybase等. PHP-Nuke实现上存在多个SQL注入漏洞,远程攻击者可能利用这些漏洞非授权操作数据库. 攻击者可以通过不同的过滤器绕过对SQL注入的保护.此外Web_Links.News和Download模块中还存在多个SQL注入漏洞. 厂商补丁: PH

利用脚本注入漏洞攻击ReactJS应用程序

ReactJS是一款能够帮助开发者构建用户接口的热门JavaScript库.在它的帮助下,开发者可以构建出内容丰富的客户端或Web应用,并且提前加载内容以提供更好的用户体验. 从设计角度来看,只要你能够按照开发标准来使用ReactJS的话,它其实是非常安全的.但是在网络安全领域中,没有任何东西是绝对安全的,而错误的编程实践方式将导致类似脚本注入漏洞之类的问题产生,这些错误的编程方式包括: 1.利用用户提供的对象来创建React组件; 2.利用用户提供的href属性来配置标签,或利用其他可注入的属

Windows Lnk远程代码执行漏洞(CVE-2017-8464)利用测试

本文讲的是Windows Lnk远程代码执行漏洞(CVE-2017-8464)利用测试,北京时间6月14日凌晨,微软发布编号为CVE-2017-8464的漏洞公告,官方介绍Windows系统在解析快捷方式时存在远程执行任意代码的高危漏洞,黑客可以通过U盘.网络共享等途径触发漏洞,完全控制用户系统,安全风险高危. 该漏洞的原理同2010年据称美国和以色列入侵并破坏伊朗核设施的震网行动中所使用的震网病毒(Stuxnet)非常相似,所以也被一些人称为"震网三代". 然而,通过百度搜索关键词&