AWS - S3, Athena & Glacier Enum

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

S3

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

Amazon S3 bietet mehrere Optionen zur Datensicherung im Ruhezustand. Die Optionen umfassen Berechtigungen (Richtlinie), Verschlüsselung (Client- und Serverseite), Bucket-Versionierung und MFA-basiertes Löschen. Der Benutzer kann eine dieser Optionen aktivieren, um den Schutz der Daten zu gewährleisten. Die Datenreplikation ist eine interne Einrichtung von AWS, bei der S3 automatisch jedes Objekt über alle Verfügbarkeitszonen repliziert, und die Organisation muss dies in diesem Fall nicht aktivieren.

Mit ressourcenbasierten Berechtigungen können Berechtigungen für Unterverzeichnisse Ihres Buckets separat definiert werden.

Bucket-Versionierung und MFA-basiertes Löschen

Wenn die Bucket-Versionierung aktiviert ist, wird jede Aktion, die versucht, eine Datei innerhalb einer Datei zu ändern, eine neue Version der Datei generieren und auch den vorherigen Inhalt derselben behalten. Daher wird ihr Inhalt nicht überschrieben.

Darüber hinaus verhindert das MFA-basierte Löschen, dass Versionen von Dateien im S3-Bucket gelöscht werden und auch die Deaktivierung der Bucket-Versionierung, sodass ein Angreifer diese Dateien nicht ändern kann.

S3-Zugriffsprotokolle

Es ist möglich, S3-Zugriffsprotokolle zu aktivieren (die standardmäßig deaktiviert sind) für einen bestimmten Bucket und die Protokolle in einem anderen Bucket zu speichern, um zu erfahren, wer auf den Bucket zugreift (beide Buckets müssen sich in derselben Region befinden).

S3-Vorzeichen-URLs

Es ist möglich, eine vorzeichenbasierte URL zu generieren, die normalerweise verwendet werden kann, um auf die angegebene Datei im Bucket zuzugreifen. Eine vorzeichenbasierte 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

Ein vorab signierter URL kann über die Befehlszeile mithilfe der Anmeldeinformationen eines Prinzipals mit Zugriff auf das Objekt erstellt werden (wenn das Konto, das Sie verwenden, keinen Zugriff hat, wird eine kürzere vorab signierte URL erstellt, die jedoch nutzlos ist)

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

Die einzige erforderliche Berechtigung zum Generieren einer vorzeichenbaren URL ist die erteilte Berechtigung, daher ist für den vorherigen Befehl die einzige vom Prinzipal benötigte Berechtigung s3:GetObject

Es ist auch möglich, vorzeichenbare 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 Datenverschlüsselungsschlüssel und ist der Schlüssel, der immer generiert und zur Verschlüsselung von Daten verwendet wird.

Serverseitige Verschlüsselung mit von S3 verwalteten Schlüsseln, SSE-S3

Diese Option erfordert minimale Konfiguration und alle Verwaltungsaufgaben für die verwendeten Verschlüsselungsschlüssel werden von AWS verwaltet. Alles, was Sie tun müssen, ist, Ihre Daten hochzuladen und S3 wird sich um alle anderen Aspekte kümmern. Jeder Eimer in einem S3-Konto erhält einen Eimer-Schlüssel.

  • Verschlüsselung:

  • Objektdaten + erstellter Klartext-DEK --> Verschlüsselte Daten (gespeichert in S3)

  • Erstellter Klartext-DEK + S3-Meisterschlüssel --> Verschlüsselter DEK (gespeichert in S3) und Klartext wird aus dem Speicher gelöscht

  • Entschlüsselung:

  • Verschlüsselter DEK + S3-Meisterschlüssel --> Klartext-DEK

  • Klartext-DEK + Verschlüsselte Daten --> Objektdaten

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 die Rotation, Deaktivierung und Anwendung von Zugriffssteuerungen durchführen.

Serverseitige Verschlüsselung mit von KMS verwalteten Schlüsseln, SSE-KMS

Diese Methode ermöglicht es S3, den Schlüsselverwaltungsdienst zu verwenden, um Ihre Datenverschlüsselungsschlüssel zu generieren. KMS bietet Ihnen eine weit größere Flexibilität, wie Ihre Schlüssel verwaltet werden. Beispielsweise können Sie den CMK deaktivieren, rotieren und Zugriffssteuerungen anwenden und deren Verwendung mit AWS Cloud Trail überwachen.

  • Verschlüsselung:

  • S3 fordert Daten von KMS CMK an

  • KMS verwendet einen CMK, um das Paar DEK-Klartext und DEK-verschlüsselt zu generieren und sendet sie an S3

  • S3 verwendet den Klartextschlüssel zur Verschlüsselung der Daten, speichert die verschlüsselten Daten und den verschlüsselten Schlüssel und löscht den Klartextschlüssel aus dem Speicher

  • Entschlüsselung:

  • S3 fordert KMS auf, den verschlüsselten Datenkey des Objekts zu entschlüsseln

  • KMS entschlüsselt den Datenkey mit dem CMK und sendet ihn zurück an S3

  • S3 entschlüsselt die Objektdaten

Serverseitige Verschlüsselung mit kundenbereitgestellten Schlüsseln, SSE-C

Diese Option bietet Ihnen die Möglichkeit, Ihren eigenen Hauptschlüssel bereitzustellen, den Sie möglicherweise außerhalb von AWS bereits verwenden. Ihr kundenbereitgestellter Schlüssel wird dann zusammen mit Ihren Daten an S3 gesendet, wo S3 dann die Verschlüsselung für Sie durchführt.

  • Verschlüsselung:

  • Der Benutzer sendet die Objektdaten + Kundenschlüssel an S3

  • Der Kundenschlüssel wird verwendet, um die Daten zu verschlüsseln, und die verschlüsselten Daten werden gespeichert

  • Ein gesalzener HMAC-Wert des Kundenschlüssels wird ebenfalls zur zukünftigen Schlüsselvalidierung gespeichert

  • Der Kundenschlüssel wird aus dem Speicher gelöscht

  • Entschlüsselung:

  • Der Benutzer sendet den Kundenschlüssel

  • Der Schlüssel wird gegen den gespeicherten HMAC-Wert validiert

  • Der vom Kunden bereitgestellte Schlüssel wird dann verwendet, um die Daten zu entschlüsseln

Clientseitige Verschlüsselung mit KMS, CSE-KMS

Ähnlich wie bei SSE-KMS verwendet auch dies den Schlüsselverwaltungsdienst zur Generierung Ihrer Datenverschlüsselungsschlüssel. Diesmal wird jedoch KMS über den Client und nicht über S3 aufgerufen. Die Verschlüsselung erfolgt dann clientseitig und die verschlüsselten Daten werden dann an S3 gesendet, um gespeichert zu werden.

  • Verschlüsselung:

  • Client fordert einen Datenkey von KMS an

  • KMS gibt den Klartext-DEK und den verschlüsselten DEK mit dem CMK zurück

  • Beide Schlüssel werden zurückgesendet

  • Der Client verschlüsselt dann die Daten mit dem Klartext-DEK und sendet die verschlüsselten Daten an S3 + den verschlüsselten DEK (der als Metadaten 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 fordert KMS auf, den verschlüsselten Schlüssel mit dem CMK zu entschlüsseln, und KMS sendet den Klartext-DEK zurück

  • Der Client kann nun die verschlüsselten Daten entschlüsseln

Clientseitige Verschlüsselung mit kundenbereitgestellten Schlüsseln, CSE-C

Mit diesem Mechanismus können Sie Ihre eigenen bereitgestellten Schlüssel nutzen und einen AWS-SDK-Client verwenden, um Ihre Daten zu verschlüsseln, bevor Sie sie zur Speicherung an S3 senden.

  • Verschlüsselung:

  • Der Client generiert einen DEK und verschlüsselt die Klartextdaten

  • Anschließend verschlüsselt er mit seinem eigenen benutzerdefinierten CMK den DEK

  • reicht die verschlüsselten Daten + verschlüsselten DEK an S3 weiter, wo sie gespeichert werden

  • Entschlüsselung:

  • S3 sendet die verschlüsselten Daten und den DEK

  • Da der Client bereits den CMK hat, der zum Verschlüsseln des DEK verwendet wurde, entschlüsselt er den DEK und verwendet dann den Klartext-DEK, um die Daten zu entschlüsseln

Enumeration

Einer der traditionellen Hauptwege, um AWS-Organisationen zu kompromittieren, besteht darin, öffentlich zugängliche Eimer zu kompromittieren. Sie können öffentliche Eimer-Enumeratoren auf dieser Seite finden.

# 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

Sie können auf einen S3-Bucket über einen Dual-Stack-Endpunkt zugreifen, indem Sie einen virtuellen Host- oder Pfad-Endpunktnamen verwenden. Diese sind nützlich, um auf S3 über IPv6 zuzugreifen.

Dual-Stack-Endpunkte verwenden die folgende Syntax:

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

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

Privilege Escalation

Auf der folgenden Seite können Sie nachlesen, wie Sie S3-Berechtigungen missbrauchen, um Privilegien zu eskalieren:

pageAWS - S3 Privesc

Nicht authentifizierter Zugriff

pageAWS - S3 Unauthenticated Enum

S3-Post-Exploitation

pageAWS - S3 Post Exploitation

Persistenz

pageAWS - S3 Persistence

Andere S3-Schwachstellen

S3-HTTP-Cache-Poisoning-Problem

Laut dieser Forschung war es möglich, die Antwort eines beliebigen Buckets zu zwischenspeichern, als ob sie zu einem anderen gehören würde. Dies hätte missbraucht werden können, um beispielsweise JavaScript-Datei-Antworten zu ändern und beliebige Seiten zu kompromittieren, die S3 zum Speichern von statischem Code verwenden.

Amazon Athena

Amazon Athena ist ein interaktiver Abfragedienst, der es einfach macht, **Daten direkt in Amazon Simple Storage Service (Amazon S3) mit Standard-SQL zu analysieren.

Sie müssen eine relationale DB-Tabelle mit dem Format der Inhalte vorbereiten, die in den überwachten S3-Buckets erscheinen werden. Anschließend kann Amazon Athena die DB aus den Protokollen füllen, sodass Sie Abfragen durchführen können.

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

Diese Verschlüsselung der Ergebnisse ist unabhängig von den abgefragten S3-Daten, was bedeutet, dass selbst wenn die S3-Daten nicht verschlüsselt sind, die abgefragten Ergebnisse verschlüsselt werden können. Ein paar Punkte, die beachtet werden müssen, sind, dass Amazon Athena nur Daten unterstützt, die mit den folgenden S3-Verschlüsselungsmethoden verschlüsselt wurden, SSE-S3, SSE-KMS und CSE-KMS.

SSE-C und CSE-E werden nicht unterstützt. Darüber hinaus ist es wichtig zu verstehen, dass Amazon Athena nur Abfragen gegen verschlüsselte Objekte ausführt, die sich in derselben Region wie die Abfrage selbst befinden. Wenn Sie S3-Daten abfragen müssen, die mit KMS verschlüsselt wurden, sind spezifische Berechtigungen des Athena-Benutzers erforderlich, um die Abfrage durchführen zu können.

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

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated