AWS - Nitro Enum
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
AWS Nitro to zestaw innowacyjnych technologii, które stanowią podstawową platformę dla instancji AWS EC2. Wprowadzony przez Amazon w celu zwiększenia bezpieczeństwa, wydajności i niezawodności, Nitro wykorzystuje niestandardowe komponenty sprzętowe i lekką warstwę hypervisora. Abstrakcyjnie przenosi wiele tradycyjnych funkcji wirtualizacji na dedykowany sprzęt i oprogramowanie, minimalizując powierzchnię ataku i poprawiając efektywność zasobów. Przez odciążenie funkcji wirtualizacji, Nitro pozwala instancjom EC2 dostarczać wydajność bliską wydajności sprzętowej, co jest szczególnie korzystne dla aplikacji wymagających dużych zasobów. Dodatkowo, Nitro Security Chip zapewnia bezpieczeństwo sprzętu i oprogramowania układowego, co dodatkowo wzmacnia jego solidną architekturę.
AWS Nitro Enclaves zapewniają bezpieczne, izolowane środowisko obliczeniowe w instancjach Amazon EC2, zaprojektowane specjalnie do przetwarzania wysoce wrażliwych danych. Wykorzystując system AWS Nitro, te enklawy zapewniają solidną izolację i bezpieczeństwo, idealne do obsługi poufnych informacji, takich jak PII czy dane finansowe. Oferują minimalistyczne środowisko, znacznie redukując ryzyko ujawnienia danych. Dodatkowo, Nitro Enclaves wspierają kryptograficzną atestację, umożliwiając użytkownikom weryfikację, że tylko autoryzowany kod jest uruchamiany, co jest kluczowe dla utrzymania ścisłej zgodności i standardów ochrony danych.
Obrazy Nitro Enclave są uruchamiane z wnętrza instancji EC2 i nie można zobaczyć w konsoli internetowej AWS, czy instancje EC2 uruchamiają obrazy w Nitro Enclave, czy nie.
Follow the all instructions from the documentation. However, these are the most important ones:
Obrazy, które możesz uruchomić w Nitro Enclave, są oparte na obrazach docker, więc możesz tworzyć swoje obrazy Nitro Enclave z obrazów docker, takich jak:
Jak widać, obrazy Nitro Enclave używają rozszerzenia eif
(Enclave Image File).
Wynik będzie wyglądał podobnie do:
Zgodnie z dokumentacją, aby uruchomić obraz enklawy, musisz przypisać mu pamięć o wielkości co najmniej 4 razy większej niż rozmiar pliku eif
. Możliwe jest skonfigurowanie domyślnych zasobów, które mu przydzielisz w pliku.
Zawsze pamiętaj, że musisz zarezerwować pewne zasoby dla rodzica instancji EC2!
Po poznaniu zasobów, które należy przydzielić obrazowi, a nawet po modyfikacji pliku konfiguracyjnego, możliwe jest uruchomienie obrazu enklawy za pomocą:
Jeśli skompromitujesz hosta EC2, możliwe jest uzyskanie listy działających obrazów enklaw za pomocą:
Nie jest możliwe uzyskanie powłoki wewnątrz działającego obrazu enclave, ponieważ to jest główny cel enclave, jednak jeśli użyjesz parametru --debug-mode
, możliwe jest uzyskanie stdout z niego za pomocą:
Jeśli atakujący skompromituje instancję EC2, domyślnie nie będzie w stanie uzyskać powłoki wewnątrz nich, ale będzie mógł je zakończyć za pomocą:
Jedynym sposobem na komunikację z enklawą uruchamiającą obraz jest użycie vsocks.
Virtual Socket (vsock) to rodzina gniazd w systemie Linux, zaprojektowana specjalnie w celu ułatwienia komunikacji między maszynami wirtualnymi (VM) a ich hypervisorami, lub między VM sami. Vsock umożliwia efektywną, dwukierunkową komunikację bez polegania na stosie sieciowym hosta. Umożliwia to VM komunikację nawet bez konfiguracji sieci, używając 32-bitowego identyfikatora kontekstu (CID) i numerów portów do identyfikacji i zarządzania połączeniami. API vsock obsługuje zarówno typy gniazd strumieniowych, jak i datagramowych, podobnie jak TCP i UDP, co zapewnia wszechstronne narzędzie dla aplikacji na poziomie użytkownika w wirtualnych środowiskach.
Dlatego adres vsock wygląda tak: <CID>:<Port>
Aby znaleźć CIDs obrazów uruchamiających enklawę, możesz po prostu wykonać następujące polecenie i uzyskać EnclaveCID
:
Zauważ, że z hosta nie ma sposobu, aby wiedzieć, czy CID eksponuje jakiś port! Chyba że używasz jakiegoś skanera portów vsock, takiego jak https://github.com/carlospolop/Vsock-scanner.
Znajdź tutaj kilka przykładów: