Translated ['', 'src/pentesting-cloud/gcp-security/gcp-post-exploitation

This commit is contained in:
Translator
2026-03-04 11:29:16 +00:00
parent 6338f64420
commit 6e76c89391
2 changed files with 68 additions and 41 deletions

View File

@@ -4,7 +4,7 @@
## KMS
KMS के बारे में बुनियादी जानकारी के लिए देखें:
KMS के बारे में बुनियादी जानकारी देखें:
{{#ref}}
../gcp-services/gcp-kms-enum.md
@@ -12,11 +12,11 @@ KMS के बारे में बुनियादी जानकारी
### `cloudkms.cryptoKeyVersions.destroy`
इस अनुमति वाले attacker KMS का एक संस्करण नष्ट कर सकत है। ऐसा करने के लिए पहले आपको कुंजी को अक्षम करना होगा और फिर उसे नष्ट करना होगा:
इस अनुमति वाले attacker KMS संस्करण को नष्ट कर सकत है। ऐसा करने के लिए पहले आपको key को disable करना होगा और फिर उसे destroy करना होगा:
<details>
<summary>कुंजी संस्करण को अक्षम और नष्ट करें (Python)</summary>
<summary>Disable and destroy key version (Python)</summary>
```python
# pip install google-cloud-kms
@@ -65,24 +65,38 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version)
### KMS Ransomware
AWS में, KMS resource policy को संशोधित करके और केवल attacker के account को key के उपयोग की अनुमति देकर पूरी तरह से **steal a KMS key** करना संभव है। चूंकि ये resource policies GCP में मौजूद नहीं हैं, इसलिए यह संभव नहीं है।
AWS में KMS resource policy को संशोधित करके और केवल attackers account को key उपयोग करने की अनुमति देकर पूरी तरह **steal a KMS key** करना संभव है। चूंकि ये resource policies GCP में मौजूद नहीं हैं, यह संभव नहीं है।
हालाँकि, global KMS Ransomware करने का एक और तरीका है, जिसमें निम्नलिखित कदम शामिल होंगे:
हालाँकि, एक global KMS Ransomware करने का एक और तरीका है, ज निम्नलिखित कदमों में शामिल होगा:
- एक नया **version of the key with a key material** बनाए जिसे attacker ने import किया हो
- नया **version of the key with a key material** बनाए जिसे attacker ने import किया हो
```bash
gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY]
```
- इसे **डिफ़ॉल्ट संस्करण** के रूप में सेट करें (भविष्य में एन्क्रिप्ट किए जाने वाले डेटा के लिए)
- **पुराने डेटा को पुनः-एन्क्रिप्ट करें** जो पिछले संस्करण के साथ एन्क्रिप्ट किया गया था, नए संस्करण के साथ
- **KMS key को हटाएँ**
- अब केवल attacker ही, जिसके पास मूल key material है, एन्क्रिप्ट किए गए डेटा को डिक्रिप्ट कर सकेगा
- इसे **default version** के रूप में सेट करें (भविष्य में encrypt किए जाने वाले data के लिए)
- पहले वाले version से encrypted पुराने data को नई version से **Re-encrypt** करें
- **KMS key को Delete करें**
- अब केवल attacker, जिसके पास original key material है, ही encrypted data को decrypt कर पाएगा
#### नया संस्करण इम्पोर्ट करने और पुराने डेटा को निष्क्रिय/हटाने के चरण:
#### Cloud Storage + CMEK अनुमति मॉडल
जब Cloud Storage में ऑब्जेक्ट्स CMEK के साथ encrypted होते हैं, तो KMS को किए गए decrypt/encrypt कॉल उस प्रोजेक्ट के **Cloud Storage service agent whose email is service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)** द्वारा किए जाते हैं, न कि ऑब्जेक्ट पढ़ने वाले end user द्वारा सीधे।
इसका मतलब है कि CMEK द्वारा encrypted किसी चीज़ को पढ़ने के लिए:
- प्रोजेक्ट के cloud storage service agent के पास उपयोग किए गए KMS key पर KMS permissions होनी चाहिए (आम तौर पर `roles/cloudkms.cryptoKeyEncrypterDecrypter`)।
- यूज़र को केवल object read permissions चाहिए (उदाहरण के लिए `storage.objects.get`)। उसे KMS key पर अनुमतियों की ज़रूरत नहीं है।
इसका अर्थ है कि KMS key के साथ encrypted data पर नियंत्रण रखने के लिए प्रोजेक्ट के cloud storage service agent के लिए KMS permissions को जोड़ना/हटाना ज़रूरी है।
ध्यान दें कि Storage service agent के लिए प्रोजेक्ट-स्तरीय binding जैसे `roles/cloudkms.cryptoKeyEncrypterDecrypter` होने पर उसी प्रोजेक्ट की keys के साथ decrypt की अनुमति बनी रहेगी।
#### नई version को import करने और पुराने data को disable/delete करने के लिए चरण इस प्रकार हैं:
<details>
<summary>नया कुंजी संस्करण आयात करें और पुराना संस्करण हटाएँ</summary>
<summary>नई key version import करें और पुरानी version हटाएँ</summary>
```bash
# Encrypt something with the original key
echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt
@@ -162,7 +176,7 @@ gcloud kms keys versions destroy \
<details>
<summary>सिमेट्रिक कुंजी के साथ डेटा एन्क्रिप्ट करें (Python)</summary>
<summary>समान कुंजी के साथ डेटा एन्क्रिप्ट करें (Python)</summary>
```python
from google.cloud import kms
import base64
@@ -203,7 +217,7 @@ print('Ciphertext:', ciphertext)
<details>
<summary>असिमेट्रिक कुंजी से संदेश पर हस्ताक्षर करना (Python)</summary>
<summary>संदेश को असिमेट्रिक key से साइन करें (Python)</summary>
```python
import hashlib
from google.cloud import kms
@@ -243,7 +257,7 @@ print('Signature:', signature)
<details>
<summary>असिमेट्रिक कुंजी े साथ हस्ताक्षर सत्यापित करें (Python)</summary>
<summary>असिमेट्रिक कुंजी े सिग्नेचर सत्यापित करें (Python)</summary>
```python
from google.cloud import kms
import hashlib
@@ -271,7 +285,7 @@ verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key
print('Verified:', verified)
```
### `cloudkms.cryptoKeyVersions.restore`
यह `cloudkms.cryptoKeyVersions.restore` अनुमति किसी पहचान को Cloud KMS में पहले विनाश के लिए निर्धारित या अक्षम किए गए कुंजी संस्करण को पुनर्स्थापित करके उसे सक्रिय और उपयोग योग्य स्थिति में लौटाने की अनुमति देता है।
यह अनुमति किसी identity को उस key version को restore करने की अनुमति देती है जिसे पहले destruction के लिए शेड्यूल किया गया था या जिसे Cloud KMS में disabled किया गया था, और इसे सक्रिय उपयोग योग्य स्थिति में वापस लाती है।
```bash
gcloud kms keys versions restore <VERSION_ID> \
--key=<KEY_NAME> \
@@ -280,7 +294,7 @@ gcloud kms keys versions restore <VERSION_ID> \
--project=<PROJECT_ID>
```
### `cloudkms.cryptoKeyVersions.update`
`cloudkms.cryptoKeyVersions.update` अनुमति किसी पहचान को Cloud KMS में किसी विशिष्ट key version के attributes या state को संशोधित करने की क्षमत देत है — उदाहरण के लिए उसे सक्षम या अक्षम करना।
`cloudkms.cryptoKeyVersions.update` permission किसी identity को Cloud KMS में किसी specific key version के attributes या state को modify करने की अनुमति देत है — उदाहरण के लिए उसे enable या disable करने के द्वारा।
```bash
# Disable key
gcloud kms keys versions disable <VERSION_ID> \

View File

@@ -4,40 +4,53 @@
## KMS
[**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) **क्रिप्टोग्राफिक कुंजियों** के लिए एक सुरक्षित भंडारण के रूप में कार्य करता है, जो **संवेदनशील डेटा को एन्क्रिप्ट और डिक्रिप्ट करने** जैसी प्रक्रियाओं के लिए आवश्यक हैं। ये कुंजियाँ कुंजी रिंग के भीतर व्यवस्थित की जाती हैं, जिससे संरचित प्रबंधन संभव होता है। इसके अलावा, पहुँच नियंत्रण को सावधानीपूर्वक कॉन्फ़िगर किया जा सकता है, या तो व्यक्तिगत कुंजी स्तर पर या पूरे कुंजी रिंग के लिए, यह सुनिश्चित करते हुए कि अनुमतियाँ सुरक्षा आवश्यकताओं के साथ सटीक रूप से संरेखितं।
The [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) एक सुरक्षित भंडारण के रूप में कार्य करता है जो **क्रिप्टोग्राफिक कुंजियों** के लिए है, जो कि संवेदनशील डेटा को **एन्क्रिप्ट और डक्रिप्ट** करने जैसे संचालन के लिए आवश्यक हैं। ये कुंजियाँ key rings के भीतर व्यवस्थित की जाती हैं, जिससे संरचित प्रबंधन संभव होता है। इसके अलावा, access control को बारीकी से कॉन्फ़िगर किया जा सकता है — चाहे वह व्यक्तिगत key स्तर पर हो या पूरे key ring के लिए — ताकि permissions सुरक्षा आवश्यकताओं के अनुरूप सटीक रूप से सेटं।
KMS कुंजी रिंग **डिफ़ॉल्ट रूप से वैश्विक** के रूप में बना जात हैं, जिसका अर्थ है कि उस कुंजी रिंग के भीतर की कुंजियाँ किसी भी क्षेत्र से सुलभ हैं। हालाकि, **विशिष्ट क्षेत्रों** में विशिष्ट कुंजी रिंग बनाना संभव है।
KMS key rings डिफ़ॉल्ट रूप से **global** के रूप में बना जात हैं, जिसका मतलब है कि उस key ring के अंदर की कुंजियाँ किसी भी region से एक्सेस की जा सकती हैं। हालाकि, विशिष्ट regions में specific key rings बनाना संभव है।
### कुंजी सुरक्षा स्तर
### Key Protection Level
- **सॉफ़्टवेयर कुंजियाँ**: सॉफ़्टवेयर कुंजियाँ **KMS द्वारा पूरी तरह से सॉफ़्टवेयर में बनाई और प्रबंधित की जाती हैं**। ये कुंजियाँ **किसी भी हार्डवेयर सुरक्षा मॉड्यूल (HSM)** द्वारा सरक्षित नहीं होती हैं और **परीक्षण और विकास उद्देश्यों** के लिए उपयोग क जा सकत है। सॉफ़्टवेयर कुंजियाँ **उत्पादन** उपयोग के लिए अनुशंसित नहीं हैं क्योंकि ये कम सुरक्षा प्रदान करती हैं और हमलों के प्रति संवेदनशील होती हैं।
- **क्लाउड-होस्टेड कुंजियाँ**: क्लाउड-होस्टेड कुंजियाँ **KMS द्वारा क्लाउड में** एक अत्यधिक उपलब्ध और विश्वसनीय बुनियादी ढाँचे का उपयोग करके बनाई और प्रबंधित की जाती हैं। ये कुंजियाँ **HSMs द्वारा सरक्षित** होती हैं, लेकिन HSMs **किसी विशेष ग्राहक के लिए समर्पित नहीं होते**। क्लाउड-होस्टेड कुंजियाँ अधिकांश उत्पादन उपयोग मामलों के लिए उपयुक्त हैं।
- **बाहरी कुंजियाँ**: बाहरी कुंजियाँ **KMS के बाहर बनाई और प्रबंधित की जाती हैं**, और क्रिप्टोग्राफिक संचालन में उपयोग के लिए KMS में आयात की जाती हैं। बाहरी कुंजियाँ **ग्राहक की पसंद के अनुसार हार्डवेयर सुरक्षा मॉड्यूल (HSM) या सॉफ़्टवेयर पुस्तकालय में संग्रहीत की जा सकती हैं**
- **Software keys**: सॉफ़्टवेयर कुंजियाँ KMS द्वारा पूरी तरह सॉफ़्टवेयर में बनाई और प्रबंधित की जाती हैं। ये कुंजियाँ किसी भी hardware security module (HSM) द्वारा सरक्षित नहीं होतीं और इन्हें परीक्षण और विकास के उद्देश्यों के लिए उपयोग किया जा सकत है। production उपयोग के लिए सॉफ़्टवेयर कुंजियाँ अनुशंसित नहीं हैं क्योंकि ये कम सुरक्षा प्रदान करती हैं और हमलों के प्रति संवेदनशील होती हैं।
- **Cloud-hosted keys**: Cloud-hosted कुंजियाँ KMS द्वारा क्लाउड में एक उच्च उपलब्ध और विश्वसनीय इंफ्रास्ट्रक्चर का उपयोग करके बनाई और प्रबंधित की जाती हैं। ये कुंजियाँ HSMs द्वारा सरक्षित होती हैं, लेकिन ये HSMs किसी विशिष्ट ग्राहक के लिए समर्पित नहीं होते। Cloud-hosted कुंजियाँ अधिकांश production उपयोग मामलों के लिए उपयुक्त हैं।
- **External keys**: External कुंजियाँ KMS के बाहर बनाई और प्रबंधित की जाती हैं, और क्रिप्टोग्राफिक ऑपरेशनों के लिए KMS में इम्पोर्ट की जाती हैं। External कुंजियाँ ग्राहक की प्राथमिकता के अनुसार hardware security module (HSM) या किसी सॉफ़्टवेयर लाइब्रेरी में संग्रहीत की जा सकती हैं।
### कुंजी के उद्देश्य
### Key Purposes
- **समानांतर एन्क्रिप्शन/डिक्रिप्शन**: **एकल कुंजी का उपयोग करके डेटा को एन्क्रिप्ट और डिक्रिप्ट करने** के लिए उपयोग किया जाता है। समानांतर कुंजियाँ बड़े डेटा वॉल्यूम को एन्क्रिप्ट और डिक्रिप्ट करने के लिए तेज और कुशल होत हैं।
- **समर्थित**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt)
- **असमान्य हस्ताक्षर**: दो पक्षों के बीच सुरक्षित संचार के लिए कुंजी साझा किए बिना उपयोग किया जाता है। असमान्य कुंजियाँ एक जोड़ी में आत हैं, जिमें एक **सार्वजनिक कुंजी और एक निजी कुंजी** होती है। सार्वजनिक कुंजी दूसरों के साथ साझा की जाती है, जबकि निजी कुंजी को गुप्त रख जात है।
- **समर्थित:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey)
- **असमान्य डिक्रिप्शन**: संदेश या डेटा की प्रामाणिकता को सत्यापित करने के लिए उपयोग किया जाता है। एक डिजिटल हस्ताक्षर एक निजी कुंजी का उपयोग करके बनाया जाता है और संबंधित सार्वजनिक कुंजी का उपयोग करके सत्यापित किया जा सकता है।
- **समर्थित:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey)
- **MAC हस्ताक्षर**: **एक गुप्त कुंजी का उपयोग करके संदेश प्रमाणीकरण कोड (MAC) बनाकर डेटा की अखंडता और प्रामाणिकता सुनिश्चित करने** के लिए उपयोग किया जाता है। HMAC नेटवर्क प्रोटोकॉल और सॉफ़्टवेयर अनुप्रयोगों में संदेश प्रमाणीकरण के लिए सामान्यतः उपयोग किया जाता है।
- **समर्थित:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify)
- **Symmetric encryption/decryption**: एक ही कुंजी का उपयोग दोनों ऑपरेशनों के लिए डेटा को एन्क्रिप्ट और डक्रिप्ट करने के लिए किया जाता है। Symmetric keys बड़े पैमाने पर डेटा को एन्क्रिप्ट और डक्रिप्ट करने के लिए तेज और प्रभावी होत हैं।
- **Supported**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt)
- **Asymmetric Signing**: दो पक्षों के बीच सुरक्षित संचार के लिए उपयोग किया जाता है बिना कुंजी साझा किए। Asymmetric keys जोड़ी में आत हैं, जिमें एक **public key और एक private key** शामिल होती है। public key दूसरों के साथ साझा की जाती है, जबकि private key गोपनीय रख जात है।
- **Supported:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey)
- **Asymmetric Decryption**: संदेश या डेटा की प्रामाणिकता सत्यापित करने के लिए उपयोग किया जाता है। एक डिजिटल सिग्नेचर private key का उपयोग करके बनाया जाता है और संबंधित public key का उपयोग करके सत्यापित किया जा सकता है।
- **Supported:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey)
- **MAC Signing**: एक secret key का उपयोग करके message authentication code (MAC) बनाकर डेटा की अखंडता और प्रामाणिकता सुनिश्चित करने के लिए उपयोग किया जाता है। HMAC आम तौर पर नेटवर्क प्रोटोकॉल और सॉफ़्टवेयर एप्लिकेशन में संदेश प्रमाणीकरण के लिए उपयोग किया जाता है।
- **Supported:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify)
### रोटेशन अवधि और विनाश के लिए कार्यक्रमित अवधि
### Rotation Period & Programmed for destruction period
**डिफ़ॉल्ट रूप से**, प्रत्येक **90 दिन** लेकिन इसे **आसान** और **पूर्ण रूप से अनुकूलित** किया जा सकता है।
डिफ़ॉल्ट रूप से, हर **90 days** पर होता है, लेकिन इसे **आसानी से** और **पूरी तरह से अनुकूलित** किया जा सकता है।
"विनाश के लिए कार्यक्रमित" अवधि वह **समय है ज उपयोगकर्ता कुंजी को हटाने के लिए कहता है** और जब तक कुंजी **हटाई नहीं जाती**। इसे कुंजी बनाए जाने के बाद नहीं बदला जा सकता (डिफ़ॉल्ट 1 दिन)।
"Programmed for destruction" अवधि वह समय है ज उपयोगकर्ता ने कुंजी को हटाने के लिए अनुरोध किए जाने के बाद से कुंजी के वास्तविक रूप से हटाए जाने तक लगता है। इसे कुंजी बनाए जाने के बाद बदला नहीं जा सकता (डिफ़ॉल्ट 1 day)।
### प्राथमिक संस्करण
### Primary Version
प्रत्येक KMS कुंजी कई संस्करण हो सकते हैं, नमें से एक को **डिफ़ॉल्ट** होना चाहिए, यह वह होगा जिसका उपयोग तब किया जाएगा जब **KMS कुंजी के साथ बातचीत करते समय कोई संस्करण निर्दिष्ट नहीं किया गया हो**
प्रत्येक KMS key कई संस्करण हो सकते हैं, जिनमें से एक को **default** के रूप में सेट करना अनिवार्य होता है; यह वह संस्करण होगा जिसका उपयोग तब किया जाएगा जब KMS key के साथ इंटरैक्ट करते समय कोई **version निर्दिष्ट न किया गया हो**
### गणना
### CMEK permission model
**कुंजियोंूचीबद्ध करने** के लिए अनुमतियाँ होने पर, आप उन्हें इस प्रकार एक्सेसकते हैं:
जब Cloud Storage में ऑब्जेक्ट्स को CMEKाथ एन्क्रिप्ट किया जाता है, तो KMS को decrypt/encrypt कॉल्स प्रोजेक्ट के Cloud Storage service agent द्वारा किए जाते हैं (जिसका ईमेल service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com), निीधे अंतिम उपयोगकर्ता द्वारा पढ़ने पर।
इसका मतलब है कि किसी CMEK द्वारा एन्क्रिप्ट की गई चीज़ को पढ़ने के लिए:
- प्रोजेक्ट का cloud storage service agent को उपयोग की गई KMS कुंजी पर KMS permissions होने चाहिए (आम तौर पर `roles/cloudkms.cryptoKeyEncrypterDecrypter`)।
- उपयोगकर्ता को केवल object पढ़ने की permissions चाहिए (उदाहरण के लिए `storage.objects.get`)। उसे KMS कुंजी पर permissions की आवश्यकता नहीं होती।
इसका अर्थ यह भी है कि एन्क्रिप्टेड डेटा पर KMS कुंजी के माध्यम से नियंत्रित पहुँच के लिए प्रोजेक्ट के cloud storage service agent के KMS permissions को जोड़ना/हटाना आवश्यक होगा।
ध्यान दें कि Storage service agent के लिए project-level binding जैसे `roles/cloudkms.cryptoKeyEncrypterDecrypter` होने पर भी उसी प्रोजेक्ट की कुंजियों के साथ decrypt की अनुमति बनी रहेगी।
### Enumeration
यदि आपके पास **permissions to list the keys** हैं, तो आप उन्हें इस तरह एक्सेस कर सकते हैं:
```bash
# List the global keyrings available
gcloud kms keyrings list --location global
@@ -61,13 +74,13 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \
--keyring [KEYRING] \
--location global
```
### विशेषाधिकार वृद्धि
### Privilege Escalation
{{#ref}}
../gcp-privilege-escalation/gcp-kms-privesc.md
{{#endref}}
### पोस्ट एक्सप्लोइटेशन
### Post Exploitation
{{#ref}}
../gcp-post-exploitation/gcp-kms-post-exploitation.md