AWS - S3, Athena & Glacier Enum

Reading time: 18 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をサポートする

S3

Amazon S3は、大量のデータを保存することを可能にするサービスです。

Amazon S3は、データの静止状態での保護を実現するための複数のオプションを提供します。オプションには、権限(ポリシー)、暗号化(クライアントおよびサーバーサイド)、バケットバージョニング、およびMFA ベースの削除が含まれます。ユーザーはこれらのオプションのいずれかを有効にしてデータ保護を実現できますデータレプリケーションは、AWSによる内部機能であり、S3は自動的に各オブジェクトをすべてのアベイラビリティゾーンにレプリケートします。この場合、組織はそれを有効にする必要はありません。

リソースベースの権限を使用すると、バケットのサブディレクトリに対して個別に権限を定義できます。

バケットバージョニングとMFAベースの削除

バケットバージョニングが有効になっている場合、ファイル内のファイルを変更しようとするアクションは、新しいバージョンのファイルを生成し、同時に以前のコンテンツも保持します。したがって、コンテンツが上書きされることはありません。

さらに、MFAベースの削除は、S3バケット内のファイルのバージョンが削除されるのを防ぎ、バケットバージョニングが無効にされるのを防ぐため、攻撃者はこれらのファイルを変更することができません。

S3アクセスログ

S3アクセスログを有効にする(デフォルトでは無効)ことができ、特定のバケットに対してログを別のバケットに保存して、誰がバケットにアクセスしているかを知ることができます(両方のバケットは同じリージョンに存在する必要があります)。

S3プレサインドURL

バケット内の指定されたファイルにアクセスするために通常使用できるプレサインドURLを生成することが可能です。プレサインドURLはこのようになります:

https://<bucket-name>.s3.us-east-1.amazonaws.com/asd.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAUUE8GZC4S5L3TY3P%2F20230227%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230227T142551Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=IQoJb3JpZ2luX2VjELf%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIBhQpdETJO3HKKDk2hjNIrPWwBE8gZaQccZFV3kCpPCWAiEAid3ueDtFFU%2FOQfUpvxYTGO%2BHoS4SWDMUrQAE0pIaB40qggMIYBAAGgwzMTgxNDIxMzg1NTMiDJLI5t7gr2EGxG1Y5CrfAioW0foHIQ074y4gvk0c%2B%2Fmqc7cNWb1njQslQkeePHkseJ3owzc%2FCwkgE0EuZTd4mw0aJciA2XIbJRCLPWTb%2FCBKPnIMJ5aBzIiA2ltsiUNQTTUxYmEgXZoJ6rFYgcodnmWW0Et4Xw59UlHnCDB2bLImxPprriyCzDDCD6nLyp3J8pFF1S8h3ZTJE7XguA8joMs4%2B2B1%2FeOZfuxXKyXPYSKQOOSbQiHUQc%2BFnOfwxleRL16prWk1t7TamvHR%2Bt3UgMn5QWzB3p8FgWwpJ6GjHLkYMJZ379tkimL1tJ7o%2BIod%2FMYrS7LDCifP9d%2FuYOhKWGhaakPuJKJh9fl%2B0vGl7kmApXigROxEWon6ms75laXebltsWwKcKuYca%2BUWu4jVJx%2BWUfI4ofoaGiCSaKALTqwu4QNBRT%2BMoK6h%2BQa7gN7JFGg322lkxRY53x27WMbUE4unn5EmI54T4dWt1%2Bg8ljDS%2BvKfBjqmAWRwuqyfwXa5YC3xxttOr3YVvR6%2BaXpzWtvNJQNnb6v0uI3%2BTtTexZkJpLQYqFcgZLQSxsXWSnf988qvASCIUhAzp2UnS1uqy7QjtD5T73zksYN2aesll7rvB80qIuujG6NOdHnRJ2M5%2FKXXNo1Yd15MtzPuSjRoSB9RSMon5jFu31OrQnA9eCUoawxbB0nHqwK8a43CKBZHhA8RoUAJW%2B48EuFsp3U%3D&X-Amz-Signature=3436e4139e84dbcf5e2e6086c0ebc92f4e1e9332b6fda24697bc339acbf2cdfa

プリサインされたURLは、オブジェクトへのアクセス権を持つプリンシパルの資格情報を使用してCLIから作成できます(使用しているアカウントにアクセス権がない場合、短いプリサインされたURLが作成されますが、それは無意味です)

bash
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'

note

事前署名付きURLを生成するために必要な権限は、与えられる権限のみであるため、前のコマンドでは、主体が必要とする唯一の権限は s3:GetObject です。

他の権限を持つ事前署名付きURLを作成することも可能です:

