Translated ['src/pentesting-cloud/pentesting-cloud-methodology.md', 'src

This commit is contained in:
Translator
2025-11-15 16:36:53 +00:00
parent a23a258685
commit 24093a030d
2 changed files with 188 additions and 48 deletions

View File

@@ -0,0 +1,141 @@
# LUKS2 Header Malleability and Null-Cipher Abuse in Confidential VMs
{{#include ../../banners/hacktricks-training.md}}
## TL;DR
- Mnoge Linux-based Confidential VMs (CVMs) koje rade na AMD SEV-SNP ili Intel TDX koriste LUKS2 za persistent storage. On-disk LUKS2 header je malleable i nije zaštićen integritetom protiv napadača sa pristupom disku.
- Ako je enkripcija data segmenta zaglavlja podešena na null cipher (npr. "cipher_null-ecb"), cryptsetup to prihvata i guest transparentno čita/piše plaintext dok veruje da je disk enkriptovan.
- Pre i uključujući cryptsetup 2.8.0, null ciphers su mogli da se koriste za keyslots; od 2.8.1 su odbijeni za keyslots sa ne-praznim lozinkama, ali null ciphers ostaju dozvoljeni za volume segments.
- Remote attestation obično meri VM code/config, ne mutabilna eksternih LUKS header-a; bez eksplicitne validacije/measurement-a, napadač sa pravom pisanja na disk može naterati plaintext I/O.
## Background: LUKS2 on-disk format (what matters for attackers)
- LUKS2 uređaj počinje zaglavljem, nakon čega sledi enkriptovani data.
- Zaglavlje sadrži dve identične kopije binarnog dela i JSON metadata sekciju, plus jedan ili više keyslots.
- JSON metadata definiše:
- enabled keyslots i njihov wrapping KDF/cipher
- segments koji opisuju data area (cipher/mode)
- digests (npr. hash of the volume key za verifikaciju passphrases)
- Tipične sigurne vrednosti: keyslot KDF argon2id; keyslot i enkripcija data segmenta aes-xts-plain64.
Quickly inspect the segment cipher directly from JSON:
```bash
# Read JSON metadata and print the configured data segment cipher
cryptsetup luksDump --type luks2 --dump-json-metadata /dev/VDISK \
| jq -r '.segments["0"].encryption'
```
## Uzrok
- LUKS2 headers nisu autentifikovani protiv menjanja na skladištu. Napadač sa strane hosta/skladišta može prepisati JSON metadata koje prihvata cryptsetup.
- Počevši od cryptsetup 2.8.0, zaglavlja koja postavljaju enkripciju segmenta na cipher_null-ecb se prihvataju. null cipher ignoriše ključeve i vraća plaintext.
- Do 2.8.0, null ciphers su se takođe mogli koristiti za keyslots (keyslot se otvara sa bilo kojim passphrase). Od 2.8.1, null ciphers se odbacuju za keyslots sa ne-praznim lozinkama, ali ostaju dozvoljeni za segments. Promena samo segment cipher i dalje daje plaintext I/O posle 2.8.1.
## Model pretnje: zašto attestation nije spasilo po defaultu
- CVMs imaju za cilj da obezbede poverljivost, integritet i autentičnost na nepouzdanom hostu.
- Remote attestation obično meri VM image i launch configuration, a ne promenljivi LUKS header koji se nalazi na nepouzdanom skladištu.
- Ako vaš CVM veruje on-disk headeru bez robusne validacije/measurement, napadač sa skladišta može ga izmeniti u null cipher i vaš guest će mountovati plaintext volume bez greške.
## Eksploatacija (zahteva write pristup storage-u)
Preduslovi:
- Pristup za pisanje na LUKS2-enkriptovani block device CVM-a.
- Guest koristi on-disk LUKS2 header bez robusne validacije/attestation.
Koraci (visok nivo):
1) Pročitajte header JSON i identifikujte definiciju data segmenta. Primer ciljnog polja: segments["0"].encryption.
2) Postavite enkripciju data segmenta na null cipher, npr. cipher_null-ecb. Ostavite keyslot parametre i digest strukturu neizmenjenim tako da uobičajeni passphrase gosta i dalje „radi“.
3) Ažurirajte obe kopije headera i pripadajuće header digeste tako da je header samokonzistentan.
4) Pri narednom boot-u, guest pokreće cryptsetup, uspešno otvara postojeći keyslot svojim passphrase-om i mountuje volumen. Pošto je segment cipher null cipher, svi čitanja/pisanja su plaintext.
Varijanta (pre-2.8.1 keyslot abuse): ako je area.encryption keyslota null cipher, on se otvara sa bilo kojim passphrase-om. Kombinujte to sa null segment cipher-om za neprimetni plaintext pristup bez poznavanja guest tajne.
## Robusne mitigacije (izbegnite TOCTOU sa detached headers)
Uvek tretirajte on-disk LUKS headers kao nepouzdan ulaz. Koristite detached-header mode tako da validacija i otvaranje koriste iste pouzdane bajtove iz zaštićenog RAM-a:
```bash
# Copy header into protected memory (e.g., tmpfs) and open from there
cryptsetup luksHeaderBackup --header-backup-file /tmp/luks_header /dev/VDISK
cryptsetup open --type luks2 --header /tmp/luks_header /dev/VDISK --key-file=key.txt
```
Zatim primenite jedno (ili više) od:
1) Primeni MAC na celo zaglavlje
- Izračunaj/proveri MAC preko celog zaglavlja pre upotrebe.
- Otvaraj volumen samo kada se MAC verifikuje.
- Primeri u praksi: Flashbots tdx-init i Fortanix Salmiac su usvojili MAC-based verification.
2) Stroga JSON validacija (kompatibilno unazad)
- Dump JSON metadata i validiraj strogi allowlist parametara (KDF, ciphers, segment count/type, flags).
```bash
#!/bin/bash
set -e
# Store header in confidential RAM fs
cryptsetup luksHeaderBackup --header-backup-file /tmp/luks_header $BLOCK_DEVICE
# Dump JSON metadata header to a file
cryptsetup luksDump --type luks2 --dump-json-metadata /tmp/luks_header > header.json
# Validate the header
python validate.py header.json
# Open the cryptfs using key.txt
cryptsetup open --type luks2 --header /tmp/luks_header $BLOCK_DEVICE --key-file=key.txt
```
<details>
<summary>Primer validatora (primenjuje bezbedna polja)</summary>
```python
from json import load
import sys
with open(sys.argv[1], "r") as f:
header = load(f)
if len(header["keyslots"]) != 1:
raise ValueError("Expected 1 keyslot")
if header["keyslots"]["0"]["type"] != "luks2":
raise ValueError("Expected luks2 keyslot")
if header["keyslots"]["0"]["area"]["encryption"] != "aes-xts-plain64":
raise ValueError("Expected aes-xts-plain64 encryption")
if header["keyslots"]["0"]["kdf"]["type"] != "argon2id":
raise ValueError("Expected argon2id kdf")
if len(header["tokens"]) != 0:
raise ValueError("Expected 0 tokens")
if len(header["segments"]) != 1:
raise ValueError("Expected 1 segment")
if header["segments"]["0"]["type"] != "crypt":
raise ValueError("Expected crypt segment")
if header["segments"]["0"]["encryption"] != "aes-xts-plain64":
raise ValueError("Expected aes-xts-plain64 encryption")
if "flags" in header["segments"]["0"] and header["segments"]["0"]["flags"]:
raise ValueError("Segment contains unexpected flags")
```
</details>
3) Izmerite/potvrdite zaglavlje
- Uklonite nasumične soli/digeste i izmerite sanitizovano zaglavlje u TPM/TDX/SEV PCR-ove ili stanje KMS politike.
- Izdajte ključeve za dešifrovanje samo kada izmereno zaglavlje odgovara odobrenom, sigurnom profilu.
Operativne smernice:
- Obavezno koristite odvojeno zaglavlje + MAC ili strogu validaciju; nikada direktno ne verujte zaglavljima na disku.
- Konsumenti attestacije treba da odbace pre-patch verzije framework-a iz allow-listi.
## Napomene o verzijama i stavu održavaoca
- održavaoci cryptsetup-a pojasnili su da LUKS2 nije dizajniran da obezbedi integritet protiv manipulacije skladištem u ovom okruženju; null ciphers su zadržani radi kompatibilnosti unazad.
- cryptsetup 2.8.1 (Oct 19, 2025) odbacuje null ciphers za keyslots sa ne-praznim lozinkama, ali i dalje dozvoljava null ciphers za segments.
## Brze provere i trijaža
- Proverite da li je enkripcija bilo kog segmenta postavljena na null cipher:
```bash
cryptsetup luksDump --type luks2 --dump-json-metadata /dev/VDISK \
| jq -r '.segments | to_entries[] | "segment=" + .key + ", enc=" + .value.encryption'
```
- Proverite keyslot i segment algoritme pre otvaranja volumena. Ako ne možete da verifikujete MAC, primenite strogu JSON validaciju i otvorite koristeći detached header iz zaštićene memorije.
## References
- [Vulnerabilities in LUKS2 disk encryption for confidential VMs (Trail of Bits)](https://blog.trailofbits.com/2025/10/30/vulnerabilities-in-luks2-disk-encryption-for-confidential-vms/)
- [cryptsetup issue #954 (null cipher acceptance and integrity considerations)](https://gitlab.com/cryptsetup/cryptsetup/-/issues/954)
- [CVE-2025-59054](https://nvd.nist.gov/vuln/detail/CVE-2025-59054)
- [CVE-2025-58356](https://nvd.nist.gov/vuln/detail/CVE-2025-58356)
- [Related context: CVE-2021-4122 (auto-recovery path silently decrypting disks)](https://www.cve.org/CVERecord?id=CVE-2021-4122)
{{#include ../../banners/hacktricks-training.md}}

View File

@@ -1,4 +1,4 @@
# Pentesting Cloud Metodologija
# Pentesting Metodologija oblaka
{{#include ../banners/hacktricks-training.md}}
@@ -6,39 +6,39 @@
## Osnovna metodologija
Svaki cloud ima svoje osobenosti, ali generalno postoji nekoliko **zajedničkih stvari koje pentester treba da proveri** kada testira cloud okruženje:
Svaki cloud ima svoje specifičnosti, ali generalno postoji nekoliko **uobičajenih stvari koje pentester treba da proveri** kada testira cloud okruženje:
- **Benchmark provere**
- Ovo će vam pomoći da **razumete veličinu** okruženja i **korišćene servise**
- Takođe će vam omogućiti da pronađete neke **brze greške u konfiguraciji** pošto većinu ovih testova možete izvršiti pomoću **automatizovanih alata**
- **Enumeracija servisa**
- Verovatno nećete naći mnogo više grešaka u konfiguraciji ovde ako ste pravilno izvršili benchmark testove, ali možete naći neke koje se nisu tražile u benchmark testu.
- Ovo će vam omogućiti da znate **šta se tačno koristi** u cloud okruženju
- Ovo će mnogo pomoći u narednim koracima
- **Provera izloženih resursa**
- Ovo može biti urađeno tokom prethodnog dela, potrebno je da **otkrijete sve što je potencijalno izloženo** Internetu na neki način i kako se može pristupiti.
- Ovde mislim na **ručno izloženu infrastrukturu** kao što su instance sa web stranicama ili drugim izloženim portovima, i takođe na druge **cloud managed services koje se mogu konfigurisati** da budu izložene (kao što su DBs ili buckets)
- Zatim treba da proverite **da li taj resurs može biti izložen ili ne** (poverljive informacije? ranjivosti? greške u konfiguraciji izloženog servisa?)
- **Provera dozvola**
- Ovde treba da **utvrdite sve dozvole svake uloge/korisnika** u cloud-u i kako se koriste
- Previše **visoko privilegovanih** (kontrolišu sve) naloga? Generisani ključevi se ne koriste?... Većina ovih provera bi već trebalo da je urađena u benchmark testovima
- Ako klijent koristi OpenID, SAML ili neku drugu **federation**, možda ćete morati da od njih zatražite dodatne **informacije** o **kako se svaka uloga dodeljuje** (nije isto da je admin uloga dodeljena jednom korisniku ili 100)
- Nije dovoljno da se utvrdi koji korisnici imaju **admin** dozvole "*:*". Postoji mnogo **ostalih dozvola** koje, u zavisnosti od korišćenih servisa, mogu biti veoma **osetljive**.
- Štaviše, postoje **potencijalni privesc** načini koji se mogu ispratiti zloupotrebom dozvola. Sve ovo treba uzeti u obzir i prijaviti **što više privesc puteva koliko je moguće**.
- **Provera integracija**
- Veoma je verovatno da su **integracije sa drugim cloud-ovima ili SaaS** korišćene unutar cloud okruženja.
- Za **integracije cloud-a koje auditirate** sa drugim platformama treba da obavestite **ko ima pristup da (zloupotrebi) tu integraciju** i treba da pitate **koliko je osetljiva** akcija koja se izvršava.\
Na primer, ko može da upisuje u AWS bucket iz kojeg GCP dobija podatke (pitajte koliko je osetljiva ta radnja u GCP prilikom obrade tih podataka).
- Za **integracije unutar cloud-a koji auditirate** iz eksternih platform, treba da pitate **ko ima eksterni pristup da (zloupotrebi) tu integraciju** i proverite kako se ti podaci koriste.\
Na primer, ako servis koristi Docker image hostovan u GCR, treba da pitate ko ima pristup da modifikuje taj image i koje osetljive informacije i pristupe će taj image dobiti kada se izvrši unutar AWS cloud-a.
- **Benchmark checks**
- Ovo će vam pomoći da **shvatite veličinu** okruženja i **korišćene servise**
- Takođe će vam omogućiti da pronađete neke **quick misconfigurations** pošto većinu ovih testova možete izvesti pomoću **automated tools**
- **Services Enumeration**
- Verovatno nećete pronaći mnogo više misconfigurations ovde ako ste ispravno izvršili benchmark tests, ali možda ćete pronaći neke koji nisu bili obuhvaćeni benchmark testom.
- Ovo će vam omogućiti da znate **šta se tačno koristi** u cloud env
- Ovo će puno pomoći u narednim koracima
- **Check exposed assets**
- Ovo se može raditi tokom prethodnog dela; treba da **otkrijete sve što je potencijalno izloženo** na Internet na neki način i kako se može pristupiti.
- Ovde podrazumevam **manually exposed infrastructure** kao instance sa web stranicama ili drugim portovima izloženim, kao i druge **cloud managed services** koje se mogu konfigurisati da budu izložene (kao DBs ili buckets)
- Zatim treba da proverite **da li taj resurs može biti izložen ili ne** (poverljive informacije? vulnerabilities? misconfigurations in the exposed service?)
- **Check permissions**
- Ovde treba da **otkrijete sve permissions svakog role/user** unutar clouda i kako se koriste
- Previše **highly privileged** (control everything) naloga? Generated keys not used?... Većina ovih provera bi trebala biti urađena u benchmark tests već
- Ako klijent koristi OpenID ili SAML ili neku drugu federaciju možda ćete morati da tražite dodatne **informacije** o **kako se dodeljuje svaka uloga** (nije isto ako je admin uloga dodeljena 1 korisniku ili 100)
- Nije dovoljno da pronađete koji korisnici imaju **admin permissions** "*:*". Postoji mnogo drugih **permissions** koji, u zavisnosti od korišćenih servisa, mogu biti veoma **osetljivi**.
- Štaviše, postoje potencijalni privesc načini za zloupotrebu permissions. Sve ovo treba uzeti u obzir i **prijaviti što više privesc paths** koliko je moguće.
- **Check Integrations**
- Veoma je verovatno da se koriste **integrations with other clouds or SaaS** unutar cloud okruženja.
- Za **integrations of the cloud you are auditing** sa drugim platformama treba da obavestite **ko ima pristup da (ab)use tu integraciju** i treba da pitate **koliko je osetljiva** akcija koja se izvodi.\
Na primer, ko može da piše u jedan AWS bucket iz kog GCP uzima podatke (pitati koliko je ta akcija osetljiva u GCP pri obradi tih podataka).
- Za **integrations inside the cloud you are auditing** iz eksternih platforma, treba da pitate **ko ima spoljašnji pristup da (ab)use tu integraciju** i proverite kako se ti podaci koriste.\
Na primer, ako servis koristi Docker image hostovan u GCR, treba da pitate ko ima pristup da modifikuje taj image i koje osetljive informacije i pristupe će taj image dobiti kada se pokrene unutar AWS clouda.
## Multi-Cloud alati
## Alati za Multi-Cloud
Postoji nekoliko alata koji se mogu koristiti za testiranje različitih cloud okruženja. Koraci instalacije i linkovi biće navedeni u ovom delu.
Postoji nekoliko alata koji se mogu koristiti za testiranje različitih cloud okruženja. Koraci instalacije i linkovi biće navedeni u ovom odeljku.
### [PurplePanda](https://github.com/carlospolop/purplepanda)
Alat za **identifikovanje loših konfiguracija i privesc path u cloud-ovima i između cloud-ova/SaaS.**
Alat za **identifikovanje loših konfiguracija i privesc path u cloud-ovima i između cloud/SaaS.**
{{#tabs }}
{{#tab name="Install" }}
@@ -71,7 +71,7 @@ python3 main.py -e -p google #Enumerate the env
### [Prowler](https://github.com/prowler-cloud/prowler)
Podržava **AWS, GCP & Azure**. Pogledajte kako konfigurisati svakog provajdera na [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws)
Podržava **AWS, GCP & Azure**. Pogledajte kako konfigurisati svakog provajdera u [https://docs.prowler.cloud/en/latest/#aws](https://docs.prowler.cloud/en/latest/#aws)
```bash
# Install
pip install prowler
@@ -168,9 +168,9 @@ steampipe check all
```
<details>
<summary>Proverite sve projekte</summary>
<summary>Proveri sve projekte</summary>
Da biste proverili sve projekte, potrebno je da generišete fajl `gcp.spc` koji navodi sve projekte koje treba testirati. Možete jednostavno slediti uputstva iz sledećeg skripta
Da biste proverili sve projekte, potrebno je da generišete fajl `gcp.spc` koji navodi sve projekte za testiranje. Možete jednostavno pratiti uputstva iz sledećeg skripta
```bash
FILEPATH="/tmp/gcp.spc"
rm -rf "$FILEPATH" 2>/dev/null
@@ -196,9 +196,9 @@ echo "Copy $FILEPATH in ~/.steampipe/config/gcp.spc if it was correctly generate
Za proveru **ostalih GCP uvida** (korisno za nabrajanje servisa) koristite: [https://github.com/turbot/steampipe-mod-gcp-insights](https://github.com/turbot/steampipe-mod-gcp-insights)
Za pregled Terraform GCP koda: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance)
Za proveru Terraform GCP koda: [https://github.com/turbot/steampipe-mod-terraform-gcp-compliance](https://github.com/turbot/steampipe-mod-terraform-gcp-compliance)
Više GCP plugina za Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp)
Više GCP plugin-ova za Steampipe: [https://github.com/turbot?q=gcp](https://github.com/turbot?q=gcp)
{{#endtab }}
{{#tab name="AWS" }}
@@ -238,11 +238,11 @@ Zahteva python2.7 i izgleda neodržavano.
### Nessus
Nessus ima _**Audit Cloud Infrastructure**_ skeniranje koje podržava: AWS, Azure, Office 365, Rackspace, Salesforce. Potrebne su neke dodatne konfiguracije u **Azure** kako bi se dobio **Client Id**.
Nessus ima _**Audit Cloud Infrastructure**_ skeniranje koje podržava: AWS, Azure, Office 365, Rackspace, Salesforce. Potrebne su neke dodatne konfiguracije u **Azure** da bi se dobio **Client Id**.
### [**cloudlist**](https://github.com/projectdiscovery/cloudlist)
Cloudlist je **multi-cloud tool for getting Assets** (Hostnames, IP Addresses) from Cloud Providers.
Cloudlist je **multi-cloud alat za prikupljanje Assets** (Hostnames, IP Addresses) od Cloud Providers.
{{#tabs }}
{{#tab name="Cloudlist" }}
@@ -265,7 +265,7 @@ cloudlist -config </path/to/config>
### [**cartography**](https://github.com/lyft/cartography)
Cartography je Python alat koji objedinuje infrastrukturne resurse i veze između njih u intuitivnom grafičkom prikazu zasnovanom na Neo4j bazi podataka.
Cartography je Python alat koji konsoliduje infrastrukturne resurse i odnose između njih u intuitivnom grafičkom prikazu koji pokreće Neo4j database.
{{#tabs }}
{{#tab name="Install" }}
@@ -302,7 +302,7 @@ ghcr.io/lyft/cartography \
### [**starbase**](https://github.com/JupiterOne/starbase)
Starbase prikuplja resurse i odnose iz servisa i sistema, uključujući cloud infrastrukturu, SaaS aplikacije, sigurnosne kontrole i još mnogo toga, u intuitivan grafički prikaz koji koristi Neo4j bazu podataka.
Starbase prikuplja resurse i veze iz servisa i sistema uključujući cloud infrastrukturu, SaaS aplikacije, bezbednosne kontrole i drugo — i prikazuje ih u intuitivnom grafu zasnovanom na Neo4j bazi podataka.
{{#tabs }}
{{#tab name="Install" }}
@@ -361,7 +361,7 @@ uri: bolt://localhost:7687
### [**SkyArk**](https://github.com/cyberark/SkyArk)
Otkriva najprivilegovanije korisnike u skeniranom AWS ili Azure okruženju, uključujući AWS Shadow Admins. Koristi powershell.
Otkrijte najprivilegovanije korisnike u skeniranom AWS ili Azure okruženju, uključujući AWS Shadow Admins. Koristi powershell.
```bash
Import-Module .\SkyArk.ps1 -force
Start-AzureStealth
@@ -376,11 +376,11 @@ Alat za pronalaženje infrastrukture kompanije (cilja), fajlova i aplikacija na
### [CloudFox](https://github.com/BishopFox/cloudfox)
- CloudFox je alat za pronalaženje iskoristivih puteva napada u cloud infrastrukturi (trenutno podržani samo AWS & Azure, a GCP dolazi uskoro).
- To je alat za enumeraciju koji je namenjen da dopuni manualni pentesting.
- Ne kreira niti menja bilo koje podatke unutar cloud okruženja.
- CloudFox je alat za pronalaženje iskoristivih putanja napada u cloud infrastrukturi (trenutno podržani samo AWS & Azure, GCP uskoro).
- To je alat za enumeraciju namenjen da dopuni manualni pentesting.
- Ne kreira niti menja bilo kakve podatke unutar cloud okruženja.
### Više spiskova alata za cloud sigurnost
### More lists of cloud security tools
- [https://github.com/RyanJarv/awesome-cloud-sec](https://github.com/RyanJarv/awesome-cloud-sec)
@@ -410,13 +410,12 @@ aws-security/
azure-security/
{{#endref}}
### Attack Graph
## Zajedničke funkcije bezbednosti u cloudu
[**Stormspotter** ](https://github.com/Azure/Stormspotter) kreira „attack graph“ resursa u Azure pretplati. Omogućava red teams i pentesters da vizualizuju površinu napada i mogućnosti pivotovanja unutar tenant-a, i ubrzava vaše odbrambene timove da se brzo orijentišu i daju prioritet radu na odgovoru na incidente.
### Office365
Potrebno je imati **Global Admin** ili bar **Global Admin Reader** (ali imajte na umu da je Global Admin Reader pomalo ograničen). Međutim, ta ograničenja se pojavljuju u nekim PS modulima i mogu se zaobići pristupanjem funkcijama **preko web aplikacije**.
### Confidential Computing
{{#ref}}
confidential-computing/luks2-header-malleability-null-cipher-abuse.md
{{#endref}}
{{#include ../banners/hacktricks-training.md}}