AWS - Nitro Enum
Reading time: 11 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
AWS Nitro je skup inovativnih tehnologija koje čine osnovnu platformu za AWS EC2 instance. Uveden od strane Amazona da poboljša bezbednost, performanse i pouzdanost, Nitro koristi prilagođene hardverske komponente i lagani hipervizor. Apstrahuje većinu tradicionalne funkcionalnosti virtualizacije na posvećen hardver i softver, minimizirajući površinu napada i poboljšavajući efikasnost resursa. Prebacivanjem funkcija virtualizacije, Nitro omogućava EC2 instancama da pružaju performanse blizu onih na fizičkom hardveru, što je posebno korisno za aplikacije koje zahtevaju mnogo resursa. Pored toga, Nitro Security Chip posebno osigurava bezbednost hardvera i firmvera, dodatno učvršćujući svoju robusnu arhitekturu.
Nitro Enklave
AWS Nitro Enclaves pruža sigurno, izolovano okruženje za obradu unutar Amazon EC2 instanci, posebno dizajnirano za obradu veoma osetljivih podataka. Koristeći AWS Nitro sistem, ove enklave osiguravaju robusnu izolaciju i bezbednost, idealne za rukovanje poverljivim informacijama kao što su PII ili finansijski podaci. Imaju minimalističko okruženje, značajno smanjujući rizik od izlaganja podataka. Pored toga, Nitro Enclaves podržavaju kriptografsku attestaciju, omogućavajući korisnicima da verifikuju da samo autorizovani kod radi, što je ključno za održavanje strogih standarda usklađenosti i zaštite podataka.
caution
Nitro Enclave slike se pokreću iznutra EC2 instanci i ne možete videti iz AWS web konzole da li EC2 instance pokreću slike u Nitro Enclave ili ne.
Instalacija Nitro Enclave CLI
Pratite sve upute iz dokumentacije. Međutim, ovo su najvažnije:
# Install tools
sudo amazon-linux-extras install aws-nitro-enclaves-cli -y
sudo yum install aws-nitro-enclaves-cli-devel -y
# Config perms
sudo usermod -aG ne $USER
sudo usermod -aG docker $USER
# Check installation
nitro-cli --version
# Start and enable the Nitro Enclaves allocator service.
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
Nitro Enclave Images
Slike koje možete pokrenuti u Nitro Enclave su zasnovane na docker slikama, tako da možete kreirati svoje Nitro Enclave slike iz docker slika kao što su:
# You need to have the docker image accesible in your running local registry
# Or indicate the full docker image URL to access the image
nitro-cli build-enclave --docker-uri <docker-img>:<tag> --output-file nitro-img.eif
Kao što možete videti, Nitro Enclave slike koriste ekstenziju eif
(Enclave Image File).
Izlaz će izgledati slično:
Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
Pokreni sliku
Prema dokumentaciji, da biste pokrenuli sliku enklave, potrebno je da joj dodelite memoriju od najmanje 4 puta veličine eif
fajla. Moguće je konfigurisati podrazumevane resurse koje će joj dodeliti u fajlu.
/etc/nitro_enclaves/allocator.yaml
caution
Uvek zapamtite da treba da rezervišete neke resurse za roditeljsku EC2 instancu!
Nakon što znate resurse koje treba dodeliti slici i čak ste izmenili konfiguracioni fajl, moguće je pokrenuti sliku enklave sa:
# Restart the service so the new default values apply
sudo systemctl start nitro-enclaves-allocator.service && sudo systemctl enable nitro-enclaves-allocator.service
# Indicate the CPUs and memory to give
nitro-cli run-enclave --cpu-count 2 --memory 3072 --eif-path hello.eif --debug-mode --enclave-cid 16
Enumerate Enclaves
Ako kompromitujete EC2 host, moguće je dobiti listu pokrenutih slika enklava sa:
nitro-cli describe-enclaves
Nije moguće dobiti shell unutar pokrenutog enclave imidža jer je to glavna svrha enclave, međutim, ako koristite parametar --debug-mode
, moguće je dobiti stdout sa:
ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}
Terminate Enclaves
Ako napadač kompromituje EC2 instancu, po defaultu neće moći da dobije shell unutar njih, ali će moći da terminate them sa:
nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}
Vsocks
Jedini način za komunikaciju sa enklavom koja pokreće sliku je korišćenje vsocks.
Virtual Socket (vsock) je porodica soketa u Linuxu posebno dizajnirana da olakša komunikaciju između virtuelnih mašina (VMs) i njihovih hipervizora, ili između VMs sama. Vsock omogućava efikasnu, dvosmernu komunikaciju bez oslanjanja na mrežni stek hosta. Ovo omogućava VMs da komuniciraju čak i bez mrežnih konfiguracija, koristeći 32-bitni Context ID (CID) i brojeve portova za identifikaciju i upravljanje vezama. Vsock API podržava i stream i datagram tipove soketa, slično TCP i UDP, pružajući svestran alat za aplikacije na korisničkom nivou u virtuelnim okruženjima.
tip
Stoga, vsock adresa izgleda ovako: <CID>:<Port>
Da biste pronašli CIDs slika koje pokreće enklava, možete jednostavno izvršiti sledeću komandu i dobiti EnclaveCID
:
nitro-cli describe-enclaves
[
{
"EnclaveName": "secure-channel-example",
"EnclaveID": "i-0bc274f83ade02a62-enc18ef3d09c886748",
"ProcessID": 10131,
"EnclaveCID": 16,
"NumberOfCPUs": 2,
"CPUIDs": [
1,
3
],
"MemoryMiB": 1024,
"State": "RUNNING",
"Flags": "DEBUG_MODE",
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}
]
warning
Imajte na umu da sa hosta ne postoji način da se sazna da li CID izlaže neki port! Osim ako ne koristite neki vsock port skener kao https://github.com/carlospolop/Vsock-scanner.
Vsock Server/Listener
Pronađite ovde nekoliko primera:
Jednostavan Python Listener
#!/usr/bin/env python3
# From
https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST
PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.bind((CID, PORT))
s.listen()
(conn, (remote_cid, remote_port)) = s.accept()
print(f"Connection opened by cid={remote_cid} port={remote_port}")
while True:
buf = conn.recv(64)
if not buf:
break
print(f"Received bytes: {buf}")
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"
Vsock Klijent
Primeri:
Jednostavni Python Klijent
#!/usr/bin/env python3
#From https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
import socket
CID = socket.VMADDR_CID_HOST
PORT = 9999
s = socket.socket(socket.AF_VSOCK, socket.SOCK_STREAM)
s.connect((CID, PORT))
s.sendall(b"Hello, world!")
s.close()
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000
Vsock Proxy
Alat vsock-proxy omogućava proksiranje vsock proksija sa drugom adresom, na primer:
vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml
Ovo će proslediti lokalni port 8001 u vsock na ip-ranges.amazonaws.com:443
, a datoteka your-vsock-proxy.yaml
može imati ovaj sadržaj koji omogućava pristup ip-ranges.amazonaws.com:443
:
allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }
Moguće je videti vsock adrese (<CID>:<Port>
) koje koristi EC2 host sa (obratite pažnju na 3:8001
, 3 je CID, a 8001 port):
sudo ss -l -p -n | grep v_str
v_str LISTEN 0 0 3:8001 *:* users:(("vsock-proxy",pid=9458,fd=3))
Nitro Enclave Atestacija & KMS
Nitro Enclaves SDK omogućava enklavi da zatraži kriptografski potpisan dokument o atestaciji od Nitro Hypervisora, koji uključuje jedinstvene merenja specifične za tu enklavu. Ova merenja, koja uključuju hash-ove i registre konfiguracije platforme (PCRs), koriste se tokom procesa atestacije da dokažu identitet enklave i izgrade poverenje sa spoljnim servisima. Dokument o atestaciji obično sadrži vrednosti kao što su PCR0, PCR1 i PCR2, koje ste već sreli prilikom izrade i čuvanja EIF-a enklave.
Sa docs, ovo su PCR vrednosti:
PCR | Hash of ... | Opis |
---|---|---|
PCR0 | Fajl slike enklave | Kontinuirano merenje sadržaja fajla slike, bez podataka o sekciji. |
PCR1 | Linux kernel i bootstrap | Kontinuirano merenje podataka kernela i boot ramfs. |
PCR2 | Aplikacija | Kontinuirano, u redosledu merenje korisničkih aplikacija, bez boot ramfs. |
PCR3 | IAM uloga dodeljena roditeljskoj instanci | Kontinuirano merenje IAM uloge dodeljene roditeljskoj instanci. Osigurava da proces atestacije uspeva samo kada roditeljska instanca ima ispravnu IAM ulogu. |
PCR4 | ID instance roditeljske instance | Kontinuirano merenje ID-a roditeljske instance. Osigurava da proces atestacije uspeva samo kada roditeljska instanca ima specifičan ID instance. |
PCR8 | Potpisni sertifikat fajla slike enklave | Merenje potpisnog sertifikata specificiranog za fajl slike enklave. Osigurava da proces atestacije uspeva samo kada je enklava pokrenuta iz fajla slike enklave potpisanog specifičnim sertifikatom. |
Možete integrisati kriptografsku atestaciju u vaše aplikacije i iskoristiti unapred izgrađene integracije sa servisima kao što je AWS KMS. AWS KMS može validirati atestacije enklava i nudi ključeve zasnovane na atestaciji (kms:RecipientAttestation:ImageSha384
i kms:RecipientAttestation:PCR
) u svojim politikama ključeva. Ove politike osiguravaju da AWS KMS dozvoljava operacije korišćenjem KMS ključa samo ako je dokument o atestaciji enklave validan i ispunjava specificirane uslove.
tip
Imajte na umu da Enklave u režimu debagovanja (--debug) generišu dokumente o atestaciji sa PCR-ima koji se sastoje od nula (000000000000000000000000000000000000000000000000
). Stoga, KMS politike koje proveravaju ove vrednosti će propasti.
PCR Bypass
Iz perspektive napadača, primetite da neki PCR-i omogućavaju modifikaciju nekih delova ili cele slike enklave i da će i dalje biti validni (na primer, PCR4 samo proverava ID roditeljske instance, tako da pokretanje bilo koje slike enklave u toj EC2 će omogućiti ispunjavanje ovog potencijalnog PCR zahteva).
Stoga, napadač koji kompromituje EC2 instancu može biti u mogućnosti da pokrene druge slike enklava kako bi zaobišao ove zaštite.
Istraživanje o tome kako modifikovati/kreirati nove slike za zaobilaženje svake zaštite (posebno onih koje nisu tako očigledne) je još uvek TODO.
Reference
- https://medium.com/@F.DL/understanding-vsock-684016cf0eb0
- Sve delove Nitro tutorijala od AWS: https://catalog.us-east-1.prod.workshops.aws/event/dashboard/en-US/workshop/1-my-first-enclave/1-1-nitro-enclaves-cli
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.