尝试根据字符频度检测Powershell混淆

栏目: 编程工具 · 发布时间: 5年前

内容简介:在我例如,本文基本上只是我重现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轴代表发生的概率。

尝试根据字符频度检测Powershell混淆

并且还有一些原始数据的细节:

尝试根据字符频度检测Powershell混淆

在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混淆

并且还有一些原始数据的细节:

尝试根据字符频度检测Powershell混淆

所以对于致力于杀软的研发人员来说,要想依靠无效或不完整的混淆检测来提醒我们是否发生了恶意的PowerShell混淆,那是不可能的。其中脚本被模糊化后就足以通过杀毒软件的检测,如果想要通过字符分析来检测到这些被模糊化的脚本,我们就应该把0.8相似度在最大限度的提高一些。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

谷歌和亚马逊如何做产品

谷歌和亚马逊如何做产品

梅 (Chris Vander Mey) / 刘亦舟 / 人民邮电出版社 / 2014-6-1 / CNY 49.00

软件在交付之前,面临产品、方案、项目和工程管理等诸多挑战,如何做到游刃有余并打造出极致产品?本书作者曾任谷歌和亚马逊高级产品经理、现任Facebook产品经理,他将自己在达特茅斯学院钻研的理论知识和在领先的互联网公司十年的工作经验尽数总结在此,从定义产品开始,一步步指导你完成管理项目、迭代、发布、市场推广等交付流程,让你身临其境地体验到极致产品如何取得成功。 本书主要内容: 如何清晰定......一起来看看 《谷歌和亚马逊如何做产品》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具