AWS - Nitro Enum

जानें AWS हैकिंग को शून्य से हीरो तक htARTE (HackTricks AWS Red Team Expert) के साथ!

HackTricks का समर्थन करने के अन्य तरीके:

मूल जानकारी

AWS नाइट्रो एक सुधारक तकनीकों का समूह है जो AWS EC2 इंस्टेंस के लिए निम्नलिखित प्लेटफ़ॉर्म बनाता है। अमेज़न द्वारा पेश किया गया सुरक्षा, प्रदर्शन, और विश्वसनीयता को बढ़ाने के लिए, नाइट्रो अपनाता है कस्टम हार्डवेयर कॉम्पोनेंट्स और एक हल्का हाइपरवाइज़र का उपयोग। यह धारणा करता है कि धारावाहिकीकरण की बहुत सी पारंपरिक कार्यक्षमता को समर्पित हार्डवेयर और सॉफ़्टवेयर में कम करके हमले की सतह को कम करता है और संसाधन कुशलता में सुधार करता है। वर्चुअलाइज़ेशन कार्यों को अलग करके, नाइट्रो EC2 इंस्टेंस को लगभग बेयर-मेटल प्रदर्शन प्रदान करने देता है, जिसे संसाधन-उत्सर्जन अनुप्रयोगों के लिए विशेष रूप से लाभकारी बनाता है। इसके अतिरिक्त, नाइट्रो सुरक्षा चिप विशेष रूप से सुनिश्चित करता है कि हार्डवेयर और फर्मवेयर की सुरक्षा को, अधिक सुदृढ़ बनाते हैं।

नाइट्रो एन्क्लेव्स

AWS नाइट्रो एन्क्लेव्स एक सुरक्षित, अलग कंप्यूट परिवेश प्रदान करता है अमेज़न EC2 इंस्टेंस के भीतर, विशेष रूप से उच्च संवेदनशील डेटा को प्रसंस्करण के लिए डिज़ाइन किया गया है। AWS नाइट्रो सिस्टम का उपयोग करते हुए, ये एन्क्लेव्स मजबूत अलगाव और सुरक्षा सुनिश्चित करते हैं, जो गोपनीय जानकारी जैसे PII या वित्तीय रिकॉर्ड्स का संचालन करने के लिए आदर्श है। इनमें एक न्यूनतम परिवेश शामिल है, डेटा का अवसाद करने का जोखिम काफी कम कर देता है। इसके अतिरिक्त, नाइट्रो एन्क्लेव्स क्रिप्टोग्राफिक अटेस्टेशन का समर्थन करते हैं, जो उपयोगकर्ताओं को सत्यापित करने की अनुमति देता है कि केवल अधिकृत कोड चल रहा है, जो सख्त अनुपालन और डेटा संरक्षण मानकों को बनाए रखने के लिए महत्वपूर्ण है।

नाइट्रो एन्क्लेव छवियाँ EC2 इंस्टेंस के अंदर से चलाई जाती हैं और आप AWS वेब कंसोल से नहीं देख सकते कि क्या एक EC2 इंस्टेंस नाइट्रो एन्क्लेव में छवियाँ चला रहा है या नहीं।

नाइट्रो एन्क्लेव CLI स्थापना

सभी निर्देशों का पालन करें दस्तावेज़ से। हालांकि, ये सबसे महत्वपूर्ण हैं:

# 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

नाइट्रो एन्क्लेव इमेजेस

नाइट्रो एन्क्लेव में चलाने के लिए छवियाँ डॉकर इमेजेस पर आधारित होती हैं, इसलिए आप अपनी नाइट्रो एन्क्लेव इमेजेस डॉकर इमेजेस से बना सकते हैं जैसे:

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

एक छवि चलाएं

जैसा कि दस्तावेज़ीकरण के अनुसार, एक एन्क्लेव छवि को चलाने के लिए आपको इसे eif फ़ाइल के आकार का कम से कम 4 गुणा मेमोरी सौंपनी होगी। इसे देने के लिए डिफ़ॉल्ट संसाधन कॉन्फ़िगर करना संभव है फ़ाइल में।

/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}

एन्क्लेव्स को समाप्त करें

यदि किसी हमलावर ने एसी 2 इंस्टेंस को कंप्रमाइज कर लिया है, तो उसे डिफ़ॉल्ट रूप से उनके अंदर शैल मिलने में सक्षम नहीं होगा, लेकिन उसे उन्हें समाप्त करने की अनुमति होगी:

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

Vsock

एन्क्लेव चल रही छवि के साथ संवाद करने का एकमात्र तरीका वीसॉक्स का उपयोग करना है।

वर्चुअल सॉकेट (वीसॉक्स) एक सॉकेट परिवार है जो लिनक्स में विशेष रूप से डिज़ाइन किया गया है ताकि वर्चुअल मशीनें (VMs) और उनके हाइपरवाइज़र्स या VMs खुद के बीच संवाद को सुविधाजनक बनाए। Vsock एफिशिएंट, द्विदिशीय संवाद को संभालने के लिए संभावना प्रदान करता है बिना मेज़बान के नेटवर्किंग स्टैक पर निर्भरता। इससे VMs को नेटवर्क कॉन्फ़िगरेशन के बिना भी संवाद करने की संभावना होती है, 32-बिट संदर्भ आईडी (CID) और पोर्ट नंबर का उपयोग करके कनेक्शन की पहचान और प्रबंधन करने के लिए। Vsock API ने स्ट्रीम और डेटाग्राम सॉकेट प्रकार दोनों का समर्थन किया है, जो TCP और UDP के लिए समान है, वर्चुअल वातावरण में उपयोगकर्ता स्तरीय एप्लिकेशनों के लिए एक बहुमुखी उपकरण प्रदान करता है।

इसलिए, एक vsock पता इस तरह दिखता है: <CID>:<Port>

एन्क्लेव चल रही छवियों के CID ढूंढने के लिए आप बस निम्नलिखित cmd को निष्पादित कर सकते हैं और 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 सर्वर/सुनने वाला

यहाँ कुछ उदाहरण हैं:

सरल पायथन सुनने वाला

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