内容简介:在我例如,本文基本上只是我重现Lee在他这篇文章中的一些检测技术,其中就包括一个可用于检测模糊化脚本的封装脚本。
在我 以前的文章 中,曾经描述过使用ObfuscatedEmpire来自动化C2通道中的PowerShell混淆,以逃避杀毒软件的签名,在那篇文章中,我也提到了其他人提出的用于检测恶意PowerShell脚本的技术。该技术最初由微软的李•霍尔姆斯(Lee Holmes)提出的,是为了搜寻混淆发生的一些线索。
例如, Invoke-Obfuscation 使用的令牌混淆技巧是将撇号,即将`插入到函数名称和其他登录凭据中。Invoke-Empire可能会成为iN`v`OK`e-`eM`p`IR`e,不过这些功能在PowerShell中的作用和Invoke-Empire是类似的,但会破坏与文字字符串“Invoke-Empire”匹配的杀软签名。但是,我真的希望脚本中的一半字符是由撇号组成吗? Lee早在2015年11月就对这一类型的检测方法进行过介绍。不过,在这篇文章中,我将主要参考他最近的一篇文章,该文为我们提供了一些非常棒的PowerShell功能,并利用Measure-CharacterFrequency和Measure-VectorSimilarity实现一些模糊检测技术。
本文基本上只是我重现Lee在他这篇文章中的一些检测技术,其中就包括一个可用于检测模糊化脚本的封装脚本。
这个脚本便是Invoke-ObfuscationDetection,主要的作用就是用作函数的封装器,可用于操作基于字符分析的混淆检测功能。Invoke-ObfuscationDetection会把PowerShell脚本定义为“正常”字符分布的基线,通过计算给定的PowerShell脚本的字符分布,定义给定脚本必须满足的字符分布的向量相似度,然后根据返回的布尔值是True或False来判断脚本是否被模糊化。
Invoke-ObfuscationDetection会返回一个“IsObfuscated”这样的布尔结果,给定一个包含脚本的字符串:
PS> Invoke-ObfuscationDetection -Script 'iN`v`OK`e-`eM`p`IR`e' Obfuscated ---------- True
Invoke-ObfuscationDetection还接受包含脚本的文件名作为输入的-ScriptPath参数:
PS /opt/ObfuscatedEmpire/data/obfuscated_module_source/> Get-ChildItem -Recurse -Include *.ps1 | Invoke-ObfuscationDetection | % { $_.Obfuscated } | Group-Object Count Name Group ----- ---- ----- 72 True {True, True, True, True...} 2 False {False, False}
该命令显示Invoke-Obfuscation的TokenAll1命令混淆的Empire模块上的Invoke-ObfuscationDetection的结果,我还可以通过Invoke-ObfuscationDetection(启用ScriptBlock日志记录)来提供ScriptBlock日志:
PS> Get-WinEvent -FilterHashtable @{ProviderName="Microsoft-Windows-PowerShell"; Id = 4104} | % { [PSCustomObject] @{ ScriptName = $_.Properties[3].Value; Script = $_.Properties[2].Value } } | Invoke-ObfuscationDetection | Select -First 2 Name Obfuscated ---- ---------- 2980cef2-ed31-4146-870a-a395b2d3debf True 431be04f-98a5-47cf-8e47-e565ccf6e520 False
在讨论Invoke-ObfuscationDetection的有效性之前,我认为有必要解释一下测试方法, Invoke-ObfuscationDetection在实现时,其最大的挑战便是要确定什么才能构成“正常”的PowerShell脚本。可以通过下载poshcode.org上的每个脚本,删除Windows Defender中有意混淆的脚本和识别为恶意软件的脚本(总共5552个脚本),并使用Measure-CharacterFrequency功能得到平均字符分布。
接下来的挑战便是确定平均字符分布时可接受的差异,因为并不是每个脚本都完全符合平均字符分布。虽然我会使用Measure-VectorSimilarity函数来测量每个脚本与平均字符分布的差异,但我如何决定哪些差异是能接受的,哪些是不能接受的?通过测试,我发现还是使用多年来的经验比较靠谱。我对5552个脚本中的一半进行了测试(以避免过度拟合),发现有一半会通过我提供的Measure-CharacterFrequency来确定平均字符分布。
检测的有效性验证
现在开启杀软环境,当我将一个模糊化的脚本提供给Invoke-ObfuscationDetection时,会发生假阴性错误,但是它没有被检测为混淆。当我向Invoke-ObfuscationDetection提供一个没有模糊化的脚本时,会发生假阳性错误,但它被检测为混淆。
在这样的情况下,确定假阳性或假阴性率发生的概率便非常重要,为此利用我多年的测试经验,我在测试过的脚本中确定了一些相似性较高的混淆脚本,以便把假阳性和假阴性的概率降到最低。我会对测试的脚本使用Invoke-Obfuscation的TokenAll1命令进行混淆,而将未混淆的那一半脚本提交给Invoke-ObfuscationDetection以确定假阳性发生的概率,然后我会将这些脚本提交到Invoke-ObfuscationDetection以确定假阴性发生的概率。
下图中,X轴代表相似度要求,Y轴代表发生的概率。
并且还有一些原始数据的细节:
在Lee的文章中,他建议相似性至少为0.8,通过实际测试,我的数据也显示出了相似的结果。在Lee的文章中,他提到大约2%的脚本低于0.8的相似率,我也看到类似的结果。根据这个0.8的要求,我可以推测出假阴性发生的概率大约为8%,这似乎与文章的推测是合理的。但在实践中,2%的假阳性发生率可能就太高了,而无法使用反恶意软件扫描接口(AMSI)来进行恶意检测。想象一下,如果你的电脑设备上的杀毒软件的假阳性发生率为2%,也就是说每50个恶意脚本就会出现一次,可想而知对于每天上万个脚本的检测来说,会发生多大的错误。
不过,我认为将2%的PowerShell脚本标记为可能被模糊处理的思路还是非常值得借鉴的。
由于Invoke-ObfuscationDetection在默认情况下的相似率必须为0.8,所以我们如果想要提高检测概率的话还得把相似率再提高一些:
PS> Invoke-ObfuscationDetection -Script "Inv`ok`e-Ex`pre`s`s`ion 'Write-Host test'" Obfuscated ---------- False PS> Invoke-ObfuscationDetection -Script "Inv`ok`e-Ex`pre`s`s`ion 'Write-Host test'" -RequiredSimilarity 0.85 Obfuscated ---------- True
最小化混淆的程度
这里的真正问题是所使用的混淆机制(Invoke-Obfuscation的TokenAll1命令)是脚本中所有登录凭据的随机混淆。所以目前大多数AMSI签名不需要太多的混淆来都能成功逃避杀毒软件的检测。
使用Invoke-Obfuscation的TokenAll1命令,X轴代表相似度要求,Y轴代表发生的概率,我们来看看误报率是多少:
并且还有一些原始数据的细节:
所以对于致力于杀软的研发人员来说,要想依靠无效或不完整的混淆检测来提醒我们是否发生了恶意的PowerShell混淆,那是不可能的。其中脚本被模糊化后就足以通过杀毒软件的检测,如果想要通过字符分析来检测到这些被模糊化的脚本,我们就应该把0.8相似度在最大限度的提高一些。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Computational Advertising
by Kushal Dave、Vasudeva Varma / Now Publishers Inc / 2014
Computational Advertising (CA), popularly known as online advertising or Web advertising, refers to finding the most relevant ads matching a particular context on the Web. The context depends on the t......一起来看看 《Computational Advertising》 这本书的介绍吧!