AWS - Nitro Enum

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

AWS Nitro ist eine Suite von innovativen Technologien, die die zugrunde liegende Plattform für AWS EC2-Instanzen bilden. Von Amazon eingeführt, um die Sicherheit, Leistung und Zuverlässigkeit zu verbessern, nutzt Nitro benutzerdefinierte Hardwarekomponenten und einen leichten Hypervisor. Es abstrahiert einen Großteil der traditionellen Virtualisierungsfunktionalität auf dedizierte Hardware und Software, minimiert die Angriffsfläche und verbessert die Ressourceneffizienz. Durch die Auslagerung von Virtualisierungsfunktionen ermöglicht Nitro EC2-Instanzen die Bereitstellung von nahezu Bare-Metal-Leistung, was insbesondere für ressourcenintensive Anwendungen vorteilhaft ist. Darüber hinaus gewährleistet der Nitro Security Chip speziell die Sicherheit von Hardware und Firmware, was die robuste Architektur weiter festigt.

Nitro Enclaves

AWS Nitro Enclaves bietet eine sichere, isolierter Rechenumgebung innerhalb von Amazon EC2-Instanzen, die speziell für die Verarbeitung hochsensibler Daten entwickelt wurde. Unter Verwendung des AWS Nitro Systems gewährleisten diese Enklaven eine robuste Isolierung und Sicherheit, ideal für die Behandlung vertraulicher Informationen wie PII oder Finanzdaten. Sie verfügen über eine minimalistische Umgebung, die das Risiko einer Datenexposition erheblich reduziert. Darüber hinaus unterstützen Nitro Enclaves die kryptografische Beglaubigung, die es Benutzern ermöglicht zu überprüfen, dass nur autorisierter Code ausgeführt wird, was entscheidend ist, um strenge Compliance- und Datenschutzstandards aufrechtzuerhalten.

Nitro Enclave-Images werden innerhalb von EC2-Instanzen ausgeführt und Sie können nicht aus der AWS-Webkonsole erkennen, ob eine EC2-Instanz Bilder in Nitro Enclave ausführt oder nicht.

Nitro Enclave CLI-Installation

Befolgen Sie alle Anweisungen aus der Dokumentation. Hier sind jedoch die wichtigsten:

# 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-Enklaven-Bilder

Die Bilder, die Sie in Nitro-Enklaven ausführen können, basieren auf Docker-Bildern. Sie können also Ihre Nitro-Enklaven-Bilder aus Docker-Bildern wie folgt erstellen:

# 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

Wie Sie sehen können, verwenden die Nitro Enclave-Images die Erweiterung eif (Enclave Image File).

Die Ausgabe wird ähnlich aussehen:

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

Führen Sie ein Image aus

Gemäß der Dokumentation müssen Sie, um ein Enclave-Image auszuführen, ihm einen Arbeitsspeicher von mindestens 4-mal der Größe der eif-Datei zuweisen. Es ist möglich, die Standardressourcen, die ihm zugewiesen werden sollen, in der Datei zu konfigurieren.

/etc/nitro_enclaves/allocator.yaml

Denken Sie immer daran, dass Sie auch einige Ressourcen für die übergeordnete EC2-Instanz reservieren müssen!

Nachdem Sie die Ressourcen kennen, die einem Image zugewiesen werden sollen, und sogar die Konfigurationsdatei geändert haben, ist es möglich, ein Enclave-Image mit folgendem Befehl auszuführen:

# 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

Enklaven auflisten

Wenn Sie einen EC2-Host kompromittieren, ist es möglich, eine Liste der ausgeführten Enklavenbilder mit dem folgenden Befehl zu erhalten:

nitro-cli describe-enclaves

Es ist nicht möglich, eine Shell innerhalb eines laufenden Enklavenbilds zu erhalten, da dies der Hauptzweck der Enklave ist. Wenn Sie jedoch den Parameter --debug-mode verwendet haben, ist es möglich, die stdout damit zu erhalten:

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

Beenden von Enclaves

Wenn ein Angreifer eine EC2-Instanz kompromittiert, wird er standardmäßig nicht in der Lage sein, eine Shell darin zu öffnen, aber er wird in der Lage sein, sie mit:

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

Vsocks

Der einzige Weg, um mit einem Enklave-Laufbild zu kommunizieren, ist die Verwendung von vsocks.

Virtual Socket (vsock) ist eine Socket-Familie in Linux, die speziell entwickelt wurde, um die Kommunikation zwischen virtuellen Maschinen (VMs) und ihren Hypervisoren oder zwischen den VMs selbst zu erleichtern. Vsock ermöglicht eine effiziente, bidirektionale Kommunikation, ohne auf den Netzwerkstack des Hosts angewiesen zu sein. Dadurch ist es möglich, dass VMs auch ohne Netzwerkkonfiguration kommunizieren können, indem sie eine 32-Bit-Context-ID (CID) und Portnummern verwenden, um Verbindungen zu identifizieren und zu verwalten. Die vsock-API unterstützt sowohl Stream- als auch Datagramm-Socket-Typen, ähnlich wie TCP und UDP, und bietet ein vielseitiges Werkzeug für Anwendungen auf Benutzerebene in virtuellen Umgebungen.

Daher sieht eine vsock-Adresse so aus: <CID>:<Port>

Um die CIDs der Enklave-Laufbilder zu finden, können Sie einfach den folgenden Befehl ausführen und den EnclaveCID erhalten:

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

Beachten Sie, dass es vom Host aus keinen Weg gibt zu wissen, ob ein CID einen Port freigibt! Es sei denn, Sie verwenden einen vsock-Portscanner wie https://github.com/carlospolop/Vsock-scanner.

Vsock-Server/Listener

Hier finden Sie ein paar Beispiele:

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

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

Vsock-Client

Beispiele:

Last updated