AWS - Nitro Enum

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Temel Bilgiler

AWS Nitro, AWS EC2 örnekleri için temel platformu oluşturan yenilikçi teknolojiler setidir. Amazon tarafından güvenliği, performansı ve güvenilirliği artırmak amacıyla tanıtılan Nitro, özel donanım bileşenleri ve hafif bir hipervizör kullanır. Geleneksel sanallaştırma işlevlerinin çoğunu özel donanım ve yazılıma soyutlayarak, saldırı yüzeyini minimize eder ve kaynak verimliliğini artırır. Sanallaştırma işlevlerini devrederek, Nitro’nun EC2 örneklerinin neredeyse bare-metal performansı sunmasına olanak tanır, bu da kaynak yoğun uygulamalar için özellikle faydalıdır. Ayrıca, Nitro Güvenlik Çipi, donanım ve yazılım güvenliğini sağlamak için özel olarak tasarlanmıştır ve sağlam mimarisini daha da güçlendirir.

Nitro Enclaves

AWS Nitro Enclaves, Amazon EC2 örnekleri içinde, son derece hassas verilerin işlenmesi için özel olarak tasarlanmış güvenli, izole bir hesaplama ortamı sağlar. AWS Nitro Sistemi’nden yararlanarak, bu enclaves güçlü izolasyon ve güvenlik sağlar, gizli bilgilerin işlenmesi için idealdir, örneğin PII veya finansal kayıtlar gibi. Minimalist bir ortam sunarak, veri ifşası riskini önemli ölçüde azaltır. Ayrıca, Nitro Enclaves, kullanıcıların yalnızca yetkili kodun çalıştığını doğrulamasına olanak tanıyan kriptografik onaylamayı destekler, bu da sıkı uyum ve veri koruma standartlarının korunması için kritik öneme sahiptir.

Caution

Nitro Enclave görüntüleri EC2 örnekleri içinden çalıştırılır ve AWS web konsolundan bir EC2 örneğinin Nitro Enclave’de görüntü çalıştırıp çalıştırmadığını göremezsiniz.

Nitro Enclave CLI kurulumu

Tüm talimatları belgelerden takip edin. Ancak, en önemli olanlar şunlardır:

# 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 Görüntüleri

Nitro Enclave’da çalıştırabileceğiniz görüntüler, docker görüntülerine dayanmaktadır, bu nedenle Nitro Enclave görüntülerinizi şu docker görüntülerinden oluşturabilirsiniz:

# 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 görüntülerinin eif (Enclave Image File) uzantısını kullandığını görebilirsiniz.

Çıktı şu şekilde görünecektir:

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

Bir Görüntü Çalıştır

belgelere göre, bir enclave görüntüsü çalıştırmak için ona eif dosyasının boyutunun en az 4 katı kadar bellek atamanız gerekir. Ona verilecek varsayılan kaynakları dosyada yapılandırmak mümkündür.

/etc/nitro_enclaves/allocator.yaml

Caution

Her zaman ebeveyn EC2 örneği için de bazı kaynakları ayırmanız gerektiğini unutmayın!

Bir görüntüye verilecek kaynakları öğrendikten ve yapılandırma dosyasını değiştirdikten sonra, bir enclave görüntüsünü çalıştırmak mümkündür:

# 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

Enclaves’ı Listele

Eğer bir EC2 sunucusunu ele geçirirseniz, çalışan enclave görüntülerinin bir listesini almak mümkündür:

nitro-cli describe-enclaves

Bir çalışan enclave görüntüsünde bir shell almak mümkün değildir çünkü enclave’in ana amacı budur, ancak --debug-mode parametresini kullanırsanız, bunun stdout’unu almak mümkündür:

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

Enklaveleri Sonlandırma

Eğer bir saldırgan bir EC2 örneğini ele geçirirse, varsayılan olarak içlerinde bir shell elde edemeyecek, ancak onları sonlandırma yeteneğine sahip olacaktır:

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

Vsocks

Bir enclave çalışan görüntü ile iletişim kurmanın tek yolu vsocks kullanmaktır.

Virtual Socket (vsock), sanal makineler (VM’ler) ile hypervisor’lar arasında veya VM’ler arasında iletişimi kolaylaştırmak için özel olarak tasarlanmış bir soket ailesidir. Vsock, ana bilgisayarın ağ yığınına güvenmeden verimli, iki yönlü iletişim sağlar. Bu, VM’lerin ağ yapılandırmalarına ihtiyaç duymadan iletişim kurmasını mümkün kılar; bağlantıları tanımlamak ve yönetmek için 32-bit Context ID (CID) ve port numaraları kullanır. Vsock API’si, TCP ve UDP’ye benzer şekilde, akış ve datagram soket türlerini destekleyerek sanal ortamlardaki kullanıcı düzeyindeki uygulamalar için çok yönlü bir araç sağlar.

Tip

Bu nedenle, bir vsock adresi şu şekilde görünür: <CID>:<Port>

Çalışan görüntülerin CIDs’lerini bulmak için aşağıdaki komutu çalıştırabilir ve EnclaveCID’yi alabilirsiniz:

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

Warning

Ana bilgisayardan bir CID’nin herhangi bir portu açıp açmadığını bilmenin bir yolu yoktur! Bazı vsock port tarayıcıları gibi https://github.com/carlospolop/Vsock-scanner kullanmadıkça.

