Sysmon威胁情报指南,第3部分。高级图形Sysmon威胁分析





本文是《 Sysmon威胁分析》系列的第三篇也是最后一部分。该系列的所有其他部分:



第一部分介绍SYSMON日志分析

第2部分:使用SYSMON事件数据来检测威胁

,第3部分高级SYSMON威胁分析使用图形(我们这里)



使用Sysmon事件数据查找非标准子图(简单示例)



在我们来看一个确定子图中表明潜在威胁的异常的示例之前(如果这些词不唤醒您的书呆子,那么什么也不会唤醒您!),让我们先做个题外之意。



在这一点上,我必须发出警告:这篇文章以及GitHub上代码无法替代企业级解决方案。它可以帮助较小规模地识别威胁,但是我的崇高使命是帮助IT安全专业人员理解和欣赏现实世界中的威胁防护解决方案。实现此目标的一种方法是自己(在我的帮助下)创建自己的解决方案。



在家进行的实验将帮助您了解扩展DIY威胁检测软件的难度。您将需要处理大数据集及其相关的所有内容:清理(这是一项极为困难的任务),高效的处理(查找必要的数据结构,算法等),并提供少量误报的结果,以便您进行然后,同一位同事没有用拳头爬上你。考虑到这一点,您可能需要考虑使用现成的威胁检测解决方案……但是仅在完成我们的系列文章并进行自己的实验之后。



设置图形权重



建立不依赖恶意软件签名的威胁防御解决方案的一种简单方法是使用上一部分的威胁图



这样的图基于Sysmon事件日志中的条目连接过程节点。

请注意:我没有将每个进程启动事件(Sysmon事件中的事件ID为1)分隔为单独的顶点。取而代之的是,我创建了一个更为抽象的图形,该图形显示PowerShell顶点具有一个链接,该链接指向从任何用户下启动的任何应用程序-一个Excel链接,一个浏览器链接,依此类推。



我的Sysmon威胁图的PSQuickGraph树形视图。 注意cmd.exe下的异常分支



我的Sysmon威胁图的PSQuickGraph树形视图。注意cmd.exe下的异常分支。





但是,我们仍然希望跟踪运行进程频率。例如,如果PowerShell启动1次“ whoami”,而过时的Windows编辑器“ Notepad.exe”启动10次,则从PowerShell顶点延伸的图形边缘的数据应分别标记为1和10的相应“权重”。这合乎逻辑吗?



在许多最简单的威胁检测算法中,此权重成为用于比较图形区域的度量。要点是,平均权重低于整体平均权重的子图是可疑的。

是不是?鲜为人知的山顶是一个异常区域。因此,如果用户在分析潜在威胁时采取的行动转向了很少使用的子图,则应将警报级别提高为黄色。



我描述的方法和下面的PowerShell脚本并非旨在用于大型基础结构的实际用途。但是对于单独的服务器,该解决方案可能正在运行,或者至少提供了对您使用的那些公司解决方案的独立验证。



我是否提到过道格·芬克(Doug Finke)的用于数据结构的PowerShell算法是强大的工具?没有他的工作,我在异常图项目中将一事无成。再次感谢,道格!



借助他的漂亮图形功能的PowerShell库,我只需几条PS线就可以轻松计算Sysmon威胁图的权重,还可以找到整个图平均顶点权重。在遍历图形时,代码还将为每个顶点分配其所有输出边的权重:



$AW=0 #average weight
$GW=0 #total weight

$mset = [System.Collections.ArrayList]@() #master set of subraphs
#calculate total weight by summing up the frequencies or weights of the edges
foreach ($e in $g.getAllEdges() ) {
    $GW = $GW + $e.weight
}
write-host "Weight of Graph: " $GW
$AW = $GW / $g.vertices.count
write-host "Average weight per vertex: " $AW

#assign weight of edges to vertice
for ($i=0; $i -lt $g.vertices.count; $i++) { 
   $w=0
   $v=$g.vertices[$i]
   foreach($e in $v.getEdges()) {
      if($e -eq $null) {continue}
      $w=$w + $e.weight
   }
   $v.value.Weight = $w
}


上面的代码完成了我们需要的计算。在这种情况下,每个顶点都可以视作访问的频率,具体取决于传出的边缘。



我的PowerShell异常图形脚本中最难的部分(稍后将向您展示)是找到图形中最不可能出现的区域,然后找到包含它们的最大子图。您可能需要翻阅一本旧的计算机科学书籍才能完成此任务。但这实际上并不难编写!



我通过访问每个顶点来对图使用经典的“广度优先搜索”,然后以相邻顶点为代价进行扩展,直到子图达到某个阈值(取决于顶点的平均权重)为止。像这样:



function extend-subgraph($v, $t) {
    $vertexQueue = New-Object Queue
    
    #initialize
    $vertexQueue.enqueue($v)
    $h=$v.value.Weight
    $s=@() #subgraph
    $s+=$v
    $extend=$false
    while (!$vertexQueue.isEmpty()) { #bfs
        $currentVertex = $vertexQueue.dequeue()
        $es= $currentVertex.getEdges()
        foreach($e in $es) {
            $ev= $e.endVertex                
            if ((($h + $ev.value.Weight)/($s.count+1) -lt $th)  {        
                #extend the sub-graph
                $s+=$ev
                $h =$h + $ev.value.weight
                #queue it up
                $vertexQueue.enqueue($ev)
            }
        }


对DIY爱好者的快速说明:使用arraylist类型创建数组数组,可以省去很多麻烦。



轻量级威胁和子图



异常图有许多不同的算法。我使用的是基于我在Internet上找到的某个graphBAD的,一旦我再次找到它,我就会给出一个链接。



通常,实际威胁检测中的主要问题是找到一个好的数据集以形成基准。作为专职博客作者和聚会时间威胁检测专家,我从未尝试创建包含许多不同应用程序的足够有趣的Sysmon日志。生成异常子图非常困难,因为我的权重分布不够大。一种或另一种方式,当使用真实服务器时,与偶尔使用AWS Windows实例相比,最终得到的数据集要好得多(在本例中)。



我编写的异常图的PS脚本非常有能力生成平均权重较低的可疑子图。而且我什至设法捕获了一些有趣的环境(见下文)。



子图加权算法的作用:有趣的环境,具有低权重的子图#7



实际操作中的子图权重算法:子图7权重低的有趣环境





正如我之前提到的,还有其他一些算法可以用来检测具有简单权重以外的度量标准的图形中的异常,这值得我们学习。其中之一寻找“相似”顶点的簇,并注意不同环境之间的连接或连接。在这种情况下,异常在于用户或通过其他特征连接环境的过程。这是有道理的,不是吗?



如果您内在的书呆子很坚强,可以检查一下SCAN(网络的结构聚类算法),它可以完成上述操作。与Doug Finke的PowerShell算法一起使用,您甚至可以使用它。我本人想承担这个项目,并很快将其发​​布到我的GitHub上



通过随机游走查找异常



让我们以在威胁图中查找异常的另一种方法结束本节。在上一部分的结尾,我提到了这种方法。对我来说,作为一个对“你”有数学认识的人,他更加直觉。旧电视节目numb3rs的粉丝会立即意识到[清除喉咙] Markov链的概念。



对于其他所有人,您可以将其视为图表中的“随机漫步”。在每个顶点处,我们掷骰子并根据其权重选择图形的一条边:该边的权重越大,跟随该条的机会就越大。您需要将图分为两部分-在图论中被称为二部图-用户在一侧,而应用在另一侧。



接下来,你排名基于到达特定顶点的概率,可以从用户获得的所有顶点应用程序。对于威胁分析,您将搜索正在运行的应用程序,如果其中任何一个应用程序访问它们的可能性很小,那么您可能已经发现了真正的威胁!



以及将其链接到Google的PageRank算法的人的业力我将在下一节中更详细地介绍这一点,但是有兴趣的人可以在Google中搜索“带有重启的随机游走”一词



随机遍历理论和EQL实践



让我们再做一个题外话,并使用Sysmon日志分析我们要实现的目标,它是检测威胁和进行事后调查的好工具。



  • , Sysmon. Sysmon , .
  • 2 Sysmon , , .
  • 在第三部分中,我们深入研究了一种将边缘连接视为权重的简单算法。图的各个部分(在边缘方面)的权重小于整个图的总平均权重,可能是潜在的威胁。我要将算法的PowerShell脚本从本节上传到我的GitHub(将它们悬停在它们之上)。


这些方法的优点是它们不依赖于攻击者不断更改或掩盖的特定命令或进程名称。

此外,还有另一种基于概率的漏洞发现方法。让我们仔细看看。



根据Sysmon事件随机遍历数据漏洞图



无需分析图本身的结构,我们可以将链接视为路径或路线图,其中每个应用程序都是沿途的单独站点。从Sysmon日志数据中,我们可以获得每个应用程序从其父级启动频率



如果在GitHub上查看我的威胁图脚本,您会发现使用Doug Finke出色的PowerShell算法将该频率存储在每个边缘对象中。



我们可以将穿过漏洞图每个边缘的频率视为概率!



我们可以将穿过漏洞图每个边缘的频率视为概率!





下一步是使用此信息来查找启动PowerShell应用程序taskmgr.exe,Windows进程分析器,记事本或hostname.exe的可能性。



我在干什么



简而言之:我可以创建一个概率转移矩阵,受到马尔可夫追随者的喜爱并且通常用于建模系统。实际上,掷骰子,转到图形中的下一个应用程序并重复这些操作是图形的随机遍历。最终,这种数学方法根据从起点到达图的每个顶点的可能性,对图的每个顶点进行排名。您会发现,例如,从Windows资源管理器启动电子表格是一个非常普遍的过程,并且Windows Script Host Engine从理论上讲是非常不标准的,因此可能是威胁指示器。

该方法被称为带有重启的随机游走(以下简称RWWR,带有重启的随机游走),并且是现在传奇的Google PageRank排名算法的一种变体

让我们看一下我为计算这些排名而编写的一段脚本:



#lets build a row
$row= @(0)*$g.vertices.count
$w=0

foreach($e in $start.getEdges()) {    #calculate total frequency
    $w+=$e.weight
}
if ($w -eq 0)  {   #make it connected
$row[$ix] =1
}
else {  #we assign probabilitys
    #now create transition probability
    foreach($e in $start.getEdges()) {
        $ev = $e.endVertex
        $p = $e.weight
        $jx = v-index $ev.value.Key
        $row[$jx]= $p/$w #normalize by dividing by total
    }
}
$P[$ix] = $row  #yay! One row added to transition matrix


对于每个顶点,我计算所有邻居的最终频率,然后将归一化过程中每次跃迁的概率分配给总数。因此,如果PowerShell.exe对其所有邻居进行了20次访问,但是nc.exe从PowerShell.exe的顶部仅被访问过一次,则访问的可能性将为1/20或0.05。这合乎逻辑吗?



困难在于计算RWWR中使用的矩阵,但是对于那些参加过概率建模课程的人来说,此过程并不困难。Medium网站上有关于此主题的很好的评论文章



我的脚本(我称为random-rater)对排名最小的10个单词进行排名并输出列表中的值。因此,从威胁图的给定节点开始,您可以获得启动可能性最低的应用程序。使用PowerShell.exe作为起点的结果如下:



重新启动的随机游走算法可以产生类似google的威胁等级。 嗯,whoami最不可能上手



重新启动的随机游走算法可以产生类似google的威胁等级。嗯,whoami运行的可能性最小,





作为一个实用的注意事项和警告,值得注意的是,PWWR在实际系统中将是一个大数据问题。即使在我的Sysmon日志很小的情况下,由于大量的浮点运算,计算滞后还是非常明显的。



用于威胁分析的事件查询语言(EQL)



现在,值得注意的是,使用更复杂的方法来检测产品中威胁的供应商远远超出了您或我自己可以做的事情。而且,绝对可以更高的精度。



对于那些想深入研究威胁检测但又不想使用我的脚本的人,我理解! -有事件查询语言EQL。这是一个应用Sysmon Log Query Language的开源项目,您可以在极其全面的文章中了解更多信息。... EQL不仅非常适合调查事件,而且只要您拥有Sysmon日志的最新副本,它也可以用作工具。



EQL套件提供了一个事件处理程序,可将日志转换为人类可读的JSON。您可以在GitHub上签出我的分支机构副本。与我的静态show-threat-path PS脚本不同,EQL允许您即时进行查询。



假设我对代表scvhost.exe启动的所有cmd.exe Shell感兴趣-这可能是攻击者使用psexec.exe或smb.exe的标志。该请求将如下所示:



使用EQL查找从svchost.exe启动的cmd.exe shell。 顺便说一句,jq是用于显示JSON数据的Linux实用程序



使用EQL查找从svchost.exe启动的shell cmd.exe。顺便说一句,jq是用于显示JSON数据的Linux实用程序,



还有一种更酷,更强大的方法来使用child修饰符来获得此结果。通过此EQL查询,您可以在层次结构中的任何位置搜索具有指定祖先的所有流程例如,您可以搜索具有regsvr32.exe进程作为祖先的程序,并且可能利用了我在这里描述的一个众所周知的漏洞



在这篇已经很长的文章中,关于EQL的话题太多了,因此,我宁愿单独发表一篇文章,详细介绍寻找漏洞的EQL技能。



关于DIY威胁检测解决方案的最终想法



我答应下载Sysmon资源库,其中包含本文所述的所有威胁检测脚本。定期检查我的GitHub,因为随着时间的推移,我将添加新的基于图的威胁检测工具以及其他文档-太多内容无法在一篇文章中介绍。

恭喜,您到了这个地方!



尝试我的脚本,或将其用作开发自己的威胁检测想法的基础。 PowerShell非常适合复杂算法。对于使用Linux Shell语言长大的我来说,使用成熟的脚本语言是一个惊喜。我建议您检查一下PowerShell库,这是现成的战斗脚本的另一重要资源:您无需在PowerShell世界中重新发明轮子。



整篇文章中另一个更重要的结论是,企业级解决方案的供应商不仅使用比IT开发人员在空闲时间编写的威胁检测技术还要复杂得多的技术,而且还具有适应流量水平的能力。大型组织。当然,使用DIY解决方案来分析未充分利用的服务器或对企业产品进行额外的验证是一个好主意。但是威胁情报和识别确实是一个大数据问题,显然不是PowerShell可以解决的挑战。



如果您有兴趣了解有关Varonis如何处理分析和检测威胁的更多信息的机会,可以随时要求进行个人演示



All Articles