python
import boto3
url = boto3.client('s3').generate_presigned_url(
ClientMethod='put_object',
Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)

S3暗号化メカニズム

DEKはデータ暗号化キーを意味し、常に生成され、データを暗号化するために使用されるキーです。

S3管理キーによるサーバーサイド暗号化、SSE-S3

このオプションは最小限の設定を必要とし、使用される暗号化キーの管理はすべてAWSによって管理されます。あなたがする必要があるのは、データをアップロードすることで、S3が他のすべての側面を処理します。S3アカウント内の各バケットにはバケットキーが割り当てられます。

  • 暗号化:
  • オブジェクトデータ + 作成された平文DEK --> 暗号化データ(S3内に保存)
  • 作成された平文DEK + S3マスターキー --> 暗号化DEK(S3内に保存)および平文はメモリから削除される
  • 復号化:
  • 暗号化DEK + S3マスターキー --> 平文DEK
  • 平文DEK + 暗号化データ --> オブジェクトデータ

この場合、キーはAWSによって管理されていることに注意してください(ローテーションは3年ごと)。独自のキーを使用する場合、ローテーション、無効化、およびアクセス制御を適用できます。

KMS管理キーによるサーバーサイド暗号化、SSE-KMS

この方法では、S3がキー管理サービスを使用してデータ暗号化キーを生成します。KMSは、キーの管理方法に対してはるかに大きな柔軟性を提供します。たとえば、CMKを無効化、ローテーション、およびアクセス制御を適用し、AWS Cloud Trailを使用してその使用に対して順序を付けることができます。

  • 暗号化:
  • S3がKMS CMKからデータキーを要求
  • KMSはCMKを使用して平文DEKと暗号化DEKのペアを生成し、それをS3に送信
  • S3は平文キーを使用してデータを暗号化し、暗号化データと暗号化キーを保存し、平文キーをメモリから削除
  • 復号化:
  • S3がKMSにオブジェクトの暗号化データキーを復号化するように要求
  • KMSはCMKでデータキーを復号化し、それをS3に返送
  • S3はオブジェクトデータを復号化
顧客提供キーによるサーバーサイド暗号化、SSE-C

このオプションでは、AWSの外部で既に使用している可能性のある独自のマスターキーを提供する機会が与えられます。顧客提供キーは、データと共にS3に送信され、S3があなたのために暗号化を実行します。

  • 暗号化:
  • ユーザーがオブジェクトデータ + 顧客キーをS3に送信
  • 顧客キーはデータを暗号化するために使用され、暗号化データが保存される
  • 顧客キーのソルト付きHMAC値も将来のキー検証のために保存される
  • 顧客キーはメモリから削除される
  • 復号化:
  • ユーザーが顧客キーを送信
  • キーは保存されたHMAC値に対して検証される
  • 顧客提供キーがデータを復号化するために使用される
KMSによるクライアントサイド暗号化、CSE-KMS

SSE-KMSと同様に、これもキー管理サービスを使用してデータ暗号化キーを生成します。ただし、今回はS3ではなくクライアントを介してKMSが呼び出されます。暗号化はクライアントサイドで行われ、暗号化データはS3に送信されて保存されます。

  • 暗号化:
  • クライアントがKMSにデータキーを要求
  • KMSは平文DEKとCMKで暗号化されたDEKを返す
  • 両方のキーが返送される
  • クライアントは平文DEKを使用してデータを暗号化し、暗号化データ + 暗号化DEK(S3内の暗号化データのメタデータとして保存)をS3に送信
  • 復号化:
  • 暗号化データと暗号化DEKがクライアントに送信される
  • クライアントはCMKを使用して暗号化キーを復号化するようにKMSに要求し、KMSは平文DEKを返す
  • クライアントは暗号化データを復号化できる
顧客提供キーによるクライアントサイド暗号化、CSE-C

このメカニズムを使用すると、独自の提供されたキーを利用し、AWS-SDKクライアントを使用してデータを暗号化してからS3に送信して保存できます。

  • 暗号化:
  • クライアントがDEKを生成し、平文データを暗号化
  • 次に、独自のカスタムCMKを使用してDEKを暗号化
  • 暗号化データ + 暗号化DEKをS3に送信し、保存される
  • 復号化:
  • S3が暗号化データとDEKを送信
  • クライアントはDEKを暗号化するために使用されたCMKを既に持っているため、DEKを復号化し、平文DEKを使用してデータを復号化

列挙

AWS組織を侵害する伝統的な主な方法の1つは、公開アクセス可能なバケットを侵害することから始まります。あなたは このページで公開バケット列挙ツールを見つけることができます

bash
# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
aws s3api get-object-acl --bucket <bucket-name> --key flag

