Stratus Red Team:云环境对抗模拟工具的技术解析

本文详细介绍Stratus Red Team这一开源云环境对抗模拟工具的技术架构。该工具使用Go语言开发,集成Terraform基础设施代码,可自动化部署AWS攻击场景,支持攻击技术预热和引爆操作,专为验证云安全检测能力而设计。

介绍Stratus Red Team:云环境对抗模拟工具

今天,我很高兴发布过去几周一直在开发的新开源项目:Stratus Red Team,一个专注于在云环境中模拟常见攻击技术的对抗模拟和紫队工具。

动机

我的专业经验很大程度上涉及威胁检测。刚从学校毕业时,我在一家专注于终端安全的本地托管检测与响应公司从事威胁检测用例工作。后来当我转到一家科技公司的云安全岗位时,发现检测云中的恶意活动面临类似挑战。

其中之一是在实时环境中复现攻击者的战术、技术和程序(TTPs),以验证我们的日志管道和检测逻辑是否端到端正常工作。对于传统终端和本地安全,存在多个开源项目,如Atomic Red Team™或MITRE Caldera。然而,这些工具都不是云原生的,没有考虑云提供商和基础设施,或者缺乏足够数量的云聚焦攻击技术。

认识Stratus Red Team

Stratus Red Team是一个在2021年初在我脑海中开始成熟的项目。得益于我在Datadog担任云安全研究员的新职位,我终于能够执行它,并且我很自豪我们将其作为100%免费和开源软件发布!

  • 文档首页:https://stratus-red-team.cloud/
  • GitHub仓库:https://github.com/DataDog/stratus-red-team

你可以在Datadog博客上阅读官方公告: https://www.datadoghq.com/blog/cyber-attack-simulation-with-stratus-red-team/

我建议你先阅读那篇文章,然后继续阅读这里。为了避免内容重复,我不会涵盖基础知识。

什么是Stratus Red Team?

Stratus Red Team是一个轻量级的Go二进制文件,你可以轻松安装。它打包了许多AWS特定的攻击技术。每个攻击技术都有一个文档页面,从源代码自动生成。

Stratus Red Team处理启动执行攻击技术所需的任何基础设施或配置。这被称为预热攻击技术。一旦攻击技术"预热"完成,它就可以被引爆,即执行以模拟其意图模拟的攻击者行为。

底层工作原理

攻击技术即代码

在底层,每个攻击技术包括:

  • 一段Terraform代码,描述Stratus Red Team在引爆攻击技术之前需要部署的先决基础设施;
  • 一段Go代码,定义技术元数据及其引爆逻辑。

让我们看一个攻击技术"停止CloudTrail跟踪"的例子。先决条件的Terraform代码定义了一个记录到S3桶的CloudTrail跟踪。攻击技术定义包括其名称、与MITRE ATT&CK的映射以及引爆函数。在这里,引爆包括停止CloudTrail跟踪。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
resource "random_string" "suffix" {
  length    = 16
  min_lower = 16
  special   = false
}

locals {
  bucket-name = "my-cloudtrail-bucket-${random_string.suffix.result}"
}

resource "aws_s3_bucket" "cloudtrail" {
  bucket        = local.bucket-name
  force_destroy = true
  policy = "..."
}

resource "aws_cloudtrail" "trail" {
  name           = "my-cloudtrail-trail"
  s3_bucket_name = aws_s3_bucket.cloudtrail.id
}

output "cloudtrail_trail_name" {
  value = aws_cloudtrail.trail.name
}

output "display" {
  value = format("CloudTrail trail %s ready", aws_cloudtrail.trail.arn)
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//go:embed main.tf
var tf []byte

func init() {
	stratus.GetRegistry().RegisterAttackTechnique(&stratus.AttackTechnique{
		ID:                 "aws.defense-evasion.stop-cloudtrail",
		FriendlyName:       "Stop CloudTrail Trail",
		Platform:           stratus.AWS,
		MitreAttackTactics: []mitreattack.Tactic{mitreattack.DefenseEvasion},
		Description: `
Stops a CloudTrail Trail from logging. Simulates an attacker disrupting CloudTrail logging.

Warm-up: 
- Create a CloudTrail Trail.

Detonation: 
- Call cloudtrail:StopLogging to stop CloudTrail logging.
`,
		PrerequisitesTerraformCode: tf,
		IsIdempotent:               true, // cloudtrail:StopLogging is idempotent
		Detonate:                   detonate,
	})
}

func detonate(params map[string]string) error {
	cloudtrailClient := cloudtrail.NewFromConfig(providers.AWS().GetConnection())
	trailName := params["cloudtrail_trail_name"]

	log.Println("Stopping CloudTrail trail " + trailName)

	_, err := cloudtrailClient.StopLogging(context.Background(), &cloudtrail.StopLoggingInput{
		Name: aws.String(trailName),
	})

	if err != nil {
		return errors.New("unable to stop CloudTrail logging: " + err.Error())
	}

	return nil
}

调用Terraform

Stratus Red Team使用Terraform来启动和销毁先决基础设施和配置。这对最终用户是透明的。你甚至不需要安装Terraform!Stratus Red Team使用Hashicorp的terraform-exec库来下载和调用Terraform。Terraform二进制文件存储在~/.stratus-red-team/terraform,因此不会与你现有的Terraform版本冲突。

当你预热或清理一个技术时,Stratus Red Team以编程方式调用terraform apply和terraform destroy。

状态存储

Stratus Red Team是有状态的。它需要保持关于以下内容的状态:

  • 每个攻击技术的状态
  • 每个攻击技术先决条件的Terraform状态
  • 每个攻击技术先决条件的Terraform输出

它将此信息存储在你的本地文件系统上,位于~/.stratus-red-team/[technique-id]下。

哲学和设计选择

在构建Stratus Red Team时,我不得不做出几个设计选择。本节充当架构决策记录,给出这些选择背后的推理。

编程语言:Python vs. Go

虽然我之前接触Python更多,但它也是我积极不喜欢的一种语言,因为它缺乏静态类型。根据我的经验,这使开发缓慢且容易出错——尤其是在使用第三方库(如AWS SDK)时。此外,Python没有可靠的Terraform包装器。

这就是为什么我选择使用Go。Hashicorp维护一个官方的Terraform包装器。Go是强类型的,这意味着在使用AWS SDK时,你确切知道它期望什么类型、字段名和字段类型。这大大加快了开发工作流程:如果它编译了,你就有信心它能运行。

选择Go的主要缺点是缺乏可扩展性。与Python相反,Go不能轻松动态加载用户提供的代码。这意味着向Stratus Red Team添加新攻击技术的唯一方法是将它们打包到主二进制文件中,或者在将Stratus Red Team用作库时以编程方式定义它们。

处理先决基础设施

攻击技术需要先决基础设施才能运行。例如,一个从VPC移除VPC流日志的攻击技术需要一个VPC、一个VPC流日志配置和一个CloudWatch日志组。

有几种方法可以解决这个问题:

  1. 让最终用户负责手动创建所需的基础设施
  2. 向最终用户提供Terraform代码,并让他们负责创建所需的基础设施
  3. 将Terraform代码打包到二进制文件中,并负责创建和移除所需的基础设施

我觉得选项1和2对于CLI工具没有带来太多价值。它们更适合"利用演练"或教程,因为它们没有封装复杂性。

这就是为什么我选择选项3。在减少复杂性的同时,它也给最终用户更少的灵活性。通常,Stratus Red Team目前不支持针对现有基础设施引爆攻击技术。例如,当引爆"通过桶策略后门S3桶"时,Stratus Red Team将创建一个新的S3桶并针对它引爆技术。你不能将其指向现有的S3桶。如果你觉得这是一个重要的限制,请在相应的问题中告诉我!

什么构成一个好的攻击技术?

对我来说,能够回答这个问题很重要:Stratus Red Team中打包了哪些攻击技术,为什么?这是我对这个问题的个人观点,我在哲学页面中更详细地讨论了它。

  • 一个技术应该是细粒度的,即模拟攻击链的单个步骤。
  • 一个技术应该模拟合理的攻击者活动。应该总是可以从中推导出真实的威胁检测规则。一个不现实检测的例子是:每次调用sts:GetCallerIdentity时都发出警报。
  • 一个技术应该是自给自足的,不应该对你的AWS账户的先验状态做任何假设。这说起来容易做起来难,因为它使得实现诸如"禁用GuardDuty检测器"这样的技术具有挑战性(因为AWS每个区域只允许一个GuardDuty检测器)。

虽然这些是主观和有观点的,但我想确保Stratus Red Team仍然是一个云安全从业者可以用来测试、验证和增强真实世界威胁检测用例的项目。

选择支持的平台

从一开始,我就设想Stratus Red Team应该支持多个云平台——我以此为目标构建了它。对于初始版本,我选择专注于AWS。我计划在未来添加Kubernetes和Azure支持,可能还有GCP。

关于测试

Stratus Red Team的核心带有非平凡的逻辑。在这种情况下,拥有一些单元测试对我来说是必不可少的。我写了超过35个单元测试,并在此过程中学到了很多。一个教训是,你越早考虑测试,以后需要重构的就越少。

一旦我处理了核心,我想知道如何处理攻击技术的测试,这些技术也被定义为Go代码。不幸的是,我发现没有好的解决方案。AWS SDK for Go V2没有提供任何允许生成模拟的Go接口。不过多深入细节,这意味着在一个使用的AWS服务和API调用旨在快速发展的环境中,对攻击技术进行单元测试是具有挑战性的。

我们可以在另一个级别测试攻击技术:针对实时AWS账户引爆它们,并确保引爆产生预期结果。但这会很慢,容易出错,并且增加的价值有限。这就是为什么目前没有攻击技术代码的单元测试。

Stratus Red Team的下一步

我很自豪我能在几周内发布Stratus Red Team,并且非常高兴我的雇主Datadog给了我这个机会。现在初始版本已经发布,我渴望听取你的反馈,并用它来改进项目。什么工作得很好,你会改进什么?你喜欢什么,或者缺少什么?我很想听听你的意见——我的Twitter DM是开放的。你也可以通过这里列出的地址给我发电子邮件,或者开一个GitHub问题。

在社区的初步反馈和使用之后,我想:

  • 添加更多AWS攻击技术
  • 引入Kubernetes支持
  • 引入可选遥测以了解人们最常使用的攻击技术(默认关闭)

感谢阅读!让我们在Twitter上继续讨论。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计