Vsock Sunucu/Dinleyici

Burada birkaç örnek bulabilirsiniz:

Basit Python Dinleyici ```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 İstemcisi

Örnekler:

Basit Python İstemcisi ```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.connect((CID, PORT)) s.sendall(b“Hello, world!“) s.close()

</details>
```bash
# Using socat
echo "Hello, vsock!" | socat - VSOCK-CONNECT:3:5000

Vsock Proxy

Aracın vsock-proxy, başka bir adresle bir vsock proxy’sini proxy’lemesine olanak tanır, örneğin:

vsock-proxy 8001 ip-ranges.amazonaws.com 443 --config your-vsock-proxy.yaml

Bu, vsock’taki yerel 8001 portunu ip-ranges.amazonaws.com:443 adresine yönlendirecek ve your-vsock-proxy.yaml dosyası, ip-ranges.amazonaws.com:443 adresine erişimi sağlayacak bu içeriğe sahip olabilir:

allowlist:
- { address: ip-ranges.amazonaws.com, port: 443 }

EC2 ana bilgisayarı tarafından kullanılan vsock adreslerini (<CID>:<Port>) görmek mümkündür (not: 3:8001, 3 CID ve 8001 portudur):

sudo ss -l -p -n | grep v_str
v_str LISTEN 0      0                                                                              3:8001                   *:*     users:(("vsock-proxy",pid=9458,fd=3))

Nitro Enclave Atestasyonu & KMS

Nitro Enclaves SDK, bir enclave’in Nitro Hypervisor’dan kriptografik olarak imzalanmış bir atestasyon belgesi talep etmesine olanak tanır; bu belge, o enclave’e özgü benzersiz ölçümler içerir. Bu ölçümler, hash’ler ve platform yapılandırma kayıtları (PCR’ler) dahil olmak üzere, atestasyon sürecinde enclave’in kimliğini kanıtlamak ve harici hizmetlerle güven inşa etmek için kullanılır. Atestasyon belgesi genellikle PCR0, PCR1 ve PCR2 gibi değerler içerir; bu değerlerle daha önce bir enclave EIF oluştururken ve kaydederken karşılaşmış olabilirsiniz.

docs kaynaklarına göre, bu PCR değerleridir:

PCRHash of ...Açıklama
PCR0Enclave görüntü dosyasıGörüntü dosyasının içeriklerinin kesintisiz ölçümü, bölüm verileri olmadan.
PCR1Linux çekirdeği ve bootstrapÇekirdek ve boot ramfs verilerinin kesintisiz ölçümü.
PCR2UygulamaKullanıcı uygulamalarının kesintisiz, sıralı ölçümü, boot ramfs olmadan.
PCR3Üst örneğe atanan IAM rolüÜst örneğe atanan IAM rolünün kesintisiz ölçümü. Atestasyon sürecinin yalnızca üst örnek doğru IAM rolüne sahip olduğunda başarılı olmasını sağlar.
PCR4Üst örneğin ID'siÜst örneğin ID'sinin kesintisiz ölçümü. Atestasyon sürecinin yalnızca üst örnek belirli bir örnek ID'sine sahip olduğunda başarılı olmasını sağlar.
PCR8Enclave görüntü dosyası imzalama sertifikasıEnclave görüntü dosyası için belirtilen imzalama sertifikasının ölçümü. Atestasyon sürecinin yalnızca enclave, belirli bir sertifika ile imzalanmış bir enclave görüntü dosyasından başlatıldığında başarılı olmasını sağlar.

Kriptografik atestasyonu uygulamalarınıza entegre edebilir ve AWS KMS gibi hizmetlerle önceden oluşturulmuş entegrasyonlardan yararlanabilirsiniz. AWS KMS, enclave atestasyonlarını doğrulayabilir ve anahtar politikalarında atestasyona dayalı koşul anahtarları (kms:RecipientAttestation:ImageSha384 ve kms:RecipientAttestation:PCR) sunar. Bu politikalar, AWS KMS’nin KMS anahtarını yalnızca enclave’in atestasyon belgesi geçerli olduğunda ve belirtilen koşulları karşıladığında kullanmasına izin verir.

Tip

Debug (–debug) modunda Enclaves, sıfırlardan (000000000000000000000000000000000000000000000000) oluşan PCR’lerle atestasyon belgeleri üretir. Bu nedenle, bu değerleri kontrol eden KMS politikaları başarısız olacaktır.

PCR Atlatma

Saldırganlar açısından bakıldığında, bazı PCR’lerin enclave görüntüsünün bazı kısımlarını veya tamamını değiştirmeye izin vereceğini ve yine de geçerli olacağını fark edin (örneğin, PCR4 yalnızca üst örneğin ID’sini kontrol eder, bu nedenle bu EC2’de herhangi bir enclave görüntüsü çalıştırmak bu potansiyel PCR gereksinimini karşılayacaktır).

Bu nedenle, EC2 örneğini tehlikeye atan bir saldırgan, bu korumaları atlatmak için diğer enclave görüntülerini çalıştırma yeteneğine sahip olabilir.

Her korumayı atlatmak için yeni görüntüleri nasıl değiştireceğine/oluşturacağına dair araştırma hala TODO’dur.

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin