AWS - Nitro Enum

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

AWS Nitro is 'n stel van innoverende tegnologieë wat die onderliggende platform vorm vir AWS EC2-instanies. Deur Amazon bekendgestel om sekuriteit, prestasie, en betroubaarheid te verbeter, maak Nitro gebruik van aangepaste hardewarekomponente en 'n ligte hipervisor. Dit abstraheer groot dele van die tradisionele virtualiseringsfunksionaliteit na toegewyde hardeware en sagteware, minimeer die aanvalsoppervlak en verbeter hulpbron doeltreffendheid. Deur virtualiseringsfunksies af te laai, maak Nitro dit moontlik vir EC2-instanies om naby aan bare-metal prestasie te lewer, wat dit veral voordelig maak vir hulpbron-intensiewe toepassings. Daarbenewens verseker die Nitro Security Chip spesifiek die sekuriteit van die hardeware en firmware, wat sy robuuste argitektuur verder versterk.

Nitro Enclaves

AWS Nitro Enclaves bied 'n veilige, geïsoleerde rekenomgewing binne Amazon EC2-instanies, spesifiek ontwerp vir die verwerking van hoogs sensitiewe data. Deur die AWS Nitro-stelsel te benut, verseker hierdie enklaves robuuste isolering en sekuriteit, ideaal vir die hanteer van vertroulike inligting soos PII of finansiële rekords. Hulle bied 'n minimalistiese omgewing, wat die risiko van data- blootstelling aansienlik verminder. Daarbenewens ondersteun Nitro Enclaves kriptografiese attestasie, wat gebruikers in staat stel om te verifieer dat slegs gemagtigde kode loop, wat noodsaaklik is vir die handhawing van streng nakomings- en data beskermingsstandaarde.

Nitro Enclave-beelde word van binne EC2-instanies uitgevoer en jy kan nie vanaf die AWS-webkonsolide sien of 'n EC2-instanie beelde in Nitro Enclave uitvoer nie.

Nitro Enclave CLI-installering

Volg al die instruksies van die dokumentasie. Nietemin, hierdie is die belangrikste:

# 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 Afsonderingsbeeld

Die beelde wat jy in Nitro Afsondering kan hardloop, is gebaseer op docker-beelde, sodat jy jou Nitro Afsonderingsbeelde van docker-beelde kan skep soos:

# 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

Soos u kan sien, gebruik die Nitro Enclave-beelde die uitbreiding eif (Enclave Image File).

Die uitset sal soortgelyk lyk aan:

Using the locally available Docker image...
Enclave Image successfully created.
{
"Measurements": {
"HashAlgorithm": "Sha384 { ... }",
"PCR0": "e199261541a944a93129a52a8909d29435dd89e31299b59c371158fc9ab3017d9c450b0a580a487e330b4ac691943284",
"PCR1": "bcdf05fefccaa8e55bf2c8d6dee9e79bbff31e34bf28a99aa19e6b29c37ee80b214a414b7607236edf26fcb78654e63f",
"PCR2": "2e1fca1dbb84622ec141557dfa971b4f8ea2127031b264136a20278c43d1bba6c75fea286cd4de9f00450b6a8db0e6d3"
}
}

Voer 'n Afbeelding Uit

Volgens die dokumentasie, om 'n enklave-afbeelding uit te voer, moet jy dit toewys met geheue van ten minste 4 keer die grootte van die eif-lêer. Dit is moontlik om die verstekbronne te konfigureer wat daaraan gegee moet word in die lêer.

/etc/nitro_enclaves/allocator.yaml

Onthou altyd dat jy ook 'n paar hulpbronne vir die ouer EC2-instansie moet bespreek!

Nadat jy die hulpbronne ken wat aan 'n beeld gegee moet word en selfs die konfigurasie lêer gewysig het, is dit moontlik om 'n afgeslote beeld uit te voer met:

# 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

Enumereer Enklaves

Indien jy 'n EC2-gashost kompromitteer, is dit moontlik om 'n lys van lopende enklawe-afbeeldings te verkry met:

nitro-cli describe-enclaves

Dit is nie moontlik om 'n skaal binne 'n lopende omheiningbeeld te kry nie omdat dit die hoofdoel van die omheining is, maar as jy die parameter --debug-mode gebruik, is dit moontlik om die stdout daarvan te kry met:

ENCLAVE_ID=$(nitro-cli describe-enclaves | jq -r ".[0].EnclaveID")
nitro-cli console --enclave-id ${ENCLAVE_ID}

Beëindig Insluitings

Indien 'n aanvaller 'n EC2-instantie kompromitteer, sal hy standaard nie 'n skaal binne-in hulle kan kry nie, maar hy sal hulle wel kan beëindig met:

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

Vsock

Die enigste manier om met 'n enclave wat 'n beeld hardloop te kommunikeer, is deur vsocks te gebruik.

Virtuele Soket (vsock) is 'n soketfamilie in Linux wat spesifiek ontwerp is om kommunikasie tussen virtuele masjiene (VM's) en hul hipervisors, of tussen VM's self te fasiliteer. Vsock maak effektiewe, tweerigting kommunikasie moontlik sonder om op die gasheer se netwerkstapel te steun. Dit maak dit moontlik vir VM's om te kommunikeer selfs sonder netwerkkonfigurasies, deur 'n 32-bis Context ID (CID) en poortnommers te gebruik om verbindinge te identifiseer en te bestuur. Die vsock API ondersteun beide stroom- en datagram-sokettipes, soortgelyk aan TCP en UDP, wat 'n veelsydige instrument vir gebruikersvlaktoepassings in virtuele omgewings bied.

Daarom lyk 'n vsock-adres soos dit: <CID>:<Poort>

Om die CID's van die enclave wat beelde hardloop te vind, kan jy net die volgende opdrag uitvoer en die EnclaveCID kry:

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"
}
}
]

Let daarop dat daar vanaf die gasheer geen manier is om te weet of 'n CID enige poort blootstel nie! Tensy jy 'n vsock-poortskandeerder soos https://github.com/carlospolop/Vsock-scanner gebruik.

Vsock-bediener/luisteraar

Vind hier 'n paar voorbeelde:

Eenvoudige Python Luisteraar

```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}")

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

Vsock Kliënt

Voorbeelde:

Last updated