AWS - Nitro Enum

Μάθετε χάκερ AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Το AWS Nitro είναι μια σουίτα από καινοτόμες τεχνολογίες που αποτελούν τη βασική πλατφόρμα για τις περιπτώσεις AWS EC2. Εισήχθη από την Amazon για να ενισχύσει την ασφάλεια, την απόδοση και την αξιοπιστία, το Nitro εκμεταλλεύεται προσαρμοσμένα υλικά εξαρτήματα και ένα ελαφρύ υποσύστημα. Αφαιρεί μεγάλο μέρος της παραδοσιακής λειτουργικότητας εικονικοποίησης σε αφιερωμένο υλικό και λογισμικό, ελαχιστοποιώντας την επιφάνεια επίθεσης και βελτιώνοντας την αποδοτικότητα των πόρων. Με την απομάκρυνση των λειτουργιών εικονικοποίησης, το Nitro επιτρέπει στις περιπτώσεις EC2 να παρέχουν απόδοση κοντά στο μεταλλικό επίπεδο, κάτι που είναι ιδιαίτερα ωφέλιμο για εφαρμογές με μεγάλες απαιτήσεις πόρων. Επιπλέον, το Nitro Security Chip εξασφαλίζει ειδικά την ασφάλεια του υλικού και του firmware, ενισχύοντας περαιτέρω τη στιβαρή του αρχιτεκτονική.

Nitro Enclaves

Το AWS Nitro Enclaves παρέχει ένα ασφαλές, απομονωμένο περιβάλλον υπολογισμού εντός των περιπτώσεων Amazon EC2, σχεδιασμένο ειδικά για την επεξεργασία υψηλά ευαίσθητων δεδομένων. Χρησιμοποιώντας το Σύστημα AWS Nitro, αυτά τα enclaves εξασφαλίζουν αξιόπιστη απομόνωση και ασφάλεια, ιδανική για την χειρισμό εμπιστευτικών πληροφοριών όπως τα PII ή τα οικονομικά αρχεία. Διαθέτουν ένα περιβάλλον ελάχιστων δυνατοτήτων, μειώνοντας σημαντικά τον κίνδυνο εκθέσεως δεδομένων. Επιπλέον, τα Nitro Enclaves υποστηρίζουν κρυπτογραφική επαλήθευση, επιτρέποντας στους χρήστες να επαληθεύουν ότι τρέχει μόνο εξουσιοδοτημένος κώδικας, κάτι που είναι κρίσιμο για τη διατήρηση αυστηρών προτύπων συμμόρφωσης και προστασίας δεδομένων.

Οι εικόνες Nitro Enclave τρέχουν από μέσα σε περιπτώσεις EC2 και δεν μπορείτε να δείτε από την ιστοσελίδα του AWS αν μια περίπτωση EC2 τρέχει εικόνες σε Nitro Enclave ή όχι.

Εγκατάσταση Εντολικού Nitro Enclave

Ακολουθήστε όλες τις οδηγίες από την τεκμηρίωση. Ωστόσο, αυτές είναι οι πιο σημαντικές:

# 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

Οι εικόνες που μπορείτε να εκτελέσετε στο Nitro Enclave βασίζονται σε εικόνες docker, έτσι μπορείτε να δημιουργήσετε τις δικές σας εικόνες Nitro Enclave από εικόνες docker όπως:

# 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

Όπως μπορείτε να δείτε, οι εικόνες Nitro Enclave χρησιμοποιούν την επέκταση eif (Enclave Image File).

Η έξοδος θα μοιάζει με:

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

Εκτέλεση μιας Εικόνας

Σύμφωνα με την τεκμηρίωση, για να εκτελέσετε μια εικόνα enclave πρέπει να της ανατεθεί μνήμη τουλάχιστον 4 φορές το μέγεθος του αρχείου eif. Είναι δυνατόν να διαμορφώσετε τους προεπιλεγμένους πόρους που θα της δώσετε στο αρχείο.

/etc/nitro_enclaves/allocator.yaml

Να θυμάστε πάντα ότι πρέπει να κρατήσετε κάποιους πόρους για τη γονική EC2 περίπτωση!

Αφού γνωρίζετε τους πόρους που πρέπει να δώσετε σε μια εικόνα και έχετε ακόμα τροποποιήσει το αρχείο ρυθμίσεων, είναι δυνατόν να εκτελέσετε μια εικόνα περιοχής με:

# 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

Απαριθμήστε Οχυρώματα

Εάν διαρρεύσετε έναν οικοδεσπότη EC2, είναι δυνατόν να λάβετε μια λίστα με τις εικόνες οχυρώματος που τρέχουν με:

nitro-cli describe-enclaves

Δεν είναι δυνατόν να λάβετε ένα κέλυφος μέσα σε μια εικόνα περιοχής επειδή αυτός είναι ο κύριος σκοπός της περιοχής, ωστόσο, εάν χρησιμοποιήσετε την παράμετρο --debug-mode, είναι δυνατόν να λάβετε το stdout του με:

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

Τερματισμός Περιβαλλοντικών Ζωνών

Εάν ένας εισβολέας καταφέρει να διαρρήξει ένα παράδειγμα EC2, προεπιλεγμένα δεν θα μπορέσει να λάβει ένα κέλυφος μέσα σε αυτά, αλλά θα μπορεί να τερματίσει τα:

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

Vsock

Ο μοναδικός τρόπος επικοινωνίας με ένα enclave που εκτελεί εικόνα είναι μέσω vsocks.

Το Virtual Socket (vsock) είναι μια οικογένεια sockets στο Linux σχεδιασμένη ειδικά για να διευκολύνει τη επικοινωνία μεταξύ εικονικών μηχανών (VMs) και των υπερεκτελεστών τους, ή μεταξύ των ίδιων των VMs. Το vsock επιτρέπει αποδοτική, διπλής κατεύθυνσης επικοινωνία χωρίς να βασίζεται στη στοίβα δικτύου του υπολογιστή φιλοξενίας. Αυτό καθιστά δυνατή την επικοινωνία των VMs ακόμα και χωρίς ρυθμίσεις δικτύου, χρησιμοποιώντας ένα 32-bit Context ID (CID) και αριθμούς θύρας για την αναγνώριση και διαχείριση συνδέσεων. Το API του vsock υποστηρίζει τόσο sockets ροής όσο και datagram, παρόμοια με TCP και UDP, παρέχοντας ένα ευέλικτο εργαλείο για εφαρμογές σε επίπεδο χρήστη σε εικονικά περιβάλλοντα.

Επομένως, μια διεύθυνση vsock φαίνεται έτσι: <CID>:<Θύρα>

Για να βρείτε τα CIDs των εικόνων που εκτελούν το enclave, μπορείτε απλά να εκτελέσετε την παρακάτω εντολή και να πάρετε το 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"
}
}
]

Σημειώστε ότι από τον υπολογιστή φιλοξενίας δεν υπάρχει τρόπος να γνωρίζετε αν ένα CID εκθέτει κάποια θύρα! Εκτός αν χρησιμοποιήσετε κάποιο σαρωτή θυρών vsock όπως https://github.com/carlospolop/Vsock-scanner.

Vsock Server/Listener

Βρείτε εδώ μερικά παραδείγματα:

Απλός Ακροατής σε Python

```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

Παραδείγματα:

Last updated