AWS - Nitro Enum

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

AWS Nitro je skup inovativnih tehnologija koje čine osnovnu platformu za AWS EC2 instance. Predstavljen od strane Amazona radi unapređenja sigurnosti, performansi i pouzdanosti, Nitro koristi prilagođene hardverske komponente i lagani hipervizor. On apstrahuje veći deo tradicionalne virtualizacije na posvećeni hardver i softver, minimizirajući površinu napada i poboljšavajući efikasnost resursa. Prebacivanjem virtualizacijskih funkcija, Nitro omogućava EC2 instancama da pruže performanse skoro identične fizičkom serveru, čineći ga posebno korisnim za aplikacije koje zahtevaju mnogo resursa. Dodatno, Nitro Security Chip posebno obezbeđuje sigurnost hardvera i firmware-a, dodatno učvršćujući njegovu robustnu arhitekturu.

Nitro Enclaves

AWS Nitro Enclaves pruža sigurno, izolovano računarsko okruženje unutar Amazon EC2 instanci, posebno dizajnirano za obradu visoko osetljivih podataka. Koristeći AWS Nitro System, ove enklave obezbeđuju robustnu izolaciju i sigurnost, idealnu za obradu poverljivih informacija poput ličnih identifikacionih podataka ili finansijskih zapisa. One sadrže minimalisticko okruženje, značajno smanjujući rizik od izloženosti podataka. Dodatno, Nitro Enclaves podržavaju kriptografsku atestaciju, omogućavajući korisnicima da provere da li se izvršava samo ovlašćeni kod, što je ključno za održavanje stroge usaglašenosti i standarda zaštite podataka.

Slike Nitro Enclave-a se pokreću iznutra EC2 instanci i ne možete videti iz AWS veb konzole da li EC2 instanca pokreće slike u Nitro Enclave-u ili ne.

Instalacija Nitro Enclave CLI

Pratite sve instrukcije 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

Slike Nitro Enclave

Slike koje možete pokrenuti u Nitro Enclave-u zasnovane su na docker slikama, tako da možete kreirati svoje slike Nitro Enclave-a 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, slike Nitro Enclave 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 dodeliti joj memoriju barem 4 puta veću od veličine eif datoteke. Moguće je konfigurisati podrazumevane resurse koje treba dodeliti u datoteci.

/etc/nitro_enclaves/allocator.yaml

Uvek zapamtite da treba da rezervišete neke resurse za roditeljsku EC2 instancu takođe!

Nakon što saznate resurse koje treba dodeliti slici, čak i nakon što 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

Nabrojavanje Enklava

Ako kompromitujete EC2 domaćina, moguće je dobiti listu pokrenutih slika enklava pomoću:

nitro-cli describe-enclaves

Nije moguće dobiti shell unutar pokrenute slike enklave jer je to glavna svrha enklave, 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}

Prekini ograde

Ako napadač kompromituje EC2 instancu, podrazumevano neće moći da dobije pristup unutar nje, ali će moći da je prekine sa:

nitro-cli terminate-enclave --enclave-id ${ENCLAVE_ID}

Vsock

Jedini način komuniciranja sa enklavom koja pokreće sliku je korišćenjem vsocks.

Virtualni Socket (vsock) je porodični socket u Linuxu specijalno dizajniran za olakšavanje komunikacije između virtuelnih mašina (VMs) i njihovih hipervizora, ili između samih VM-ova. Vsock omogućava efikasnu, dvosmernu komunikaciju bez oslanjanja na mrežni skup domaćina. Ovo omogućava VM-ovima da komuniciraju čak i bez konfiguracija mreže, koristeći 32-bitni Context ID (CID) i brojeve portova za identifikaciju i upravljanje konekcijama. vsock API podržava i tok i datagram tipove soketa, slično TCP-u i UDP-u, pružajući svestran alat za aplikacije na nivou korisnika u virtuelnim okruženjima.

Stoga, adresa vsock-a izgleda ovako: <CID>:<Port>

Da biste pronašli CIDs enklava koje pokreću slike, 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"
}
}
]

Imajte na umu da sa domaćina ne postoji način da se zna da li CID izlaže bilo koji port! Osim ako se koristi neki vsock skener porta kao https://github.com/carlospolop/Vsock-scanner.

Vsock Server/Listener

Ovde pronađite nekoliko primera:

Jednostavan Python Listener

```python #!/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}")

</detalji>
```bash
# Using socat
socat VSOCK-LISTEN:<port>,fork EXEC:"echo Hello from server!"

Vsock Klijent

Primeri:

Last updated