超越IOC:基于分析驱动的威胁狩猎生成上下文线索
2024-6-1 15:20:47 Author: mp.weixin.qq.com(查看原文) 阅读量:24 收藏

这篇文章讨论了在实际操作中如何进行威胁狩猎,尤其是如何超越仅依赖IOC(指标)的方法,通过分析驱动生成更加上下文的狩猎线索。

文章的主要内容包括:

  1. IOC扫描是否等同于狩猎?虽然通过IOC扫描匹配SIEM事件可以算作威胁狩猎的一部分,但现代SIEM系统应能够自动化这一初步步骤。自动化近实时和回溯的IOC扫描可以显著提高狩猎和检测的效果。

  2. 构建分析驱动的狩猎查询:

    • 推荐了Robert M. Lee和David Bianco的白皮书《生成成功威胁狩猎的假设》。

    • 强调了生成假设的重要性,并结合三种不同类型的假设来提高狩猎的效果。

    • 提到需要熟练掌握查询语言(如KQL)来分析日志数据。

  3. 具体的KQL狩猎查询示例:

    • 设定了一个假设:攻击者最终会通过不常见的端口从低流行率进程发起与外部网络的通信。

    • 通过定义包含和排除标准,将查询范围缩小到过去30天内少于5个终端上观察到的成功外发网络通信。

    • 详细展示了KQL查询的各个步骤,包括设置网络范围、排除常见浏览器进程、使用布隆过滤器加速查询结果、总结和筛选数据等。

  4. 查询结果和进一步增强:

    • 查询结果将包含一个唯一进程名称列表,这些进程成功建立了不常见端口的TCP连接。

    • 提供了进一步开发和优化的建议,例如将狩猎范围缩小到IPv6资源、通过CTI源丰富数据、基于目标国家生成报告等。

文章最终强调,通过结合分析驱动的方法,可以生成更加有针对性的狩猎线索,揭示潜在的恶意活动和网络威胁。

全文如下:

关于狩猎假设有很多讨论。那么这在实际操作中是怎样的呢?

在这篇文章中,我将带您了解我的思维过程,并分享一个用于Defender for Endpoint的具体KQL狩猎查询作为示例。

IOC扫描 = 狩猎?

当一个团队拿着一份指标(IOC)列表并将其与匹配的SIEM事件进行比较时,这算是威胁狩猎吗?

无论您是否认为这是狩猎,最终,只要假设IOC命中是线索,这种做法也可以算作是过程中的一步。

尽管如此,如果您有一个现代化的SIEM,那么完全自动化这一步,即IOC匹配。

通过自动化近实时和回溯的IOC扫描,只要您能够管理和限定一个好的IOC列表,这将显著提高您的狩猎/检测输出。

这里的想法是超越纯粹的IOC驱动的方法,基于简单的分析生成更多上下文的狩猎线索。

构建一个分析驱动的狩猎查询如果您需要关于威胁狩猎的快速参考,我推荐阅读Robert M. Lee和David Bianco的以下白皮书:

《生成成功威胁狩猎的假设》

在所有伟大的见解中,有一段摘录在范围界定狩猎练习时特别有用:

从SANS白皮书:“生成成功威胁狩猎的假设”(2016年) 可以很容易地猜到,任何围绕IOC的狩猎活动至少会符合第一项,因为它源自威胁情报。然而,作者进一步解释并提示了一个好的狩猎假设:

生成假设的最佳方法是结合三种不同类型的假设。

您的团队有多能胜任这些狩猎类型?

如何查询数据

我们不是用望远镜和步枪来狩猎!最终,我们是在谈论分析日志数据。所以这里有一个快速提醒:

如果您想成为一个成功的威胁猎手或检测工程师,您应该考虑熟练掌握与数据对话的语言。

MDE遥测

今天,您不会看到SPL,而是Kusto查询语言(KQL),因为这是用于查询Microsoft Defender日志的语言。

想了解更多关于不同产品的EDR遥测能力吗?不要忘记查看Kostas和我在GitHub上创建的这个项目。最终,结果可以在一个漂亮的电子表格中可视化。

我无法足够强调终端遥测数据的丰富性以及我们可以从中得出的狩猎和检测用例的数量。

例如,如果您想监控可疑的网络通信,遥测数据包含的信息与任何传统的网络传感器(NIDS、WAF、Web Proxy和NG FW)一样多。

简单地说,今天您可以在不花费额外精力进行日志丰富和关联的情况下从哪里获取所有以下属性?

- 资产和账户名称- 发起网络通信的进程- 目标主机名、IP地址、协议和端口

在数据工程解决这些差距之前,这不会花太长时间。同时,终端仍然是企业狩猎/检测团队可以用来检测威胁的最重要数据源之一。

除了网络,还有很多关于云遥测的数据,但我暂时将其放在一边,因为EDR变得越来越普遍。

假设 > Kusto查询 > 狩猎线索

