AWS - S3, Athena & Glacier Enum

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

S3

Amazon S3 is a service that allows you przechowywać duże ilości danych.

Amazon S3 provides multiple options to achieve the ochronę danych w spoczynku. The options include Uprawnienia (Policy), Szyfrowanie (Client and Server Side), Bucket Versioning i MFA based delete. The użytkownik może włączyć dowolną z tych opcji, aby zabezpieczyć dane. Data replication to wewnętrzna funkcja AWS, w której S3 automatycznie replikuje każdy obiekt we wszystkich Availability Zones i organizacja nie musi jej włączać.

Dzięki uprawnieniom opartym na zasobach można osobno zdefiniować uprawnienia dla podkatalogów w bucketu.

Bucket Versioning and MFA based delete

When bucket versioning is enabled, any action that tries to alter a file inside a file will generate a new version of the file, keeping also the previous content of the same. Therefore, it won’t overwrite its content.

Dodatkowo, MFA based delete zapobiegnie usuwaniu wersji plików w S3 bucket oraz wyłączeniu Bucket Versioning, więc atakujący nie będzie w stanie zmodyfikować tych plików.

S3 Access logs

Możliwe jest włączenie S3 access login (domyślnie wyłączone) dla bucketu i zapisanie logów w innym buckecie, aby wiedzieć, kto uzyskuje dostęp do bucketu (oba buckety muszą być w tym samym regionie).

S3 Presigned URLs

It’s possible to generate a presigned URL that can usually be used to uzyskać dostęp do określonego pliku w bucketu. A presigned URL looks like this:

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

Presigned URL można utworzyć z poziomu cli, używając credentials principala, który ma dostęp do obiektu (jeśli konto, którego używasz, nie ma dostępu, zostanie utworzony krótszy presigned URL, ale będzie bezużyteczny)

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

Note

Jedynym wymaganym uprawnieniem do wygenerowania presigned URL jest uprawnienie będące przyznawanym, więc dla poprzedniego polecenia jedynym uprawnieniem potrzebnym przez principal jest s3:GetObject

Możliwe jest także tworzenie presigned URLs z innymi uprawnieniami:

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

Mechanizmy szyfrowania S3

DEK oznacza Data Encryption Key i jest to klucz, który zawsze jest generowany i używany do szyfrowania danych.

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

Ta opcja wymaga minimalnej konfiguracji — całe zarządzanie używanymi kluczami szyfrowania jest prowadzone przez AWS. Wystarczy, że wgrasz swoje dane, a S3 zajmie się resztą. Każdemu bucketowi w koncie S3 przypisany jest bucket key.

  • Encryption:
  • Object Data + created plaintext DEK –> Zaszyfrowane dane (przechowywane w S3)
  • Created plaintext DEK + S3 Master Key –> Encrypted DEK (przechowywany w S3) i tekst jawny jest usuwany z pamięci
  • Decryption:
  • Encrypted DEK + S3 Master Key –> Plaintext DEK
  • Plaintext DEK + Encrypted data –> Object Data

Proszę zwrócić uwagę, że w tym przypadku klucz jest zarządzany przez AWS (rotacja tylko co 3 lata). Jeśli użyjesz własnego klucza, będziesz mógł go rotować, wyłączyć i stosować kontrolę dostępu.

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

Ta metoda pozwala S3 używać Key Management Service do generowania kluczy szyfrowania danych. KMS daje znacznie większą elastyczność w sposobie zarządzania kluczami. Na przykład możesz wyłączać, rotować i stosować kontrolę dostępu do CMK oraz audytować ich użycie za pomocą AWS Cloud Trail.

  • Encryption:
  • S3 request data keys from KMS CMK
  • KMS uses a CMK to generate the pair DEK plaintext and DEK encrypted and send them to S£
  • S3 uses the plaintext key to encrypt the data, store the encrypted data and the encrypted key and deletes from memory the plain text key
  • Decryption:
  • S3 ask to KMS to decrypt the encrypted data key of the object
  • KMS decrypt the data key with the CMK and send it back to S3
  • S3 decrypts the object data
Server-side encryption with customer provided keys, SSE-C

Ta opcja daje Ci możliwość dostarczenia własnego klucza głównego, którego możesz już używać poza AWS. Twój klucz dostarczony przez klienta jest wysyłany z danymi do S3, gdzie S3 wykona szyfrowanie za Ciebie.

  • Encryption:
  • The user sends the object data + Customer key to S3
  • The customer key is used to encrypt the data and the encrypted data is stored
  • a salted HMAC value of the customer key is stored also for future key validation
  • the customer key is deleted from memory
  • Decryption:
  • The user send the customer key
  • The key is validated against the HMAC value stored
  • The customer provided key is then used to decrypt the data
Client-side encryption with KMS, CSE-KMS

Podobnie jak w SSE-KMS, tutaj również używany jest Key Management Service do generowania kluczy szyfrowania danych. Tym razem jednak KMS jest wywoływany przez klienta, a nie przez S3. Szyfrowanie odbywa się po stronie klienta, a zaszyfrowane dane są następnie wysyłane do S3 w celu przechowania.

  • Encryption:
  • Client request for a data key to KMS
  • KMS returns the plaintext DEK and the encrypted DEK with the CMK
  • Both keys are sent back
  • The client then encrypts the data with the plaintext DEK and send to S3 the encrypted data + the encrypted DEK (which is saved as metadata of the encrypted data inside S3)
  • Decryption:
  • The encrypted data with the encrypted DEK is sent to the client
  • The client asks KMS to decrypt the encrypted key using the CMK and KMS sends back the plaintext DEK
  • The client can now decrypt the encrypted data
Client-side encryption with customer provided keys, CSE-C

Korzystając z tego mechanizmu możesz używać własnych kluczy i użyć klienta AWS-SDK, aby zaszyfrować dane przed wysłaniem ich do S3.

  • Encryption:
  • The client generates a DEK and encrypts the plaintext data
  • Then, using it’s own custom CMK it encrypts the DEK
  • submit the encrypted data + encrypted DEK to S3 where it’s stored
  • Decryption:
  • S3 sends the encrypted data and DEK
  • As the client already has the CMK used to encrypt the DEK, it decrypts the DEK and then uses the plaintext DEK to decrypt the data

Enumeration

Jednym z tradycyjnych głównych sposobów kompromitacji organizacji AWS jest przejęcie publicznie dostępnych bucketów. Możesz znaleźć 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

Możesz uzyskać dostęp do bucketu S3 przez dual-stack endpoint, używając virtual hosted-style lub path-style endpoint name. Są one przydatne do dostępu do S3 przez IPv6.

Dual-stack endpoints używają następującej składni:

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

Privesc

Na poniższej stronie możesz sprawdzić, jak nadużyć uprawnień S3, aby eskalować przywileje:

AWS - S3 Privesc

Dostęp bez uwierzytelnienia

AWS - S3 Unauthenticated Enum

S3 Post Exploitation

AWS - S3 Post Exploitation

Persistence

AWS - S3 Persistence

Inne podatności S3

S3 HTTP Cache Poisoning Issue

Według tych badań możliwe było zcache’owanie odpowiedzi dowolnego bucketu, tak jakby należała do innego. Można było to wykorzystać do zmiany na przykład odpowiedzi plików JavaScript i skompromitowania dowolnych stron używających S3 do przechowywania statycznego kodu.

Amazon Athena

Amazon Athena jest interaktywną usługą zapytań, która ułatwia analizować dane bezpośrednio w Amazon Simple Storage Service (Amazon S3) przy użyciu standardowego SQL.

Musisz przygotować relacyjną tabelę bazy danych z formatem treści, która będzie pojawiać się w monitorowanych bucketach S3. Następnie Amazon Athena będzie mogła zapełnić bazę danymi z logów, abyś mógł je zapytywać.

Amazon Athena obsługuje możliwość zapytań do danych S3, które są już zaszyfrowane, i jeśli jest tak skonfigurowana, Athena może także szyfrować wyniki zapytania, które następnie mogą być przechowywane w S3.

To szyfrowanie wyników jest niezależne od danych S3, które są zapytywane, co oznacza, że nawet jeśli dane S3 nie są zaszyfrowane, wyniki zapytań mogą być zaszyfrowane. Kilka rzeczy, o których warto pamiętać: Amazon Athena obsługuje tylko dane, które zostały zaszyfrowane jednym z następujących metod szyfrowania S3, SSE-S3, SSE-KMS i CSE-KMS.

SSE-C i CSE-C nie są obsługiwane. Dodatkowo ważne jest zrozumienie, że Amazon Athena będzie wykonywać zapytania tylko wobec zaszyfrowanych obiektów, które znajdują się w tym samym regionie co samo zapytanie. Jeśli potrzebujesz zapytać dane S3 zaszyfrowane przy użyciu KMS, wymagane są konkretne uprawnienia dla użytkownika Athena, aby umożliwić wykonanie zapytania.

Enumeracja

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

Odniesienia

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks