Terraform Security
Last updated
Last updated
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
HashiCorp Terraform é uma ferramenta de infraestrutura como código que permite definir tanto recursos em nuvem quanto locais em arquivos de configuração legíveis por humanos que você pode versionar, reutilizar e compartilhar. 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 recursos de computação, armazenamento e rede, bem como componentes de alto nível, como entradas DNS e recursos SaaS.
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 funcione com praticamente qualquer plataforma ou serviço com uma API acessível.
A HashiCorp e a comunidade Terraform já escreveram mais de 1700 provedores para gerenciar milhares de tipos diferentes de recursos e serviços, e esse número continua a crescer. Você pode encontrar todos os provedores disponíveis publicamente no Terraform Registry, incluindo Amazon Web Services (AWS), Azure, Google Cloud Platform (GCP), Kubernetes, Helm, GitHub, Splunk, DataDog e muitos mais.
O fluxo de trabalho central do Terraform consiste em três etapas:
Escrever: Você define recursos, que podem estar em vários provedores e serviços de nuvem. Por exemplo, você pode criar uma configuração para implantar um aplicativo em máquinas virtuais em uma rede de Nuvem Privada Virtual (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 a 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 mudar o número de máquinas virtuais nessa VPC, o Terraform recriará a VPC antes de escalar as máquinas virtuais.
Basta instalar o terraform em seu computador.
Aqui você tem um guia e aqui você tem a melhor maneira de baixar o terraform.
O Terraform não tem uma plataforma que expõe uma página da web ou um serviço de rede que possamos 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 a comprometer porque terá acesso privilegiado a diferentes locais para que possa funcionar corretamente.
A principal maneira de um atacante 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 que executam o terraform plan/apply automaticamente após a criação de um PR, como o Atlantis:
Atlantis SecuritySe você conseguir comprometer um arquivo terraform, existem diferentes maneiras de realizar RCE quando alguém executa terraform plan
ou terraform apply
.
O terraform plan é o comando mais utilizado no terraform e desenvolvedores/soluções que usam 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 external
provider que fornece uma maneira de interagir entre o Terraform e programas externos. Você pode usar a fonte de dados 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 rev shell ao executar terraform plan
:
Usando um provedor personalizado
Um atacante poderia enviar um provedor personalizado para o Terraform Registry e então adicioná-lo ao código Terraform em um branch de recurso (exemplo daqui):
O provedor é baixado no init
e executará o código malicioso quando 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 discretas (a segunda é mais discreta, mas mais complexa do que a primeira). Você pode realizar este ataque de uma maneira mais discreta, seguindo estas sugestões:
Em vez de adicionar o rev shell diretamente no arquivo terraform, você pode carregar um recurso externo que contém o rev shell:
Você 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
O Terraform apply será executado para aplicar todas as mudanças, você também pode abusar disso 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
:
Siga as sugestões da técnica anterior para realizar este ataque de uma maneira mais furtiva usando referências externas.
Você pode ter valores secretos usados pelo terraform despejados executando terraform apply
ao adicionar ao arquivo terraform algo como:
Caso você tenha acesso de escrita sobre arquivos de estado do terraform, mas não possa alterar o código do terraform, esta pesquisa oferece algumas opções interessantes para aproveitar o arquivo:
Existem 2 maneiras de destruir recursos:
Inserir um recurso com um nome aleatório no arquivo de estado apontando para o recurso real a ser destruído
Porque 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:
Modifique o recurso para excluir de uma maneira que não seja possível atualizar (para que ele seja excluído e recriado)
Para uma instância EC2, modificar o tipo da instância é suficiente para fazer o terraform excluí-la e recriá-la.
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:
Caso você encontre uma situação onde hashicorp/external
foi colocado na lista negra, você pode re-implementar o provedor external
fazendo o seguinte. Nota: Usamos um fork do provedor external publicado por https://registry.terraform.io/providers/nazarewk/external/latest. Você também pode publicar seu próprio fork ou re-implementação.
Então você pode usar external
como de costume.
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.
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)