无论是使用框架还是简单地利用领域专业知识,其价值都来自于质疑数据并对找到的答案采取行动。

运行威胁狩猎练习(质疑数据)的直接结果是生成狩猎线索,通过进一步调查可能揭示事件或恶意活动。

所以这里有一个我一直在使用和改进的具体例子(最后有提示)。

📃 假设:

攻击者最终会与其基础设施所在的外部网络(互联网)通信。

如果这是从一个通过不常见端口通过TCP通信的低普及率进程发起的呢?

原因有很多。他们可能需要控制您网络中的受感染资产,或者他们只是需要外传数据。

还能添加什么使其更具体?

我们添加的约束越多,样本就会越窄。当然,所以在执行前要考虑到这一点。

如果我们将数据问题缩小到以下8个约束呢?

包含标准:

  1. 成功的外发网络通信(无尝试) 

  2. 连接普通的公共IPv4地址 

  3. 通过TCP协议 

  4. 在少于5个终端上观察到(进程流行率/process prevalence

上面的最后一项是主要的分析相关参数。它将负责过滤掉查询结果的大部分,生成一个较小的狩猎线索样本以供进一步分析。

排除标准:

  1. 任何属于我已知网络范围的IPv4地址 

  2. 任何涉及的URL/域名,只想要直接连接到IP 

  3. 任何已知的浏览器作为进程发起者 

  4. 目标端口80和443(常见的网页端口) 

🕒 时间段: 过去30天

这看起来不错,可以构建一个初始的KQL查询,不是吗?

⚠️ 由于这种类型的查询会非常昂贵,我们需要考虑一些最佳实践以避免超时和其他错误:

(滥)用布隆过滤器。掌握它以及查询语言提供的任何其他机制,以加快结果的速度,同时减轻平台的性能影响。尽早使用summarize。有许多关于如何将最佳实践应用于KQL查询的文章。请在评论中留下您的文章!对于Splunk用户:同样的策略也适用,即了解术语如何落入Splunk索引中,当然,使用stats/chart命令总结和加快结果。现在,进行查询。首先,我们定义一个可定制的网络范围列表:

scss

复制代码

// 添加您不想在输出中的网络范围(CIDR)
let ExcludedNets = datatable(ExcludedNet: string)
['100.0.0.0/16', '200.200.200.0/24'];

然后我们将范围缩小到DeviceNetworkEvents表,并利用一些布隆过滤器加速查询结果:

scss

复制代码

search in (DeviceNetworkEvents) "tcp" and "connectionsuccess" and "public"

// 设置时间范围
| where Timestamp > ago(30d)

// 对于此初始狩猎,仅关注普通的IPv4目标资源,无URL
| where isempty(RemoteUrl)

// 使用排除的CIDR列表(也考虑在summarize之后进行)
| evaluate ipv4_lookup(ExcludedNets, RemoteIP, ExcludedNet, return_unmatched = true)
| where isempty(ExcludedNet)

接下来,我们排除由常见浏览器发起的进程,以减少结果样本,因为绝大多数这些进程将占常规、合法的用户网页浏览活动。

scss

复制代码

// 如果恶意进程实际上匹配这些怎么办?
// 因此,请确保用其他用例覆盖这一点。
| where not(InitiatingProcessFileName matches regex @'(?i)^(msedge|chrome|firefox)\.exe$')

尽管有布隆过滤器,但请确保正确的标准到位以避免意外条目出现在结果中:

arduino

复制代码

| where (Protocol == "Tcp" and ActionType == "ConnectionSuccess" and RemoteIPType == "Public") and InitiatingProcessFileName endswith ".exe" and not(RemotePort in (80, 443))

// 将进程名称小写,以保持输出中的唯一条目
| extend InitiatingProcessFileName

=tolower(InitiatingProcessFileName)

然后我们准备总结结果。这里您可以添加尽可能多的字段或属性,但要注意性能:

scss

复制代码

| summarize
Hashes=make_set(InitiatingProcessMD5),
DeviceCount=count_distinct(DeviceId),
SampleProcess=any(InitiatingProcessCommandLine),
SampleRemoteIP=any(RemoteIP),
Ports=make_set(RemotePort) by InitiatingProcessFileName

现在是查询中最简单也是最重要的分析组件。这里我们向数据提出以下问题:

考虑到报告事件的终端数量,只给我在过去30天内匹配我的狩猎标准的罕见、低流行率进程(文件名)。

最终,我们知道绝大多数流行率高的连接将与合法的、预期的通信相关。所以为什么不将结果缩小到罕见的呢?

所有这些都在不到20行代码中完成。

这基本上是通过添加以下where子句来完成的:

csharp

复制代码

// 为了使其更严格,将数字减少以缩小结果
| where DeviceCount < 4

最后,可以选择,我们可以用示例IP位置进行丰富,并按报告每个唯一进程的设备数量对结果进行排序:

less

复制代码

| extend RemoteIP_country = tostring(parse_json(geo_info_from_ip_address(SampleRemoteIP)).country)
| sort by DeviceCount asc

完整的查询如下,

// Author: Alex Teixeira ([email protected])// Query walkthrough: https://ateixei.medium.com/f5bfdc0d55d6?source=friends_link&sk=7f5d56cf3a85c126992ce866dd864b86let ExcludedNets = datatable(ExcludedNet: string)     ['100.0.0.0/16', '200.200.200.0/24']; search in (DeviceNetworkEvents) "tcp" and "connectionsuccess" and "public" // Set the time scope| where Timestamp > ago(30d)// For this initial hunt, focus on plain IPv4 target resources only, no URLs| where isempty(RemoteUrl)// Consume the list of CIDRs to exclude (consider doing it after summarize as well)| evaluate ipv4_lookup(ExcludedNets, RemoteIP, ExcludedNet, return_unmatched = true)| where isempty(ExcludedNet)// What if a malicious process actually matches those?// So be sure to cover that with other use cases.| where not(InitiatingProcessFileName matches regex @'(?i)^(msedge|chrome|firefox)\.exe$')| where (Protocol == "Tcp" and ActionType == "ConnectionSuccess" and RemoteIPType == "Public") and InitiatingProcessFileName endswith ".exe" and not(RemotePort in (80, 443)) // Lower-case the process name to keep unique entries in the output| extend InitiatingProcessFileName=tolower(InitiatingProcessFileName)| summarize  Hashes=make_set(InitiatingProcessMD5),  DeviceCount=count_distinct(DeviceId),  SampleProcess=any(InitiatingProcessCommandLine),  SampleRemoteIP=any(RemoteIP),  Ports=make_set(RemotePort) by InitiatingProcessFileName// To make it even more strict, decrease the number to narrow the results| where DeviceCount < 4| extend RemoteIP_country = tostring(parse_json(geo_info_from_ip_address(SampleRemoteIP)).country) | sort by DeviceCount asc

结果期望是什么?结果将包含一个唯一进程名称列表,这些进程成功地使用非网页端口通过TCP连接到普通IP地址,并且在您的整个设备群中观察到少于4个终端。

这些当然可能包括合法的、罕见的外发连接,但更重要的是,它可能揭示流氓、不需要或意外的通信,例如RAT、C2和其他网络隐蔽通道。

很难估计您可能会得到多少命中,因为这取决于很多因素,从您的CIDR过滤器,到您的防火墙和网页代理策略,到安装了MDE的终端数量。

回溯时间段在这里起着重要作用。如果您将其设置为过去7天,您实际上可能会得到比设置为30天更多的结果。为什么?因为这减少了利用最后where子句的机会!

您可以不断优化它,直到您得到少于一百个结果,以便生成报告并交给SOC和其他调查团队。

进一步增强 🧪正如您所猜测的,这个狩猎查询提供了一种快速了解您网络中最近允许的外发流量的方法,但还有更多的概念可以探索。

以下是该模板/原型的进一步开发列表:

  1. 将狩猎范围缩小到IPv6或RemoteUrl访问的资源 

  2. 通过CTI源丰富并按文件哈希进行总结 

  3. 基于目标国家生成报告 

  4. 将输出限制在某些端口(例如:RDP、SSH和FTP) 

  5. 将其用作检测模型的一部分

参考资料:

https://x.com/ateixei/status/1721461235789484326

推荐阅读


闲谈

  1. 中国网络安全行业出了什么问题?

  2. 国内威胁情报行业的五大“悲哀”

  3. 安全产品的终局


威胁情报

1.威胁情报 - 最危险的网络安全工作
2.威胁情报专栏 | 威胁情报这十年(前传)
3.网络威胁情报的未来
4.情报内生?| 利用威胁情报平台落地网空杀伤链的七种方法
5.威胁情报专栏 | 特别策划 - 网空杀伤链

APT

  1. XZ计划中的后门手法 - “NOBUS”

  2. 十个常见的归因偏见(上)

  3. 抓APT的一点故事

  4. 揭秘三角行动(Operation Triangulation)一

  5. 闲话APT报告生产与消费

  6. 一名TAO黑客的网络安全之旅

  7. NSA TAO负责人警告私营部门不要搞“黑回去”


入侵分析与红队攻防

  1. 入侵分析与痛苦金字塔

  2. 资深红队专家谈EDR的工作原理与规避


天御智库

  1. 独家研判:五眼情报机构黑客纷纷浮出水面

  2. 美军前出狩猎并不孤单,美国网络外交局优先事项分析

  3. 《国际关系中的网络冲突》


文章来源: https://mp.weixin.qq.com/s?__biz=MzU0MzgyMzM2Nw==&mid=2247485765&idx=1&sn=7034bc9102ea1fd3dc6230d120cd62ab&chksm=fb04ca2dcc73433b4b29748931e5f150811fb004f61d4426c6df5564f715fb743c981c33e9ba&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh