AWS - S3, Athena & Glacier Enum

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks

S3

Amazon S3 ist ein Service, der es Ihnen ermöglicht, große Datenmengen zu speichern.

Amazon S3 bietet mehrere Optionen, um den Schutz von Daten im Ruhezustand zu erreichen. Zu den Optionen gehören Permission (Policy), Encryption (Client- und Server-seitig), Bucket Versioning und MFA based delete. Der Nutzer kann jede dieser Optionen aktivieren, um den Schutz der Daten zu erreichen. Datenreplikation ist eine interne Funktion von AWS, bei der S3 automatisch jedes Objekt über alle Availability Zones repliziert und die Organisation dies in diesem Fall nicht aktivieren muss.

Mit ressourcenbasierten Berechtigungen können Sie Berechtigungen für Unterverzeichnisse Ihres Buckets separat festlegen.

Bucket Versioning and MFA based delete

Wenn Bucket Versioning aktiviert ist, erzeugt jede Aktion, die versucht, eine Datei zu ändern, eine neue Version der Datei und behält auch den vorherigen Inhalt bei. Daher wird der Inhalt nicht überschrieben.

Außerdem verhindert MFA based delete, dass Versionen von Dateien im S3-Bucket gelöscht werden, und dass Bucket Versioning deaktiviert wird, sodass ein Angreifer diese Dateien nicht verändern kann.

S3 Access logs

Es ist möglich, enable S3 access login (standardmäßig deaktiviert) für einen Bucket zu aktivieren und die Logs in einem anderen Bucket zu speichern, um zu wissen, wer auf den Bucket zugreift (beide Buckets müssen in derselben Region sein).

S3 Presigned URLs

Es ist möglich, eine presigned URL zu generieren, die üblicherweise dazu verwendet werden kann, auf die angegebene Datei zuzugreifen im Bucket. Eine presigned URL sieht so aus:

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

Eine presigned URL kann über die CLI mit den Anmeldeinformationen eines Principals erstellt werden, der Zugriff auf das Objekt hat (wenn das Konto, das Sie verwenden, keinen Zugriff hat, wird eine kürzere presigned URL erstellt, die jedoch nutzlos ist)

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

Note

Die einzige erforderliche Berechtigung, um eine presigned URL zu erzeugen, ist die Berechtigung, die vergeben wird. Für den vorherigen Befehl ist die einzige Berechtigung, die der principal benötigt, s3:GetObject

Es ist auch möglich, presigned URLs mit anderen Berechtigungen zu erstellen:

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

S3-Verschlüsselungsmechanismen

DEK bedeutet Data Encryption Key und ist der Schlüssel, der immer generiert und zum Verschlüsseln von Daten verwendet wird.

Server-side encryption with S3 managed keys, SSE-S3

Diese Option erfordert minimale Konfiguration; die gesamte Verwaltung der verwendeten Verschlüsselungsschlüssel wird von AWS übernommen. Alles, was Sie tun müssen, ist, Ihre Daten hochzuladen — S3 übernimmt den Rest. Jeder Bucket in einem S3-Account erhält einen Bucket-Key.

  • Verschlüsselung:
  • Object Data + erstellter plaintext DEK –> Verschlüsselte Daten (in S3 gespeichert)
  • Erstellter plaintext DEK + S3 Master Key –> Verschlüsselter DEK (in S3 gespeichert) und der Plaintext wird aus dem Speicher gelöscht
  • Entschlüsselung:
  • Verschlüsselter DEK + S3 Master Key –> Plaintext DEK
  • Plaintext DEK + verschlüsselte Daten –> Object Data

Bitte beachten Sie, dass in diesem Fall der Schlüssel von AWS verwaltet wird (Rotation nur alle 3 Jahre). Wenn Sie Ihren eigenen Schlüssel verwenden, können Sie rotieren, deaktivieren und Zugriffssteuerung anwenden.

Server-side encryption with KMS managed keys, SSE-KMS

Diese Methode erlaubt S3, den Key Management Service zur Generierung Ihrer Data Encryption Keys zu nutzen. KMS bietet deutlich mehr Flexibilität in der Schlüsselverwaltung. Zum Beispiel können Sie den CMK deaktivieren, rotieren und Zugriffssteuerungen anwenden sowie die Nutzung mit AWS CloudTrail überwachen.

  • Verschlüsselung:
  • S3 fordert bei KMS Data Keys an (vom CMK)
  • KMS verwendet einen CMK, um das Paar aus plaintext DEK und verschlüsseltem DEK zu erzeugen und sendet diese an S3
  • S3 verwendet den plaintext DEK, um die Daten zu verschlüsseln, speichert die verschlüsselten Daten und den verschlüsselten Schlüssel und löscht den plaintext DEK aus dem Speicher
  • Entschlüsselung:
  • S3 bittet KMS, den verschlüsselten Data Key des Objekts zu entschlüsseln
  • KMS entschlüsselt den Data Key mit dem CMK und sendet ihn an S3 zurück
  • S3 entschlüsselt die Objekt-Daten
Server-side encryption with customer provided keys, SSE-C

Diese Option gibt Ihnen die Möglichkeit, Ihren eigenen Master-Key zu verwenden, den Sie möglicherweise bereits außerhalb von AWS einsetzen. Ihr vom Kunden bereitgestellter Schlüssel würde zusammen mit Ihren Daten an S3 gesendet, wo S3 dann die Verschlüsselung für Sie übernimmt.

  • Verschlüsselung:
  • Der Nutzer sendet die Objekt-Daten + Customer Key an S3
  • Der Customer Key wird verwendet, um die Daten zu verschlüsseln, und die verschlüsselten Daten werden gespeichert
  • Ein gesalzener HMAC-Wert des Customer Keys wird ebenfalls zur späteren Schlüsselvalidierung gespeichert
  • Der Customer Key wird aus dem Speicher gelöscht
  • Entschlüsselung:
  • Der Nutzer sendet den Customer Key
  • Der Schlüssel wird gegen den gespeicherten HMAC-Wert validiert
  • Der vom Kunden bereitgestellte Schlüssel wird dann zum Entschlüsseln der Daten verwendet
Client-side encryption with KMS, CSE-KMS

Ähnlich wie bei SSE-KMS verwendet dies ebenfalls den Key Management Service zur Generierung Ihrer Data Encryption Keys. Allerdings wird KMS hier vom Client und nicht von S3 aufgerufen. Die Verschlüsselung findet clientseitig statt und die verschlüsselten Daten werden anschließend an S3 zur Speicherung gesendet.

  • Verschlüsselung:
  • Client fordert bei KMS einen Data Key an
  • KMS liefert den plaintext DEK und den mit dem CMK verschlüsselten DEK zurück
  • Beide Keys werden zurückgegeben
  • Der Client verschlüsselt die Daten mit dem plaintext DEK und sendet an S3 die verschlüsselten Daten + den verschlüsselten DEK (welcher als Metadatum der verschlüsselten Daten in S3 gespeichert wird)
  • Entschlüsselung:
  • Die verschlüsselten Daten mit dem verschlüsselten DEK werden an den Client gesendet
  • Der Client bittet KMS, den verschlüsselten Schlüssel mit dem CMK zu entschlüsseln, und KMS liefert den plaintext DEK zurück
  • Der Client kann nun die verschlüsselten Daten entschlüsseln
Client-side encryption with customer provided keys, CSE-C

Mit diesem Mechanismus können Sie eigene Schlüssel verwenden und einen AWS-SDK-Client einsetzen, um Ihre Daten vor dem Senden an S3 zu verschlüsseln.

  • Verschlüsselung:
  • Der Client generiert einen DEK und verschlüsselt die Plaintext-Daten
  • Dann verschlüsselt er den DEK mit seinem eigenen CMK
  • Sendet die verschlüsselten Daten + den verschlüsselten DEK an S3, wo beides gespeichert wird
  • Entschlüsselung:
  • S3 sendet die verschlüsselten Daten und den verschlüsselten DEK
  • Da der Client bereits den CMK besitzt, der zur Verschlüsselung des DEK verwendet wurde, entschlüsselt er den DEK und verwendet den plaintext DEK, um die Daten zu entschlüsseln

Enumeration

One of the traditional main ways of compromising AWS orgs start by compromising buckets publicly accesible. You can find public buckets enumerators in this page.

# 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 --no-sign-request

# 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

Sie können über einen dual-stack Endpoint auf einen S3-Bucket zugreifen, indem Sie entweder einen virtual hosted-style oder einen path-style Endpoint-Namen verwenden. Diese Endpoints sind nützlich, um über IPv6 auf S3 zuzugreifen.

Dual-stack Endpoints verwenden folgende Syntax:

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

Privesc

Auf der folgenden Seite können Sie nachlesen, wie man abuse S3 permissions to escalate privileges:

AWS - S3 Privesc

Unauthenticated Access

AWS - S3 Unauthenticated Enum

S3 Post Exploitation

AWS - S3 Post Exploitation

Persistence

AWS - S3 Persistence

Andere S3-Schwachstellen

S3 HTTP Cache Poisoning Issue

Laut dieser Forschung war es möglich, die Antwort eines beliebigen Buckets so zwischenzuspeichern, als gehöre sie zu einem anderen. Dies hätte beispielsweise missbraucht werden können, um die Antworten von JavaScript-Dateien zu verändern und beliebige Seiten zu kompromittieren, die S3 zur Speicherung statischen Codes verwenden.

Amazon Athena

Amazon Athena ist ein interaktiver Abfrageservice, der es einfach macht, Daten direkt in Amazon Simple Storage Service (Amazon S3) mit standardmäßigem SQL zu analysieren.

Sie müssen eine relationale DB-Tabelle vorbereiten, die dem Format des Inhalts entspricht, der in den überwachten S3-Buckets erscheinen wird. Anschließend kann Amazon Athena die DB aus den Logs befüllen, sodass Sie Abfragen durchführen können.

Amazon Athena unterstützt die Möglichkeit, bereits verschlüsselte S3-Daten abzufragen. Falls entsprechend konfiguriert, kann Athena außerdem die Ergebnisse der Abfrage verschlüsseln, die dann in S3 gespeichert werden können.

Diese Verschlüsselung der Ergebnisse ist unabhängig von den zugrundeliegenden abgefragten S3-Daten, das heißt selbst wenn die S3-Daten nicht verschlüsselt sind, können die abgefragten Ergebnisse verschlüsselt sein. Ein paar Punkte, die zu beachten sind: Amazon Athena unterstützt nur Daten, die mit den folgenden S3-Verschlüsselungsmethoden verschlüsselt wurden: SSE-S3, SSE-KMS, und CSE-KMS.

SSE-C und CSE-C werden nicht unterstützt. Darüber hinaus ist es wichtig zu verstehen, dass Amazon Athena Abfragen nur gegen verschlüsselte Objekte ausführt, die sich in derselben Region wie die Abfrage befinden. Wenn Sie S3-Daten abfragen müssen, die mit KMS verschlüsselt wurden, sind spezifische Berechtigungen für den Athena-Benutzer erforderlich, damit dieser die Abfrage durchführen kann.

Enumeration

# 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>

Referenzen

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks