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

This commit is contained in:
Translator
2026-02-12 13:06:12 +00:00
parent 71b4fc1207
commit 8ca3870a83

View File

@@ -4,36 +4,36 @@
## S3
Amazon S3 je usluga koja vam omogućava da **čuvate velike količine podataka**.
Amazon S3 je servis koji vam omogućava **da skladištite velike količine podataka**.
Amazon S3 pruža više opcija za postizanje **zaštite** podataka u mirovanju. Opcije uključuju **Dozvolu** (Politiku), **Enkripciju** (Klijentsku i Serversku stranu), **Verzionisanje kanti** i **MFA** **zasnovano brisanje**. **Korisnik može omogućiti** bilo koju od ovih opcija za postizanje zaštite podataka. **Replikacija podataka** je interna funkcija AWS-a gde **S3 automatski replicira svaki objekat širom svih dostupnih zona** i organizacija je ne mora omogućiti u ovom slučaju.
Amazon S3 nudi više opcija za postizanje **zaštite** podataka u mirovanju. Opcije uključuju **Permission** (Policy), **Encryption** (Client and Server Side), **Bucket Versioning** i **MFA** **based delete**. **Korisnik može omogućiti** bilo koju od ovih opcija radi zaštite podataka. **Data replication** je interna AWS funkcija gde **S3 automatski replicira svaki objekat preko svih Availability Zones** i organizacija ne mora to posebno da omogućava.
Sa dozvolama zasnovanim na resursima, možete odvojeno definisati dozvole za poddirektorijume vaše kante.
Sa resource-based permissions možete posebno definisati dozvole za pod-direktorijume unutar vašeg bucket-a.
### Verzionisanje kanti i MFA zasnovano brisanje
### Bucket Versioning and MFA based delete
Kada je verzionisanje kanti omogućeno, svaka akcija koja pokušava da izmeni datoteku unutar datoteke generisaće novu verziju datoteke, zadržavajući takođe prethodni sadržaj iste. Stoga, neće prepisati njen sadržaj.
Kada je Bucket Versioning omogućen, svaka akcija koja pokuša da izmeni fajl će generisati novu verziju fajla, pri čemu se čuva i prethodni sadržaj. Dakle, neće prepisati sadržaj.
Štaviše, MFA zasnovano brisanje će sprečiti verzije datoteka u S3 kanti da budu obrisane i takođe će sprečiti onemogućavanje verzionisanja kanti, tako da napadač neće moći da menja ove datoteke.
Pored toga, MFA based delete će sprečiti brisanje verzija fajlova u S3 bucket-u i takođe onemogućiti isključivanje Bucket Versioning-a, tako da napadač neće moći da menja te fajlove.
### S3 pristupni logovi
### S3 Access logs
Moguće je **omogućiti S3 pristupne logove** (koji su po defaultu onemogućeni) za neku kantu i sačuvati logove u drugoj kanti kako biste znali ko pristupa kanti (obe kante moraju biti u istoj regiji).
Moguće je **omogućiti S3 access logging** (što je po defaultu onemogućeno) za neki bucket i sačuvati logove u drugom bucket-u kako biste znali ko pristupa bucket-u (oba bucketa moraju biti u istoj regiji).
### S3 Presigned URL-ovi
### S3 Presigned URLs
Moguće je generisati presigned URL koji se obično može koristiti za **pristup određenoj datoteci** u kanti. **Presigned URL izgleda ovako**:
Moguće je generisati presigned URL koji se obično može koristiti za **pristup navedenom fajlu** u bucket-u. A **presigned URL izgleda ovako**:
```
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 sa prethodnim potpisom može biti **napravljen iz cli koristeći akreditive subjekta koji ima pristup objektu** (ako nalog koji koristite nema pristup, biće kreirana kraća URL sa prethodnim potpisom, ali će biti beskorisna)
Presigned URL može biti **kreiran iz cli koristeći kredencijale principala koji ima pristup objektu** (ako account koji koristite nema pristup, biće kreiran kraći presigned URL ali će biti beskoristan)
```bash
aws s3 presign --region <bucket-region> 's3://<bucket-name>/<file-name>'
```
> [!NOTE]
> Jedina potrebna dozvola za generisanje presignirane URL adrese je dozvola koja se daje, tako da je za prethodnu komandu jedina dozvola koja je potrebna principalu `s3:GetObject`
Takođe je moguće kreirati presignirane URL adrese sa **drugim dozvolama**:
> Jedino neophodno dopuštenje za generisanje presigned URL-a je dopuštenje koje se dodeljuje, tako da za prethodnu komandu jedino dopuštenje koje je potrebno principal-u je `s3:GetObject`
Moguće je takođe kreirati presigned URL-ove sa **drugim dozvolama**:
```python
import boto3
url = boto3.client('s3').generate_presigned_url(
@@ -42,99 +42,99 @@ Params={'Bucket': 'BUCKET_NAME', 'Key': 'OBJECT_KEY'},
ExpiresIn=3600
)
```
### S3 Encryption Mechanisms
### S3 mehanizmi enkripcije
**DEK znači Ključ za enkripciju podataka** i to je ključ koji se uvek generiše i koristi za enkripciju podataka.
**DEK znači Data Encryption Key (ključ za enkripciju podataka)** i predstavlja ključ koji se uvek generiše i koristi za enkripciju podataka.
<details>
<summary><strong>Enkripcija na strani servera sa S3 upravljanim ključevima, SSE-S3</strong></summary>
<summary><strong>Server-side enkripcija sa S3 upravljanim ključevima, SSE-S3</strong></summary>
Ova opcija zahteva minimalnu konfiguraciju i svu upravu nad ključevima za enkripciju vrši AWS. Sve što treba da uradite je da **otpremite svoje podatke i S3 će se pobrinuti za sve ostale aspekte**. Svakom bucket-u u S3 nalogu dodeljuje se ključ bucket-a.
Ova opcija zahteva minimalnu konfiguraciju i sva upravljanje ključevima za enkripciju vrši AWS. Sve što treba da uradite je da **otpremite podatke i S3 će se pobrinuti za sve ostalo**. Svakom bucket-u u S3 nalogu dodeljen je bucket key.
- Enkripcija:
- Podaci objekta + kreirani plaintext DEK --> Enkriptovani podaci (smešteni unutar S3)
- Kreirani plaintext DEK + S3 Master Key --> Enkriptovani DEK (smešten unutar S3) i plaintext se briše iz memorije
- Podaci objekta + generisani plaintext DEK --> Enkriptovani podaci (sačuvani u S3)
- Generisani plaintext DEK + S3 Master Key --> Enkriptovani DEK (sačuvan u S3) i plaintext se briše iz memorije
- Dekripcija:
- Enkriptovani DEK + S3 Master Key --> Plaintext DEK
- Plaintext DEK + Enkriptovani podaci --> Podaci objekta
- Plaintext DEK + enkriptovani podaci --> Podaci objekta
Napomena: u ovom slučaju **ključ upravlja AWS** (rotacija samo svake 3 godine). Ako koristite svoj ključ, moći ćete da rotirate, onemogućite i primenite kontrolu pristupa.
Napomena: u ovom slučaju **ključ je u rukama AWS-a** (rotacija samo na 3 godine). Ako koristite sopstveni ključ moći ćete da vršite rotaciju, onemogućavanje i primenu kontrole pristupa.
</details>
<details>
<summary><strong>Enkripcija na strani servera sa KMS upravljanim ključevima, SSE-KMS</strong></summary>
<summary><strong>Server-side enkripcija sa KMS upravljanim ključevima, SSE-KMS</strong></summary>
Ova metoda omogućava S3 da koristi servis za upravljanje ključevima za generisanje vaših ključeva za enkripciju podataka. KMS vam daje mnogo veću fleksibilnost u upravljanju vašim ključevima. Na primer, možete onemogućiti, rotirati i primeniti kontrole pristupa na CMK, i narediti protiv njihove upotrebe koristeći AWS Cloud Trail.
Ovaj metod omogućava S3 da koristi Key Management Service za generisanje vaših data encryption key-eva. KMS vam daje znatno veću fleksibilnost u načinu na koji se ključevi upravljaju. Na primer, možete da onemogućite, rotirate i primenite kontrole pristupa na CMK, kao i da kontrolišete njihovu upotrebu koristeći AWS Cloud Trail.
- Enkripcija:
- S3 zahteva ključeve podataka od KMS CMK
- KMS koristi CMK za generisanje para DEK plaintext i DEK enkriptovanog i šalje ih S3
- S3 koristi plaintext ključ za enkripciju podataka, čuva enkriptovane podatke i enkriptovani ključ i briše plaintext ključ iz memorije
- S3 zahteva data key od KMS
- KMS koristi CMK da generiše par: plaintext DEK i enkriptovani DEK i šalje ih S3
- S3 koristi plaintext ključ da enkriptuje podatke, čuva enkriptovane podatke i enkriptovani ključ, i briše plaintext ključ iz memorije
- Dekripcija:
- S3 traži od KMS da dekriptuje enkriptovani ključ podataka objekta
- KMS dekriptuje ključ podataka sa CMK i vraća ga S3
- S3 dekriptuje podatke objekta
- S3 traži od KMS da dekriptuje enkriptovani data key objekta
- KMS dekriptuje data key koristeći CMK i šalje ga nazad S3
- S3 dekriptuje podatak objekta
</details>
<details>
<summary><strong>Enkripcija na strani servera sa ključevima koje obezbeđuje korisnik, SSE-C</strong></summary>
<summary><strong>Server-side enkripcija sa korisnički dostavljenim ključevima, SSE-C</strong></summary>
Ova opcija vam daje priliku da obezbedite svoj vlastiti master ključ koji možda već koristite van AWS-a. Vaš ključ koji obezbeđuje korisnik biće poslat sa vašim podacima u S3, gde će S3 izvršiti enkripciju za vas.
Ova opcija vam omogućava da obezbedite sopstveni master ključ koji možda već koristite van AWS-a. Vaš korisnički ključ bi tada bio poslat zajedno sa podacima u S3, gde bi S3 obavio enkripciju za vas.
- Enkripcija:
- Korisnik šalje podatke objekta + Ključ korisnika u S3
- Ključ korisnika se koristi za enkripciju podataka i enkriptovani podaci se čuvaju
- takođe se čuva salted HMAC vrednost ključa korisnika za buduću validaciju ključa
- ključ korisnika se briše iz memorije
- Korisnik šalje podatke objekta + customer key u S3
- Customer key se koristi za enkripciju podataka i enkriptovani podaci se čuvaju
- Saltovana HMAC vrednost customer key-a se takođe čuva radi buduće validacije ključa
- Customer key se briše iz memorije
- Dekripcija:
- Korisnik šalje ključ korisnika
- Ključ se validira u odnosu na HMAC vrednost koja je sačuvana
- Ključ koji obezbeđuje korisnik se zatim koristi za dekripciju podataka
- Korisnik šalje customer key
- Ključ se validira upoređivanjem sa sačuvanom HMAC vrednošću
- Customer provided key se zatim koristi za dekripciju podataka
</details>
<details>
<summary><strong>Enkripcija na strani klijenta sa KMS, CSE-KMS</strong></summary>
<summary><strong>Client-side enkripcija sa KMS, CSE-KMS</strong></summary>
Slično SSE-KMS, ovo takođe koristi servis za upravljanje ključevima za generisanje vaših ključeva za enkripciju podataka. Međutim, ovaj put KMS se poziva putem klijenta, a ne S3. Enkripcija se zatim vrši na strani klijenta, a enkriptovani podaci se šalju u S3 na čuvanje.
Slično SSE-KMS, i ovde se koristi Key Management Service za generisanje vaših data encryption key-eva. Međutim, ovog puta KMS se poziva od strane klijenta, a ne S3. Enkripcija se zatim dešava na strani klijenta, a enkriptovani podaci se šalju u S3 na čuvanje.
- Enkripcija:
- Klijent zahteva ključ podataka od KMS
- KMS vraća plaintext DEK i enkriptovani DEK sa CMK
- Obe ključeve šalje nazad
- Klijent zatim enkriptuje podatke sa plaintext DEK i šalje S3 enkriptovane podatke + enkriptovani DEK (koji se čuva kao metapodatak enkriptovanih podataka unutar S3)
- Klijent traži data key od KMS
- KMS vraća plaintext DEK i enkriptovani DEK potpisan CMK-om
- Oba ključa se vraćaju klijentu
- Klijent enkriptuje podatke plaintext DEK-om i šalje u S3 enkriptovane podatke + enkriptovani DEK (koji se čuva kao metadata enkriptovanih podataka u S3)
- Dekripcija:
- Enkriptovani podaci sa enkriptovanim DEK se šalju klijentu
- Enkriptovani podaci sa enkriptovanim DEK-om se šalju klijentu
- Klijent traži od KMS da dekriptuje enkriptovani ključ koristeći CMK i KMS vraća plaintext DEK
- Klijent sada može dekriptovati enkriptovane podatke
- Klijent sada može da dekriptuje enkriptovane podatke
</details>
<details>
<summary><strong>Enkripcija na strani klijenta sa ključevima koje obezbeđuje korisnik, CSE-C</strong></summary>
<summary><strong>Client-side enkripcija sa korisnički dostavljenim ključevima, CSE-C</strong></summary>
Korišćenjem ovog mehanizma, možete koristiti svoje obezbeđene ključeve i koristiti AWS-SDK klijent za enkripciju vaših podataka pre slanja u S3 na čuvanje.
Koristeći ovaj mehanizam, možete da koristite sopstvene ključeve i AWS-SDK klijent da enkriptujete podatke pre slanja u S3 na čuvanje.
- Enkripcija:
- Klijent generiše DEK i enkriptuje plaintext podatke
- Zatim, koristeći svoj vlastiti prilagođeni CMK, enkriptuje DEK
- šalje enkriptovane podatke + enkriptovani DEK u S3 gde se čuva
- Zatim, koristeći sopstveni CMK, enkriptuje DEK
- Podnese enkriptovane podatke + enkriptovani DEK u S3 gde se čuvaju
- Dekripcija:
- S3 šalje enkriptovane podatke i DEK
- Kako klijent već ima CMK koji se koristi za enkripciju DEK, dekriptuje DEK i zatim koristi plaintext DEK za dekripciju podataka
- Pošto klijent već poseduje CMK koji je korišćen za enkripciju DEK-a, dekriptuje DEK i potom koristi plaintext DEK da dekriptuje podatke
</details>
### **Enumeracija**
Jedan od tradicionalnih glavnih načina kompromitovanja AWS organizacija počinje kompromitovanjem javno dostupnih bucket-a. **Možete pronaći** [**javne enumeratore bucket-a na ovoj stranici**](../aws-unauthenticated-enum-access/#s3-buckets)**.**
Jedan od tradicionalnih glavnih načina kompromitacije AWS organizacija počinje kompromitacijom javno dostupnih bucket-a. **Možete pronaći [**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,56 +229,56 @@ 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žete pristupiti S3 bucket-u putem dual-stack endpoint-a koristeći virtualni hosted-style ili path-style endpoint naziv. Ovi su korisni za pristup S3 putem IPv6.
You can access an S3 bucket through a dual-stack endpoint by using a virtual hosted-style or a path-style endpoint name. These are useful to access S3 through IPv6.
Dual-stack endpoint-i koriste sledeću sintaksu:
Dual-stack endpoints use the following syntax:
- `bucketname.s3.dualstack.aws-region.amazonaws.com`
- `s3.dualstack.aws-region.amazonaws.com/bucketname`
### Privesc
Na sledećoj stranici možete proveriti kako da **zloupotrebite S3 dozvole za eskalaciju privilegija**:
In the following page you can check how to **abuse S3 permissions to escalate privileges**:
{{#ref}}
../aws-privilege-escalation/aws-s3-privesc/README.md
{{#endref}}
### Neautentifikovani pristup
### Unauthenticated Access
{{#ref}}
../aws-unauthenticated-enum-access/aws-s3-unauthenticated-enum/README.md
{{#endref}}
### S3 Post Eksploatacija
### S3 Post Exploitation
{{#ref}}
../aws-post-exploitation/aws-s3-post-exploitation/README.md
{{#endref}}
### Postojanost
### Persistence
{{#ref}}
../aws-persistence/aws-s3-persistence/README.md
{{#endref}}
## Ostale S3 ranjivosti
## Other S3 vulns
### S3 HTTP Cache Poisoning Issue <a href="#heading-s3-http-desync-cache-poisoning-issue" id="heading-s3-http-desync-cache-poisoning-issue"></a>
[**Prema ovom istraživanju**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) bilo je moguće keširati odgovor proizvoljnog bucket-a kao da pripada drugom. Ovo se moglo zloupotrebiti za promenu, na primer, odgovora javascript datoteka i kompromitovanje proizvoljnih stranica koristeći S3 za skladištenje statičkog koda.
[**According to this research**](https://rafa.hashnode.dev/exploiting-http-parsers-inconsistencies#heading-s3-http-desync-cache-poisoning-issue) it was possible to cache the response of an arbitrary bucket as if it belonged to a different one. This could have been abused to change for example javascript file responses and compromise arbitrary pages using S3 to store static code.
## Amazon Athena
Amazon Athena je interaktivna usluga za upite koja olakšava **analizu podataka** direktno u Amazon Simple Storage Service (Amazon **S3**) **koristeći** standardni **SQL**.
Amazon Athena is an interactive query service that makes it easy to **analyze data** directly in Amazon Simple Storage Service (Amazon **S3**) **using** standard **SQL**.
Treba da **pripremite relacijsku DB tabelu** sa formatom sadržaja koji će se pojaviti u nadgledanim S3 bucket-ima. A zatim, Amazon Athena će moći da popuni DB iz logova, tako da možete da upitujete.
You need to **prepare a relational DB table** with the format of the content that is going to appear in the monitored S3 buckets. And then, Amazon Athena will be able to populate the DB from the logs, so you can query it.
Amazon Athena podržava **mogućnost upita nad S3 podacima koji su već enkriptovani** i ako je konfigurisan da to uradi, **Athena takođe može enkriptovati rezultate upita koji se zatim mogu skladištiti u S3**.
Amazon Athena supports the **ability to query S3 data that is already encrypted** and if configured to do so, **Athena can also encrypt the results of the query which can then be stored in S3**.
**Ova enkripcija rezultata je nezavisna od osnovnih upitanih S3 podataka**, što znači da čak i ako S3 podaci nisu enkriptovani, upitani rezultati mogu biti enkriptovani. Nekoliko tačaka na koje treba obratiti pažnju je da Amazon Athena podržava samo podatke koji su **enkriptovani** sa **sledećim S3 metodama enkripcije**, **SSE-S3, SSE-KMS, i CSE-KMS**.
**This encryption of results is independent of the underlying queried S3 data**, meaning that even if the S3 data is not encrypted, the queried results can be encrypted. A couple of points to be aware of is that Amazon Athena only supports data that has been **encrypted** with the **following S3 encryption methods**, **SSE-S3, SSE-KMS, and CSE-KMS**.
SSE-C i CSE-E nisu podržani. Pored ovoga, važno je razumeti da Amazon Athena može izvršavati upite samo nad **enkripovanim objektima koji su u istoj regiji kao i sam upit**. Ako trebate da upitujete S3 podatke koji su enkriptovani koristeći KMS, tada su potrebne specifične dozvole za Athena korisnika kako bi im omogućili izvršavanje upita.
SSE-C and CSE-C are not supported. In addition to this, it's important to understand that Amazon Athena will only run queries against **encrypted objects that are in the same region as the query itself**. If you need to query S3 data that's been encrypted using KMS, then specific permissions are required by the Athena user to enable them to perform the query.
### Enumeration
```bash