# Get policy
aws s3api get-bucket-policy --bucket <bucket-name>
aws s3api get-bucket-policy-status --bucket <bucket-name> #if it's public

# list S3 buckets associated with a profile
aws s3 ls
aws s3api list-buckets

# list content of bucket (no creds)
aws s3 ls s3://bucket-name --no-sign-request
aws s3 ls s3://bucket-name --recursive

# list content of bucket (with creds)
aws s3 ls s3://bucket-name
aws s3api list-objects-v2 --bucket <bucket-name>
aws s3api list-objects --bucket <bucket-name>
aws s3api list-object-versions --bucket <bucket-name>

# copy local folder to S3
aws s3 cp MyFolder s3://bucket-name --recursive

# delete
aws s3 rb s3://bucket-name –-force

# download a whole S3 bucket
aws s3 sync s3://<bucket>/ .

# move S3 bucket to different location
aws s3 sync s3://oldbucket s3://newbucket --source-region us-west-1

# list the sizes of an S3 bucket and its contents
aws s3api list-objects --bucket BUCKETNAME --output json --query "[sum(Contents[].Size), length(Contents[])]"

# Update Bucket policy
aws s3api put-bucket-policy --policy file:///root/policy.json --bucket <bucket-name>
##JSON policy example
{
"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": "*"
}
]
}

# Update bucket ACL
aws s3api get-bucket-acl --bucket <bucket-name> # Way 1 to get the ACL
aws s3api put-bucket-acl --bucket <bucket-name> --access-control-policy file://acl.json

aws s3api get-object-acl --bucket <bucket-name> --key flag #Way 2 to get the ACL
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

dual-stack

S3バケットには、仮想ホストスタイルまたはパススタイルのエンドポイント名を使用して、デュアルスタックエンドポイントを介してアクセスできます。これは、IPv6を介してS3にアクセスするのに便利です。

デュアルスタックエンドポイントは、以下の構文を使用します:

  • bucketname.s3.dualstack.aws-region.amazonaws.com
  • s3.dualstack.aws-region.amazonaws.com/bucketname

Privesc

次のページでは、S3の権限を悪用して特権を昇格させる方法を確認できます:

AWS - S3 Privesc

Unauthenticated Access

AWS - S3 Unauthenticated Enum

S3 Post Exploitation

AWS - S3 Post Exploitation

Persistence

AWS - S3 Persistence

Other S3 vulns

S3 HTTP Cache Poisoning Issue

この研究によると、任意のバケットの応答を異なるバケットのようにキャッシュすることが可能でした。これを悪用して、例えばJavaScriptファイルの応答を変更し、S3を使用して静的コードを保存する任意のページを危険にさらすことができました。

Amazon Athena

Amazon Athenaは、標準のSQLを使用してAmazon Simple Storage Service(Amazon S3)内のデータを直接分析するのを容易にするインタラクティブなクエリサービスです。

監視対象のS3バケットに表示されるコンテンツの形式でリレーショナルDBテーブルを準備する必要があります。その後、Amazon AthenaはログからDBをポピュレートできるため、クエリを実行できます。

Amazon Athenaは、すでに暗号化されたS3データをクエリする能力をサポートしており、設定されている場合、Athenaはクエリの結果を暗号化し、それをS3に保存することもできます

この結果の暗号化は、基盤となるクエリされたS3データとは独立しています。つまり、S3データが暗号化されていなくても、クエリされた結果は暗号化できます。注意すべき点は、Amazon Athenaは次のS3暗号化方式SSE-S3、SSE-KMS、およびCSE-KMS暗号化されたデータのみをサポートすることです。

SSE-CおよびCSE-Eはサポートされていません。さらに、Amazon Athenaはクエリ自体と同じリージョンにある暗号化されたオブジェクトに対してのみクエリを実行することを理解することが重要です。KMSを使用して暗号化されたS3データをクエリする必要がある場合、Athenaユーザーがクエリを実行できるようにするために特定の権限が必要です。

Enumeration

bash
# Get catalogs
aws athena list-data-catalogs

# Get databases inside catalog
aws athena list-databases --catalog-name <catalog-name>
aws athena list-table-metadata --catalog-name <catalog-name> --database-name <db-name>

# Get query executions, queries and results
aws athena list-query-executions
aws athena get-query-execution --query-execution-id <id> # Get query and meta of results
aws athena get-query-results --query-execution-id <id> # This will rerun the query and get the results

# Get workgroups & Prepared statements
aws athena list-work-groups
aws athena list-prepared-statements --work-group <wg-name>
aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>

# Run query
aws athena start-query-execution --query-string <query>

参考文献

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をサポートする