“经验永远在运动中,分枝和不可预测。为了让我们了解任何事情,那个东西必须具有持久的属性。如果万物都流动着,一个人永远不可能两次踏入同一条河流——我相信,赫拉克利特的这句话是对右半球世界核心现实的绝妙唤起——人们将永远不被经验所察觉,因为没有什么是重复的,没有什么是可以知道的。我们必须找到一种方法来修复它,从经验的即时性中退后一步,跳出流动。因此,大脑必须以两种完全不同的方式关注世界,并以此产生两个不同的世界。在“一”中,我们体验到——一个活生生的、复杂的、具身的、由个体组成的世界,总是独特的存在,永远在变化中,一个相互依存的网,形成和改造整体,一个与我们深深相连的世界。在另一种情况下,我们以一种特殊的方式“体验”我们的经验:它的“再呈现”版本,包含新的静态、可分离、有界但本质上是碎片化的实体,这些实体被分组为类,可以基于这些类进行预测。这种注意力通过将每件事置于注意力的聚光灯下来隔离、修复并使每件事变得明确。在这样做的过程中,它使事物变得机械、毫无生气。但它也使我们第一次知道,从而学习和创造东西。这给了我们力量。
- 伊恩·麦吉尔克里斯特¹
欢迎回到“威胁检测与搜寻建模”系列。在这篇文章中,我希望继续调查我是否认为检测工程工作应该集中在程序层面。上一次,我们将过程定义为“一系列操作,当这些操作组合在一起时,会实现一种技术或子技术。² 考虑到这个定义,我们建立了一个层次结构,包括功能、操作、过程、子技术、技术和战术。这种层次结构允许我们在多个分辨率或抽象级别上谈论攻击,但这种能力为我们提供了什么?我在这篇文章的开头引用了伊恩·麦吉尔克里斯特(Iain McGilchrist)在他关于神经科学的开创性著作《大师和他的使者》中的一句话。在书中,麦吉尔克里斯特探讨了大脑的两个半球,以及它们如何以不同的方式“体验”世界。正如他在引文中所说,右半球体验着运动中的世界,那里的一切都是独一无二的,并且不断变化。有人可能会争辩说,即使是像山脉这样的无生命物体也在不断变化,但其速度即使不是不可能,也很难感知。
另一方面,左半球以绝对或形式体验物体。它代表了砖块、木材、家具等的组合,作为房屋而不是组成部分。麦吉尔克里斯特认为,我们的大脑以这种方式分裂几乎是有原因的,这种现象不是人类独有的,而是许多其他动物物种所独有的。在引文中,他提到左脑的力量在于,通过分类或格式塔镜头看到物体的独特实例,我们可以看到它们的相似性而不是差异性。此功能使我们能够体验一个我们理解的世界。没有它,一切都将是新的、独特的和异常的。了解这些类别使我们能够预测它们在不同情况下的行为方式。预测是我们一直在努力发现的本体论结构的主要好处。
相关视频教程
恶意软件开发(更新到了148节)
这篇文章将为我们的本体论引入一个新的基础层。表示给定工具的实例或文本表示形式的层。就像我们的大脑一样,我们必须意识到每个工具的每个实例都以自己的方式独一无二,但我们必须同时了解如何看到独特实例之间的相似之处以及所述相似性的含义。然后,我将讨论一种认知工具,该工具可帮助我对实例进行分类,并为不同的用例(如检测规则评估或紫色分组)做出决策。我希望你喜欢这篇文章,和往常一样,我很想听听你的反馈!什么能引起你的共鸣,你同意什么,你不同意什么,等等。
到目前为止,在本系列中,我们专注于使我们能够了解给定攻击技术或子技术的不同变体的类别,但我觉得我们忽略了讨论实例本身并创建术语来促进这种讨论。我想花点时间介绍一下我所说的 LITERAL 级别。正如麦吉尔克里斯特所指出的,从一个角度来看,我们在世界上遇到的一切都在不断变化,因此总是新的或不同的。传统上,如果两个工具(文件)具有不同的加密哈希值,我们可能会认为它们是不同的。这当然是衡量差异的一种方式,但这可能不是区分两种工具的唯一方式。如果我们考虑一个时间元素,比如文件创建时,会怎么样?元数据元素怎么样,例如谁拥有文件或文件的名称是什么。或者,我们可以考虑一个位置元素,例如文件存在于哪个系统上。从这个角度来看,有无限的可能变化。如果我们能以这种方式看待世界,我们就不会有像ATT&CK这样的概念,一切都会是独一无二的,我们也没有能力对我们遇到的东西进行分类。
从字面上看,任何攻击技术都有几乎无限种表现形式。字节可以加或减,可以替换,也可以更改以在世界中以不同的方式呈现自己。这就是我们作为捍卫者面临的问题。我们如何将有限的注意力分配给一个相对无限的问题?关键是抽象,左半球的力量。关键是不要将实例与表单混淆。这些攻击的字面表现只是我们世界中柏拉图形式的反映。然而,抽象使我们能够摆脱文字的特殊性,并根据它们的相似性而不是差异来理解实例。这个形式的世界是我们在本系列中迄今为止一直在探索的。通过理解实例(字面上)和形式(功能、操作、程序、子技术、技术和战术)之间的区别,我们可以将我们面临的问题的无限可变性减少到更易于管理的东西。让我们看看如何将 LSASS 内存子技术的字面实例化分类为不同级别的形式。
虽然麦吉尔克里斯特提出的关于两种不同体验方式的想法很有趣,但存在实用性问题。我们究竟如何衡量这种差异?同样,看待世界的一种方式是,我们遇到的一切都是不同的,并且不断变化。虽然从技术上讲,这种观点可能与世界的实际情况更密切相关,但它使检测工程变得非常棘手。出于这个原因,将工具视为可以根据相似性进行分组的静态实体是有帮助的,但是我们如何衡量相似性呢?
我们工具包中的一个工具是加密哈希算法,如 SHA256。这些算法非常适合确定两个文件或更具体地说,两组数据是相同还是不同。您可以将数据提交到算法,生成的“哈希值”将生成。每次提供相同的输入数据时,该算法都会生成相同的值。很酷的是,即使对输入数据进行微小更改,也会对输出值产生重大更改。SHA256 算法可以确定两个工具是否相同,至少在文件内容的意义上是这样。问题在于,哈希算法只能确定文件是相同还是不同。这是一个二进制结果。我们无法从文件的哈希值中确定文件的相似程度。
也许我们应该问问,首先是否存在相似性指标。想象一下,我们有两组文件,每组两个文件。第一组由两个文件组成;唯一的区别是更改了一个字节。第二组由两个没有共同字节的文件组成。这些集合将具有不同的 SHA256 哈希值,因此从字面上看是不同的,但我们可以直观地说,第一组中的文件比第二组中的文件更相似。这种假设情况旨在呈现极限情况,因为它使问题更容易回答,但是如果有两组两个文件,更改了一百个字节怎么办?它们总是具有相同程度的相似性吗?当然,我对这个问题的回答是“视情况而定”(我能说什么?我是顾问)。我认为这取决于更改的字节代表什么以及它是如何更改的。也许这些字节代表一堆未使用的代码,实际上并没有改变工具的功能,但也许它们与其核心功能相关,并使其在执行时的行为完全不同。那么,如果文件可以或多或少地相似,有没有办法客观地确定相似性呢?
为了回答这个问题,我引入了一个叫做“同义性”的概念。在语言中,同义性是两个词,虽然字面上不同,但含义相同。例如,“关闭”和“关闭”这两个词。关闭的定义是“移动或导致移动以覆盖开口”,而关闭的定义是“将某物移动到位以阻止开口”。正如你所看到的,人们可以说“请关上门”或“请关上门”而不会失去意义。在阅读迈克尔·韦丁(Michael V. Wedin)的《亚里士多德的物质理论:范畴和形而上学泽塔》(Aristotle's Theory of Substance:The Categories and Metaphysics Zeta)时,我受到启发,以一种新的方式思考同义性。³ 韦丁告诉我们,亚里士多德通过描述三个同义性、同义性和同义性来打开《范畴》。亚里士多德告诉我们,两个词是同义性,“当它们不仅具有相同的名称,而且名称在每种情况下的含义相同时——具有相同的定义。因此,人和牛被称为“动物”。在这两种情况下,名称相同;本质的陈述也是如此。因为如果你被问到他们俩都被称为'动物'是什么意思,你会在这两种情况下给那个特定的名字相同的定义。⁴
现在我必须承认,最初,这既启发了我,也让我感到困惑。我之前曾提出过 Out-Minidump⁵ 和 Sharpdump⁶ 比 Out-Minidump 和 Mimikatz sekurlsa::logonpasswords⁷ 更相似的想法,但我没有办法从命题上表达这个想法。同义性似乎是解锁潜在解决方案的关键,但亚里士多德提出的条件是名称和本质声明是相同的。Out-Minidump 和 Sharpdump 似乎不满足第一个条件,两个实例的名称相同,那么这个想法适合这个例子吗?让我们看看亚里士多德的例子,看看我们是否能更好地理解这个概念。他描述了一种情况,即“人”和“牛”都可以同样被描述为“动物”。这是指所有事物同时存在于许多类别中的嵌套现实。在这种情况下,人和牛是一个层次的解析,但“动物”是一个更高或更高级的类别,它平等地描述了人和牛。因此,如果两个想法可以在更高的抽象层次上被类似地描述,我们可以将它们称为同义性。
如果我们把这个想法应用到我们目前对本体论层次的理解中,我们一直在构建,在这个层次结构中,所有实例都有字面的、功能的、程序的、子技术的、技术和战术层面的分析,那会怎样?例如,是否可以说两个工具或实例在字面上是不同的,但在功能上是同义性?或者,工具工具在字面上和功能上是不同的,但它们在程序上是同义性。我相信这个想法可以帮助我们理解两种工具之间的差异程度,这可能对我们构建和评估检测规则的能力产生重大影响。例如,可以合理地假设,检测两个功能不同但属于过程同义性的工具的检测规则比只能检测两个功能同义性的工具的检测规则更可靠。让我们看几个示例,看看这个概念在操作系统凭据转储:LSASS 内存⁸子技术中是如何发挥作用的,甚至可能更进一步。
层次结构中的第一个分类级别是功能级别。在这里,我们关注的是工具为实现其战术目标而调用的 API 函数。虽然在文字层面上有无限多的变体,但分类使我们能够将这些文字变体概念化为一个有限的集合。在第 5 部分中,我们计算了 LSASS 内存子技术的 39,333 个独特的功能变体。虽然 39,333 相对于字面水平上假定的无限数量的变体来说是一个显着的减少,但它仍然是一个令人生畏的值。话虽如此,功能层面也是我们第一次遇到同义性现象。我们发现这两个工具在字面上可能不同,但在功能上是同义性。这意味着,当分析代码以确定调用哪些 API 函数时,将看到这两个工具以相同的顺序调用相同的函数。因此,这些工具将是“功能同义性”。
例
为了帮助使这个想法具体化,我们可以分析两个工具,它们从字面上看是不同的,但在功能上是相同的。
Out-Minidump 是由 Matt Graeber 编写的 PowerShell 脚本,它利用一种称为“反射”的技术来允许从 PowerShell 直接调用内存中的 Win32 函数。反射是攻击者扩展 PowerShell 默认功能的常用方法。Out-Minidump 采用进程标识符并打开目标进程的读取句柄,并使用该句柄通过以下方式创建小型转储(请注意,由于进程标识符是作为 Out-Minidump 的参数提供的,因此我们不知道使用什么函数来枚举进程,但为了简单起见,我们假设它是)。kernel32!OpenProcess
dbghelp!MiniDumpWriteDump
ntdll!NtQuerySystemInformation
Sharpdump 是一个 C# 二进制文件,专门用于为 LSASS 进程生成小型转储。若要完成此任务,Sharpdump 调用枚举正在运行的进程并查找 LSASS 进程的进程标识符,打开 LSASS 的读取句柄,并创建转储文件。ntdll!NtQuerySystemInformation
kernel32!OpenProcess
dbghelp!MiniDumpWriteDump
这里的关键要点是,尽管 Out-Minidump 和 Sharpdump 实际上是不同的工具,但它们具有不同的哈希值,一个是 PowerShell 脚本,另一个是 C# 二进制文件,但它们都依赖于完全相同的函数调用来实现其结果。因此,我们可以说这些工具是“功能同义性”,这意味着从功能的角度来看,它们是相同的。图 1 显示了在功能层面对这两种工具的分析,我们可以看到它们确实调用了相同的函数。
在本系列的第 3 部分中,我介绍了函数调用图,该图表明,开发人员在选择 API 函数来完成任务时,选择范围很广。例如,我们看到了这一点,使用 和 .大多数任务都有 ~6 个函数选项,但我们发现有些任务具有多达 30 个相关函数。我们发现引入一个名为 operations 的抽象层很有用,它允许我们谈论一组执行任务的函数,而不是停留在单个函数上。这很有帮助,因为每次说出 30 个不同的函数名称是满嘴的,有时我们更关心结果而不是具体功能。然后我们发现操作很少单独发生。开发人员通常结合操作来完成一项技术。这些操作序列称为过程,这是我们遇到同义性的下一个分析级别。kernel32!ReadProcessMemory
ntdll!NtReadVirtualMemory
程序同义性是两个在字面上和功能上不同的工具。它们既不具有相同的加密哈希,也不调用相同的函数。但是,它们确实以彼此相同的顺序对相同的操作进行排序。从程序的角度考虑检测问题可能会有所帮助,因为虽然有 39,333 种已知的功能变体,但我们只发现了 4 种程序变体。请注意,随着每一层抽象,变体的数量呈指数级减少!因此,我们可以说,程序同义性与功能同义性相比,彼此之间差异更大。我们可以开始明白为什么这些区别是有用的。如果想要最大化两个测试用例之间的差异,那么使用过程同义性而不是功能同义性将是有利的。让我们看一个例子。
例
在此示例中,我们将 Out-Minidump 与名为 Dumpert 的新工具进行比较。Dumpert 是本系列前面介绍的工具,由荷兰 Outflank 的团队编写。Dumpert 采用的关键功能是,它不是像 Out-Minidump 那样调用 Win32 函数,而是(几乎)通过系统调用执行所有操作。这意味着 Dumpert 不会像 Out-Minidump 那样调用 , ,而是调用 , (我几乎告诉了你一切)。ntdll!NtQuerySystemInformation
kernel32!OpenProcess
dbghelp!MiniDumpWriteDump
syscall!NtQuerySystemInformation
syscall!NtOpenProcess
dbghelp!MiniDumpWriteDump
因此,与 Out-Minidump 和 Sharpdump 之间的比较不同,这些工具在字面上不同但在功能上是同义性,Out-Minidump 和 Dumpert 在字面上和功能上都不同,但在程序上是同义性。这是因为两者都实现了 Process Enumerate 操作,并且都实现了 Process Access 操作,并且这两个工具都执行了 Process Read 操作。ntdll!NtQuerySystemInformation
syscall!NtQuerySystemInformation
kernel32!OpenProcess
syscall!NtOpenProcess
dbghelp!MiniDumpWriteDump
在图 2 中,我添加了一个附加层来表示与每个函数对应的操作。请注意,函数不同,但操作是相同的,重要的是,它们的顺序(从左到右)是相同的。
这种类型的比较分析可以在下一个层次上继续进行。我们之前将过程定义为“一系列操作,当这些操作组合在一起时,会实现一种技术或子技术。这意味着对于任何子技术,至少有一个但可能有许多过程可用于实现它。这是从微观、技术内部层面过渡到宏观、技术间层面分析之前的最后一步。在程序级别上不同的工具,即它们以不同的方式选择和排序操作,但仍实现相同的子技术,可以称为子技术同义性。这似乎是实例(工具)与检测规则相关的最高级别,因为大多数检测规则不会超越该技术,但该规则可能存在例外。让我们看一下两个工具的示例,它们在字面上、功能上和程序上都不同,但仍然实现相同的子技术,因此是子技术的同义性。
例
在此示例中,我们将 Out-Minidump 与 James Forshaw 在其“绕过 LSASS 上的 SACL 审核”一文中介绍的方法进行了比较。令人兴奋的是,詹姆斯比 Outflank 对 Dumpert 所做的更进一步。James 没有简单地更改函数调用,而是更改了他用于实现结果的操作。Out-Minidump 通过将进程枚举、进程访问和进程读取排序在一起来实现 LSASS 内存转储来解决此问题,而 James 将句柄复制添加到序列中,这反过来又成为进程枚举、进程访问、句柄复制和进程读取。在将操作添加到正统过程的过程中,詹姆斯创建了一个新过程。这个小的改变规避了 Microsoft 在 LSASS 上的 SACL。因此,Out-Minidump 和 NtObjectManager 在过程级别有所不同,但在子技术级别上趋同。这使它们成为次技术同义性。
图 3 在功能、程序和子技术级别上比较了这些工具。请注意,尽管采用不同的路线,但这两种工具最终都实现了 LSASS 内存子技术。
从检测的角度来看,我认为在亚技术层面之后,我们开始从微观焦点过渡到宏观焦点,因此,在本体结构的更高层次上进行比较的效用被削弱了。但是,我认为从概念上探索技术和战术同义性的体现方式可能会很有趣。技术同义性是执行相同技术(OS 凭据转储)的工具,但在层次结构的所有较低级别上都不同。同样,战术同义性属于同一战术分组(凭据访问),但在技术级别及以下方面有所不同。本节提供两个示例,一个演示技术同义性,另一个演示战术同义性。我发现图形在这个级别开始失去影响,所以下面的例子只包括描述,我认为这充分说明了这一点。
技术实例
第四个示例将 Out-Minidump 与 Mimikatz 的 lsadump::d csync 命令进行了比较。Out-Minidump 实现了 LSASS 内存子技术,而 Mimikatz 的 lsadump::d csync 则走了一条不同的路线,建立了自己的子技术,称为 DCSync¹⁵。虽然 LSASS 内存子技术侧重于转储存储在 LSASS 进程内存中的凭据,但 DCSync 模拟域控制器来欺骗合法的域控制器将凭据信息发送到受感染的系统。这些工具不仅在字面上、功能上和程序上有所不同,而且在技术上也有所不同。但是,尽管它们在所有这些分析级别上都不同,但它们实现了相同的技术,即操作系统凭据转储。这意味着我们可以将这些工具称为技术同义性。
战术实例
最后,我们可以将 Out-Minidump 与 Invoke-Kerberoast 进行比较。有趣的是,这两个工具都是用 PowerShell 编写的,但它们的相似之处就到此为止了。正如我们之前所讨论的,Out-Minidump 是一种专门用于执行 OS 凭据转储技术的 LSASS 内存子技术的工具。另一方面,Invoke-Kerberoast 既不实现 LSASS 内存子技术,也不实现 OS 凭据转储技术。相反,它执行 Steal or Forge Kerberos Tickets 技术的 Kerberoasting 子技术¹⁷。但是,这些工具在战术层面上趋同,因为它们都实现了凭据访问策略。当攻击者有兴趣获取一组特定的凭据时,Out-Minidump 和 Invoke-Kerberoast 都是有效的选择,具体取决于感兴趣的用户帐户的详细信息和其他交易注意事项。现在,我们可以说 Out-Minidump 和 Invoke-Kerberoast 在战术上是同义性,因为它们都实现了凭据访问策略。
让我们考虑一下为什么或如何这个同义性的概念可能是可行的。假设你创建了一个检测规则来检测 OS 凭据转储:LSASS 内存子技术。评估生成的检测规则有效性的常用策略是使用许多不同的工具对其进行测试。这个想法是,如果检测规则可以检测到实现子技术的各种工具集,那么它必须是健壮的。但是,我们必须小心,因为传统的“不同”观点通常仅限于LITERAL级别的分析。我们可能会查看威胁报告,并找到由不同的人制作的不同工具,这些工具完成相同的子技术并运行它们,但我们从不考虑这些工具彼此之间有多大的不同。
实际上,根据我的经验,此过程会导致使用四个工具来评估检测规则的测试,但这四个工具是功能同义性。这意味着这些工具仅在字面上有所不同,即最肤浅的分析层面。请记住,在功能分析层面,我们已经发现了 39,333 个变体,可能还有更多有待发现。这意味着我们使用四种不同工具的测试仅评估 39,333 种可能的功能变化中的 1 种。因此,也许第一步应该是确保当我们选择四个工具进行测试时,这四个工具应该是过程同义性。这意味着这些工具将实现不同的功能变化。然而,这仍然只是 39,333 个功能变体中的 4 个。按理说,在四种功能变化的所有可能集合中,有些集合比其他集合更能代表可能性的范围。我们可以将其视为医疗轨迹中的人口采样。那么我们如何选择最优集合呢?
我的建议是,我们在本体论层次结构中看得更高。到目前为止,我们在对 OS 凭据转储:LSASS 内存的分析中发现了 39,333 个功能变体,但我们只发现了 4 个过程变体。我建议,如果我们想最大限度地表示这种子技术的可能变化,那么选择在程序上不同的实例(工具)将是理想的,这意味着它们将是子技术的同义性。这将最大限度地提高工具的多样性,同时仍然保持子技术重点。我认为这基本上是对检测进行三角测量,因为我们无法获得完美的图片,但我们可以估计我们的检测规则的性能。当然,在测试选择过程中可能仍有细微差别的余地。例如,在给定的程序中,可能存在理想的功能变化,以最大限度地提高测试的价值。我还没有弄清楚如何确定这一点,但从直觉上看似乎是可能的。让我知道你的想法。
[1]:麦吉尔克里斯特,伊恩。(2009). 大师和他的使者:分裂的大脑和西方世界的形成.耶鲁大学出版社。
[2]:阿特金森,贾里德 C.(2022 年 9 月 8 日)。第 6 部分:什么是程序?中等。
[3]:韦丁,迈克尔五世(2000)。亚里士多德的实体理论。牛津大学出版社。
[4]:亚里士多德。(1938). 类别 (H.P Cooke, Hugh Tredennick, Trans.)。勒布古典图书馆 325.哈佛大学出版社。
[5]:格雷伯,马修。Out-Minidump 中。(2013). GitHub 存储库.
[6]:施罗德,威廉。Sharpdump. 。(2018). GitHub 存储库.
[13]:德尔皮,本杰明。Mimikatz sekurlsa::logonPasswords.(2014). GitHub 存储库.
[8] 威廉姆斯 E.、米林顿 E.(2020 年 2 月 11 日)。LSASS 内存。MITRE ATT&CK.
[9]:阿特金森,贾里德 C.(2022 年 8 月 18 日)。第 5 部分:扩展操作图。中等。
[10]:阿特金森,贾里德 C.(2022 年 8 月 9 日)。第 3 部分:扩展函数调用图。中等。
[11]:包抄。Dumpert. (2019). GitHub 存储库.
[12]:福肖,詹姆斯。(2017 年 10 月 8 日)。 绕过 LSASS 上的 SACL 审核。
[13]:福肖,詹姆斯。NtObjectManager。(2016). GitHub 存储库.
[14]:德尔皮,本杰明;勒图克斯,文森特。Mimikatz lsadump::d csync。(2017). GitHub 存储库.
[15]:勒图克斯,文森特;ExtraHop 的。DCSync的。(2020 年 2 月 11 日)。 MITRE ATT&CK的。
[16]:施罗德,威廉。调用 Kerberoast。(2016). GitHub 存储库.
[17]:禁卫军。Kerberoasting。(2020 年 2 月 11 日)。MITRE ATT&CK
二进制漏洞课程(更新中)
windows网络安全防火墙与虚拟网卡(更新完成)
windows文件过滤(更新完成)
USB过滤(更新完成)
游戏安全(更新中)
ios逆向
windbg
还有很多免费教程(限学员)
更多详细内容添加作者微信
威胁检测与搜寻建模7
威胁搜寻7
恶意软件开发与免杀对抗22
windows12
威胁检测与搜寻建模 · 目录
上一篇威胁检测与搜寻建模6.基于Mimikatz 扩展操作图