Translated ['', 'src/pentesting-cloud/aws-security/aws-services/aws-s3-a

This commit is contained in:
Translator
2026-02-27 14:14:39 +00:00
parent 43d248d5e7
commit bcbda42e26

View File

@@ -4,36 +4,36 @@
## S3
Amazon S3 to usługa, która pozwala **przechowywać duże ilości danych**.
Amazon S3 is a service that allows you **przechowywać duże ilości danych**.
Amazon S3 oferuje kilka opcji zapewnienia **ochrony** danych w spoczynku. Opcje obejmują **Permission** (Policy), **Encryption** (Client and Server Side), **Bucket Versioning** oraz **MFA** **based delete**. **użytkownik może włączyć** dowolną z tych opcji, aby osiągnąć ochronę danych. **Replikacja danych** jest wewnętrzną funkcją AWS, gdzie **S3 automatycznie replikuje każdy obiekt pomiędzy wszystkimi Availability Zones** i organizacja nie musi jej włączać w tym przypadku.
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żesz zdefiniować uprawnienia dla podkatalogów swojego bucketu osobno.
Dzięki uprawnieniom opartym na zasobach można osobno zdefiniować uprawnienia dla podkatalogów w bucketu.
### Bucket Versioning and MFA based delete
Kiedy bucket versioning jest włączony, każda akcja próbująca zmodyfikować plik spowoduje utworzenie nowej wersji pliku, zachowując też poprzednią zawartość. W związku z tym zawartość nie zostanie nadpisana.
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 uniemożliwi usunięcie wersji plików w S3 bucket oraz wyłączenie Bucket Versioning, więc atakujący nie będzie mógł zmodyfikować tych plików.
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** (które domyślnie jest wyłączone) dla danego bucketu i zapisanie logów w innym bucketu, aby wiedzieć, kto uzyskuje dostęp do bucketu (oba buckety muszą być w tym samym regionie).
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
Możliwe jest wygenerowanie presigned URL, który zazwyczaj można użyć do **dostępu do określonego pliku** w bucket. **Presigned URL wygląda tak**:
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że być **utworzony z poziomu cli przy użyciu poświadczeń principala mającego 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)
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)
```bash
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
```
> [!NOTE]
> Jedynym wymaganym uprawnieniem do wygenerowania presigned URL jest uprawnienie, które jest przydzielane, więc dla poprzedniego polecenia jedynym uprawnieniem potrzebnym principalowi jest `s3:GetObject`
> 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 również tworzenie presigned URLs z **innymi uprawnieniami**:
Możliwe jest także tworzenie presigned URLs z **innymi uprawnieniami**:
```python
import boto3
url = boto3.client('s3').generate_presigned_url(
@@ -44,22 +44,22 @@ ExpiresIn=3600
```
### Mechanizmy szyfrowania S3
**DEK oznacza Data Encryption Key (klucz szyfrowania danych)** i jest kluczem, który zawsze jest generowany i używany do szyfrowania danych.
**DEK oznacza Data Encryption Key** i jest to klucz, który zawsze jest generowany i używany do szyfrowania danych.
<details>
<summary><strong>Server-side encryption with S3 managed keys, SSE-S3</strong></summary>
Ta opcja wymaga minimalnej konfiguracji — całym zarządzaniem kluczami szyfrującymi zajmuje się AWS. Wystarczy, że **wgrasz swoje dane, a S3 zajmie się resztą**. Każdy bucket w koncie S3 ma przypisany bucket key.
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.
- Szyfrowanie:
- Object Data + utworzony jawny DEK --> Zaszyfrowane dane (przechowywane w S3)
- Utworzony jawny DEK + S3 Master Key --> Zaszyfrowany DEK (przechowywany w S3) i tekst jawny jest usuwany z pamięci
- Odszyfrowanie:
- Zaszyfrowany DEK + S3 Master Key --> Jawny DEK
- Jawny DEK + zaszyfrowane dane --> Object Data
- 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
Należy pamiętać, ż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 zastosować kontrolę dostępu.
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.
</details>
@@ -67,16 +67,16 @@ Należy pamiętać, że w tym przypadku **klucz jest zarządzany przez AWS** (ro
<summary><strong>Server-side encryption with KMS managed keys, SSE-KMS</strong></summary>
Ta metoda pozwala S3 korzystać z Key Management Service do generowania Data Encryption Keys. KMS daje znacznie większą elastyczność w zarządzaniu kluczami. Na przykład możesz wyłączyć, rotować i stosować kontrolę dostępu do CMK oraz audytować ich użycie za pomocą AWS Cloud Trail.
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.
- Szyfrowanie:
- S3 żąda data key od KMS CMK
- KMS używa CMK do wygenerowania pary: jawny DEK i zaszyfrowany DEK, i wysyła je do S£
- S3 używa jawnego klucza do zaszyfrowania danych, zapisuje zaszyfrowane dane i zaszyfrowany klucz oraz usuwa jawny klucz z pamięci
- Odszyfrowanie:
- S3 prosi KMS o odszyfrowanie zaszyfrowanego data key obiektu
- KMS odszyfrowuje data key za pomocą CMK i odsyła go z powrotem do S3
- S3 odszyfrowuje dane obiektu
- 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
</details>
@@ -84,17 +84,17 @@ Ta metoda pozwala S3 korzystać z Key Management Service do generowania Data Enc
<summary><strong>Server-side encryption with customer provided keys, SSE-C</strong></summary>
Ta opcja daje możliwość dostarczenia własnego klucza głównego, którego możesz używać poza AWS. Twój klucz dostarczony przez klienta jest wysyłany wraz z danymi do S3, gdzie S3 wykonuje szyfrowanie.
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.
- Szyfrowanie:
- Użytkownik wysyła Object Data + klucz klienta do S3
- Klucz klienta jest używany do zaszyfrowania danych i zaszyfrowane dane są przechowywane
- Zasoltowana (zasolona) wartość HMAC klucza klienta jest również przechowywana do przyszłej weryfikacji klucza
- Klucz klienta jest usuwany z pamięci
- Odszyfrowanie:
- Użytkownik wysyła klucz klienta
- Klucz jest weryfikowany względem przechowywanej wartości HMAC
- Dostarczony przez klienta klucz jest następnie używany do odszyfrowania danych
- 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
</details>
@@ -102,17 +102,17 @@ Ta opcja daje możliwość dostarczenia własnego klucza głównego, którego mo
<summary><strong>Client-side encryption with KMS, CSE-KMS</strong></summary>
Podobnie jak w SSE-KMS, tutaj również używany jest Key Management Service do generowania data encryption keys. Jednak tym razem KMS jest wywoływany przez klienta, nie przez S3. Szyfrowanie odbywa się po stronie klienta, a zaszyfrowane dane są wysyłane do S3 w celu przechowania.
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.
- Szyfrowanie:
- Klient żąda data key od KMS
- KMS zwraca jawny DEK i zaszyfrowany DEK z CMK
- Oba klucze są zwracane
- Klient szyfruje dane jawym DEK i wysyła do S3 zaszyfrowane dane + zaszyfrowany DEK (który jest zapisywany jako metadata zaszyfrowanych danych w S3)
- Odszyfrowanie:
- Zaszyfrowane dane wraz z zaszyfrowanym DEK są wysyłane do klienta
- Klient prosi KMS o odszyfrowanie zaszyfrowanego klucza za pomocą CMK i KMS zwraca jawny DEK
- Klient może teraz odszyfrować zaszyfrowane dane
- 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
</details>
@@ -120,21 +120,21 @@ Podobnie jak w SSE-KMS, tutaj również używany jest Key Management Service do
<summary><strong>Client-side encryption with customer provided keys, CSE-C</strong></summary>
Korzystając z tego mechanizmu możesz użyć dostarczonych przez siebie kluczy i użyć AWS-SDK po stronie klienta, aby zaszyfrować dane przed wysłaniem ich do S3.
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.
- Szyfrowanie:
- Klient generuje DEK i szyfruje dane jawne
- Następnie, używając własnego CMK, szyfruje DEK
- Przesyła zaszyfrowane dane + zaszyfrowany DEK do S3, gdzie jest przechowywane
- Odszyfrowanie:
- S3 wysyła zaszyfrowane dane i DEK
- Ponieważ klient posiada CMK użyty do zaszyfrowania DEK, odszyfrowuje DEK, a następnie używa jawnego DEK do odszyfrowania danych
- 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
</details>
### **Enumeration**
Jednym z tradycyjnych głównych sposobów kompromitowania organizacji AWS jest rozpoczęcie od przejęcia publicznie dostępnych bucketów. **Możesz znaleźć** [**public buckets enumerators in this page**](../aws-unauthenticated-enum-access/index.html#s3-buckets)**.**
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**](../aws-unauthenticated-enum-access/index.html#s3-buckets)**.**
```bash
# Get buckets ACLs
aws s3api get-bucket-acl --bucket <bucket-name>
@@ -229,7 +229,7 @@ aws s3api put-object-acl --bucket <bucket-name> --key flag --access-control-poli
```
### dual-stack <a href="#dual-stack-endpoints-description" id="dual-stack-endpoints-description"></a>
Możesz uzyskać dostęp do bucketu S3 przez endpoint dual-stack, używając nazwy endpointa w stylu virtual hosted-style lub path-style. Są one przydatne do dostępu do S3 przez IPv6.
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:
@@ -238,13 +238,13 @@ Dual-stack endpoints używają następującej składni:
### Privesc
Na poniższej stronie możesz sprawdzić, jak **abuse S3 permissions to escalate privileges**:
Na poniższej stronie możesz sprawdzić, jak **nadużyć uprawnień S3, aby eskalować przywileje**:
{{#ref}}
../aws-privilege-escalation/aws-s3-privesc/README.md
{{#endref}}
### Unauthenticated Access
### Dostęp bez uwierzytelnienia
{{#ref}}
../aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md
@@ -262,25 +262,25 @@ Na poniższej stronie możesz sprawdzić, jak **abuse S3 permissions to escalate
../aws-persistence/aws-s3-persistence/README.md
{{#endref}}
## Other S3 vulns
## Inne podatności S3
### S3 HTTP Cache Poisoning Issue <a href="#heading-s3-http-desync-cache-poisoning-issue" id="heading-s3-http-desync-cache-poisoning-issue"></a>
[**According to this research**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) możliwe było zbuforowanie odpowiedzi dowolnego bucketu tak, jakby należała do innego. Mogło to zostać wykorzystane do zmiany na przykład odpowiedzi plików JavaScript i skompromitowania dowolnych stron używających S3 do przechowywania statycznego kodu.
[**Według tych badań**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) 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 to interaktywny serwis zapytań, który ułatwia **analizować dane** bezpośrednio w Amazon Simple Storage Service (Amazon **S3**) **używając** standardowego **SQL**.
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ę DB** z formatem zawartości, która będzie pojawiać się w monitorowanych bucketach S3. Następnie Amazon Athena będzie w stanie wypełnić DB z logów, abyś mógł wykonywać zapytania.
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ść wykonywania zapytań na danych S3, które są już zaszyfrowane**, a jeśli jest tak skonfigurowana, **Athena może również szyfrować wyniki zapytania, które następnie mogą być przechowywane w S3**.
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 zaszyfrowanych danych S3, na które kierowane jest zapytanie**, co oznacza, że nawet jeśli dane S3 nie są zaszyfrowane, wyniki zapytania mogą być zaszyfrowane. Kilka kwestii, o których warto pamiętać, to fakt, że Amazon Athena obsługuje tylko dane zaszyfrowane przy użyciu **następujących metod szyfrowania S3**, **SSE-S3, SSE-KMS, and CSE-KMS**.
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 musisz wykonać zapytanie na danych S3 zaszyfrowanych przy użyciu KMS, wymagane są specyficzne uprawnienia dla użytkownika Athena, aby umożliwić mu przeprowadzenie zapytania.
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.
### Enumeration
### Enumeracja
```bash
# Get catalogs
aws athena list-data-catalogs
@@ -302,7 +302,7 @@ aws athena get-prepared-statement --statement-name <name> --work-group <wg-name>
# Run query
aws athena start-query-execution --query-string <query>
```
## Źródła
## Odniesienia
- [https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3](https://cloudsecdocs.com/aws/defensive/tooling/cli/#s3)
- [https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html](https://docs.aws.amazon.com/AmazonS3/latest/userguide/dual-stack-endpoints.html)