# Az - Storage Accounts & Blobs {{#include ../../../banners/hacktricks-training.md}} ## Basic Information Azure Storage Accounts Microsoft Azure में मौलिक सेवाएँ हैं जो विभिन्न डेटा प्रकारों के लिए स्केलेबल, सुरक्षित और अत्यधिक उपलब्ध क्लाउड **स्टोरेज प्रदान करती हैं**, जिसमें ब्लॉब (बाइनरी बड़े ऑब्जेक्ट), फ़ाइलें, कतारें और तालिकाएँ शामिल हैं। ये विभिन्न स्टोरेज सेवाओं को एकल नामस्थान के तहत एक साथ समूहित करने के लिए कंटेनर के रूप में कार्य करते हैं ताकि प्रबंधन आसान हो सके। **मुख्य कॉन्फ़िगरेशन विकल्प**: - प्रत्येक स्टोरेज खाता का **सभी Azure में एक अद्वितीय नाम होना चाहिए**। - प्रत्येक स्टोरेज खाता एक **क्षेत्र** या Azure विस्तारित क्षेत्र में तैनात किया जाता है। - बेहतर प्रदर्शन के लिए स्टोरेज खाते का **प्रीमियम** संस्करण चुनना संभव है। - रैक, ड्राइव और डेटा सेंटर **विफलताओं** के खिलाफ सुरक्षा के लिए **4 प्रकार की पुनरावृत्ति** में से चुनना संभव है। **सुरक्षा कॉन्फ़िगरेशन विकल्प**: - **REST API संचालन के लिए सुरक्षित ट्रांसफर की आवश्यकता**: स्टोरेज के साथ किसी भी संचार में TLS की आवश्यकता होती है। - **व्यक्तिगत कंटेनरों पर गुमनाम पहुंच सक्षम करने की अनुमति**: यदि नहीं, तो भविष्य में गुमनाम पहुंच सक्षम करना संभव नहीं होगा। - **स्टोरेज खाता कुंजी पहुंच सक्षम करें**: यदि नहीं, तो साझा कुंजी के साथ पहुंच वर्जित होगी। - **न्यूनतम TLS संस्करण**। - **कॉपी संचालन के लिए अनुमत दायरा**: किसी भी स्टोरेज खाते से, उसी Entra टेनेन्ट से किसी भी स्टोरेज खाते से या समान वर्चुअल नेटवर्क में निजी एंडपॉइंट वाले स्टोरेज खाते से अनुमति दें। **Blob Storage विकल्प**: - **क्रॉस-टेनेन्ट पुनरावृत्ति की अनुमति दें**। - **एक्सेस स्तर**: हॉट (बार-बार एक्सेस किया गया डेटा), कूल और कोल्ड (कभी-कभी एक्सेस किया गया डेटा)। **नेटवर्किंग विकल्प**: - **नेटवर्क एक्सेस**: - सभी नेटवर्क से अनुमति दें। - चयनित वर्चुअल नेटवर्क और IP पते से अनुमति दें। - सार्वजनिक पहुंच को अक्षम करें और निजी पहुंच का उपयोग करें। - **निजी एंडपॉइंट**: यह वर्चुअल नेटवर्क से स्टोरेज खाते के लिए एक निजी कनेक्शन की अनुमति देता है। **डेटा सुरक्षा विकल्प**: - **कंटेनरों के लिए समय-निर्धारित पुनर्स्थापना**: यह कंटेनरों को पहले की स्थिति में पुनर्स्थापित करने की अनुमति देता है। - इसके लिए संस्करणन, परिवर्तन फ़ीड, और ब्लॉब सॉफ़्ट डिलीट सक्षम होना आवश्यक है। - **ब्लॉब के लिए सॉफ़्ट डिलीट सक्षम करें**: यह हटाए गए ब्लॉब (यहां तक कि ओवरराइट किए गए) के लिए दिनों में एक संरक्षण अवधि सक्षम करता है। - **कंटेनरों के लिए सॉफ़्ट डिलीट सक्षम करें**: यह हटाए गए कंटेनरों के लिए दिनों में एक संरक्षण अवधि सक्षम करता है। - **फ़ाइल शेयरों के लिए सॉफ़्ट डिलीट सक्षम करें**: यह हटाए गए फ़ाइल शेयरों के लिए दिनों में एक संरक्षण अवधि सक्षम करता है। - **ब्लॉब के लिए संस्करणन सक्षम करें**: अपने ब्लॉब के पिछले संस्करणों को बनाए रखें। - **ब्लॉब परिवर्तन फ़ीड सक्षम करें**: ब्लॉब में निर्माण, संशोधन, और हटाने के परिवर्तनों के लॉग रखें। - **संस्करण-स्तरीय अपरिवर्तनीयता समर्थन सक्षम करें**: यह आपको खाता स्तर पर समय-आधारित संरक्षण नीति सेट करने की अनुमति देता है जो सभी ब्लॉब संस्करणों पर लागू होगी। - संस्करण-स्तरीय अपरिवर्तनीयता समर्थन और कंटेनरों के लिए समय-निर्धारित पुनर्स्थापना को एक साथ सक्षम नहीं किया जा सकता है। **एन्क्रिप्शन कॉन्फ़िगरेशन विकल्प**: - **एन्क्रिप्शन प्रकार**: Microsoft-प्रबंधित कुंजी (MMK) या ग्राहक-प्रबंधित कुंजी (CMK) का उपयोग करना संभव है। - **इन्फ्रास्ट्रक्चर एन्क्रिप्शन सक्षम करें**: डेटा को "अधिक सुरक्षा के लिए" डबल एन्क्रिप्ट करने की अनुमति देता है। ### Storage endpoints
Storage ServiceEndpoint
Blob storagehttps://.blob.core.windows.net

https://.blob.core.windows.net/?restype=container&comp=list
Data Lake Storagehttps://.dfs.core.windows.net
Azure Fileshttps://.file.core.windows.net
Queue storagehttps://.queue.core.windows.net
Table storagehttps://.table.core.windows.net
### Public Exposure यदि "Allow Blob public access" **सक्षम** है (डिफ़ॉल्ट रूप से अक्षम), तो कंटेनर बनाते समय यह संभव है: - **ब्लॉब पढ़ने के लिए सार्वजनिक पहुंच दें** (आपको नाम जानना होगा)। - **कंटेनर ब्लॉब की सूची बनाएं** और **उन्हें पढ़ें**। - इसे पूरी तरह से **निजी** बनाएं।
### Connect to Storage यदि आप कोई **स्टोरेज** पाते हैं जिससे आप कनेक्ट कर सकते हैं, तो आप ऐसा करने के लिए [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) उपकरण का उपयोग कर सकते हैं। ## Access to Storage ### RBAC स्टोरेज खातों तक पहुंच के लिए **RBAC भूमिकाओं** के साथ Entra ID प्रिंसिपल का उपयोग करना संभव है और यह अनुशंसित तरीका है। ### Access Keys स्टोरेज खातों में एक्सेस कुंजी होती हैं जिनका उपयोग इसे एक्सेस करने के लिए किया जा सकता है। यह **स्टोरेज खाते तक पूर्ण पहुंच प्रदान करता है।**
### **Shared Keys & Lite Shared Keys** यह संभव है कि [**Shared Keys उत्पन्न करें**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) जो एक्सेस कुंजियों के साथ हस्ताक्षरित होते हैं ताकि एक हस्ताक्षरित URL के माध्यम से कुछ संसाधनों तक पहुंच को अधिकृत किया जा सके। > [!NOTE] > ध्यान दें कि `CanonicalizedResource` भाग स्टोरेज सेवाओं के संसाधन (URI) का प्रतिनिधित्व करता है। और यदि URL में कोई भाग एन्कोड किया गया है, तो इसे `CanonicalizedResource` के अंदर भी एन्कोड किया जाना चाहिए। > [!NOTE] > यह **डिफ़ॉल्ट रूप से `az` cli द्वारा उपयोग किया जाता है** ताकि अनुरोधों को प्रमाणित किया जा सके। इसे Entra ID प्रिंसिपल क्रेडेंशियल्स का उपयोग करने के लिए `--auth-mode login` पैरामीटर निर्दिष्ट करें। - यह **ब्लॉब, कतार और फ़ाइल सेवाओं** के लिए एक साझा कुंजी उत्पन्न करना संभव है, निम्नलिखित जानकारी पर हस्ताक्षर करके: ```bash StringToSign = VERB + "\n" + Content-Encoding + "\n" + Content-Language + "\n" + Content-Length + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + If-Modified-Since + "\n" + If-Match + "\n" + If-None-Match + "\n" + If-Unmodified-Since + "\n" + Range + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` - यह संभव है कि **table services** के लिए एक **shared key** उत्पन्न किया जाए निम्नलिखित जानकारी पर हस्ताक्षर करके: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedResource; ``` - यह **ब्लॉब, कतार और फ़ाइल सेवाओं** के लिए एक लाइट साझा कुंजी उत्पन्न करना संभव है, निम्नलिखित जानकारी पर हस्ताक्षर करके: ```bash StringToSign = VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedHeaders + CanonicalizedResource; ``` - यह संभव है कि **टेबल सेवाओं के लिए एक लाइट साझा कुंजी** उत्पन्न की जाए, निम्नलिखित जानकारी पर हस्ताक्षर करके: ```bash StringToSign = Date + "\n" CanonicalizedResource ``` फिर, कुंजी का उपयोग करने के लिए, इसे Authorization हेडर में निम्नलिखित सिंटैक्स का पालन करते हुए किया जा सकता है: ```bash Authorization="[SharedKey|SharedKeyLite] :" #e.g. Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08= PUT http://myaccount/mycontainer?restype=container&timeout=30 HTTP/1.1 x-ms-version: 2014-02-14 x-ms-date: Fri, 26 Jun 2015 23:39:12 GMT Authorization: SharedKey myaccount:ctzMq410TV3wS7upTBcunJTDLEJwMAZuFPfr0mrrA08= Content-Length: 0 ``` ### **Shared Access Signature** (SAS) Shared Access Signatures (SAS) सुरक्षित, समय-सीमित URLs हैं जो **Azure Storage खाते में संसाधनों तक पहुँचने के लिए विशिष्ट अनुमतियाँ प्रदान करती हैं** बिना खाते की पहुँच कुंजियों को उजागर किए। जबकि पहुँच कुंजियाँ सभी संसाधनों के लिए पूर्ण प्रशासनिक पहुँच प्रदान करती हैं, SAS अनुमतियों (जैसे पढ़ना या लिखना) को निर्दिष्ट करके और समाप्ति समय को परिभाषित करके सूक्ष्म नियंत्रण की अनुमति देती है। #### SAS प्रकार - **User delegation SAS**: यह एक **Entra ID principal** से बनाया जाता है जो SAS पर हस्ताक्षर करेगा और उपयोगकर्ता से SAS को अनुमतियाँ सौंपेगा। इसका उपयोग केवल **blob और data lake storage** के साथ किया जा सकता है ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). सभी उत्पन्न उपयोगकर्ता प्रतिनिधि SAS को **रद्द** करना संभव है। - भले ही "अधिक" अनुमतियों के साथ एक प्रतिनिधित्व SAS उत्पन्न करना संभव है जो उपयोगकर्ता के पास हैं। हालाँकि, यदि प्रमुख के पास वे नहीं हैं, तो यह काम नहीं करेगा (कोई प्रिवेस्क नहीं)। - **Service SAS**: यह एक स्टोरेज खाता **access keys** में से एक का उपयोग करके हस्ताक्षरित होता है। इसका उपयोग एकल स्टोरेज सेवा में विशिष्ट संसाधनों तक पहुँच प्रदान करने के लिए किया जा सकता है। यदि कुंजी नवीनीकरण की जाती है, तो SAS काम करना बंद कर देगा। - **Account SAS**: यह भी एक स्टोरेज खाता **access keys** में से एक के साथ हस्ताक्षरित होता है। यह एक स्टोरेज खाता सेवाओं (Blob, Queue, Table, File) में संसाधनों तक पहुँच प्रदान करता है और सेवा-स्तरीय संचालन को शामिल कर सकता है। एक SAS URL जो एक **access key** द्वारा हस्ताक्षरित होता है, ऐसा दिखता है: - `https://.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D` एक SAS URL जो **user delegation** के रूप में हस्ताक्षरित होता है, ऐसा दिखता है: - `https://.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D` कुछ **http params** पर ध्यान दें: - **`se`** पैरामीटर SAS की **समाप्ति तिथि** को इंगित करता है - **`sp`** पैरामीटर SAS की **अनुमतियों** को इंगित करता है - **`sig`** SAS को मान्य करने वाला **हस्ताक्षर** है #### SAS अनुमतियाँ SAS उत्पन्न करते समय यह आवश्यक है कि यह निर्दिष्ट किया जाए कि यह कौन सी अनुमतियाँ प्रदान करेगा। जिस वस्तु पर SAS उत्पन्न किया जा रहा है, उसके आधार पर विभिन्न अनुमतियाँ शामिल की जा सकती हैं। उदाहरण के लिए: - (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete ## SFTP Support for Azure Blob Storage Azure Blob Storage अब SSH File Transfer Protocol (SFTP) का समर्थन करता है, जो सुरक्षित फ़ाइल स्थानांतरण और प्रबंधन को सीधे Blob Storage में सक्षम बनाता है बिना कस्टम समाधानों या तृतीय-पक्ष उत्पादों की आवश्यकता के। ### मुख्य विशेषताएँ - प्रोटोकॉल समर्थन: SFTP उन Blob Storage खातों के साथ काम करता है जो हायरार्किकल नेमस्पेस (HNS) के साथ कॉन्फ़िगर किए गए हैं। यह ब्लॉब्स को निर्देशिकाओं और उपनिर्देशिकाओं में व्यवस्थित करता है ताकि नेविगेशन आसान हो सके। - सुरक्षा: SFTP प्रमाणीकरण के लिए स्थानीय उपयोगकर्ता पहचान का उपयोग करता है और RBAC या ABAC के साथ एकीकृत नहीं होता है। प्रत्येक स्थानीय उपयोगकर्ता प्रमाणीकरण कर सकता है: - Azure-जनित पासवर्ड - सार्वजनिक-निजी SSH कुंजी जोड़े - सूक्ष्म अनुमतियाँ: स्थानीय उपयोगकर्ताओं को 100 कंटेनरों तक पढ़ने, लिखने, हटाने और सूचीबद्ध करने जैसी अनुमतियाँ सौंपी जा सकती हैं। - नेटवर्किंग विचार: SFTP कनेक्शन पोर्ट 22 के माध्यम से बनाए जाते हैं। Azure SFTP ट्रैफ़िक को सुरक्षित करने के लिए फ़ायरवॉल, निजी एंडपॉइंट या वर्चुअल नेटवर्क जैसी नेटवर्क कॉन्फ़िगरेशन का समर्थन करता है। ### सेटअप आवश्यकताएँ - हायरार्किकल नेमस्पेस: स्टोरेज खाता बनाते समय HNS सक्षम होना चाहिए। - समर्थित एन्क्रिप्शन: Microsoft Security Development Lifecycle (SDL) द्वारा अनुमोदित क्रिप्टोग्राफिक एल्गोरिदम की आवश्यकता होती है (जैसे, rsa-sha2-256, ecdsa-sha2-nistp256)। - SFTP कॉन्फ़िगरेशन: - स्टोरेज खाते पर SFTP सक्षम करें। - उचित अनुमतियों के साथ स्थानीय उपयोगकर्ता पहचान बनाएं। - उपयोगकर्ताओं के लिए होम निर्देशिकाएँ कॉन्फ़िगर करें ताकि वे कंटेनर के भीतर अपनी प्रारंभिक स्थिति को परिभाषित कर सकें। ### अनुमतियाँ | अनुमति | प्रतीक | विवरण | | ---------------------- | ------ | ------------------------------------ | | **पढ़ें** | `r` | फ़ाइल सामग्री पढ़ें। | | **लिखें** | `w` | फ़ाइलें अपलोड करें और निर्देशिकाएँ बनाएं। | | **सूची** | `l` | निर्देशिकाओं की सामग्री सूचीबद्ध करें। | | **हटाएँ** | `d` | फ़ाइलें या निर्देशिकाएँ हटाएँ। | | **बनाएँ** | `c` | फ़ाइलें या निर्देशिकाएँ बनाएं। | | **स्वामित्व संशोधित करें** | `o` | स्वामित्व उपयोगकर्ता या समूह बदलें। | | **अनुमतियाँ संशोधित करें** | `p` | फ़ाइलों या निर्देशिकाओं पर ACLs बदलें। | ## Enumeration {{#tabs }} {{#tab name="az cli" }} ```bash # Get storage accounts az storage account list #Get the account name from here # BLOB STORAGE ## List containers az storage container list --account-name ## Check if public access is allowed az storage container show-permission \ --account-name \ -n ## Make a container public az storage container set-permission \ --public-access container \ --account-name \ -n ## List blobs in a container az storage blob list \ --container-name \ --account-name ## Download blob az storage blob download \ --account-name \ --container-name \ --name \ --file ## Create container policy az storage container policy create \ --account-name mystorageaccount \ --container-name mycontainer \ --name fullaccesspolicy \ --permissions racwdl \ --start 2023-11-22T00:00Z \ --expiry 2024-11-22T00:00Z # QUEUE az storage queue list --account-name az storage message peek --account-name --queue-name # ACCESS KEYS az storage account keys list --account-name ## Check key policies (expiration time?) az storage account show -n --query "{KeyPolicy:keyPolicy}" ## Once having the key, it's possible to use it with the argument --account-key ## Enum blobs with account key az storage blob list \ --container-name \ --account-name \ --account-key "ZrF40pkVKvWPUr[...]v7LZw==" ## Download a file using an account key az storage blob download \ --account-name \ --account-key "ZrF40pkVKvWPUr[...]v7LZw==" \ --container-name \ --name \ --file ## Upload a file using an account key az storage blob upload \ --account-name \ --account-key "ZrF40pkVKvWPUr[...]v7LZw==" \ --container-name \ --file # SAS ## List access policies az storage policy list \ --account-name \ --container-name ## Generate SAS with all permissions using an access key az storage generate-sas \ --permissions acdefilmrtwxy \ --expiry 2024-12-31T23:59:00Z \ --account-name \ -n ## Generate SAS with all permissions using via user delegation az storage generate-sas \ --permissions acdefilmrtwxy \ --expiry 2024-12-31T23:59:00Z \ --account-name \ --as-user --auth-mode login \ -n ## Generate account SAS az storage account generate-sas \ --expiry 2024-12-31T23:59:00Z \ --account-name \ --services qt \ --resource-types sco \ --permissions acdfilrtuwxy ## Use the returned SAS key with the param --sas-token ## e.g. az storage blob show \ --account-name \ --container-name \ --sas-token 'se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D' \ --name 'asd.txt' #Local-Users ## List users az storage account local-user list \ --account-name \ --resource-group ## Get user az storage account local-user show \ --account-name \ --resource-group \ --name ## List keys az storage account local-user list \ --account-name \ --resource-group ``` {{#endtab }} {{#tab name="Az PowerShell" }} ```bash # Get storage accounts Get-AzStorageAccount | fl # Get rules to access the storage account Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet # Get IPs (Get-AzStorageAccount | select -ExpandProperty NetworkRuleSet).IPRules # Get containers of a storage account Get-AzStorageContainer -Context (Get-AzStorageAccount -name -ResourceGroupName ).context # Get blobs inside container Get-AzStorageBlob -Container epbackup-planetary -Context (Get-AzStorageAccount -name -ResourceGroupName ).context # Get a blob from a container Get-AzStorageBlobContent -Container -Context (Get-AzStorageAccount -name -ResourceGroupName ).context -Blob -Destination .\Desktop\filename.txt # Create a Container Policy New-AzStorageContainerStoredAccessPolicy ` -Context (Get-AzStorageAccount -Name -ResourceGroupName ).Context ` -Container ` -Policy ` -Permission racwdl ` -StartTime (Get-Date "2023-11-22T00:00Z") ` -ExpiryTime (Get-Date "2024-11-22T00:00Z") #Get Container policy Get-AzStorageContainerStoredAccessPolicy ` -Context (Get-AzStorageAccount -Name -ResourceGroupName ).Context ` -Container "storageaccount1994container" # Queue Management Get-AzStorageQueue -Context (Get-AzStorageAccount -Name -ResourceGroupName ).Context (Get-AzStorageQueue -Name -Context (Get-AzStorageAccount -name -ResourceGroupName ).Context).QueueClient.PeekMessage().Value #Blob Container Get-AzStorageBlob -Container -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context Get-AzStorageBlobContent ` -Container ` -Blob ` -Destination ` -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context Set-AzStorageBlobContent ` -Container ` -File ` -Blob ` -Context $(Get-AzStorageAccount -name "teststorageaccount1998az" -ResourceGroupName "testStorageGroup").Context # Shared Access Signatures (SAS) Get-AzStorageContainerAcl ` -Container ` -Context (Get-AzStorageAccount -Name -ResourceGroupName ).Context New-AzStorageBlobSASToken ` -Context $ctx ` -Container ` -Blob ` -Permission racwdl ` -ExpiryTime (Get-Date "2024-12-31T23:59:00Z") ``` {{#endtab }} {{#endtabs }} ### फ़ाइल शेयर {{#ref}} az-file-shares.md {{#endref}} ## विशेषाधिकार वृद्धि {{#ref}} ../az-privilege-escalation/az-storage-privesc.md {{#endref}} ## पोस्ट एक्सप्लोइटेशन {{#ref}} ../az-post-exploitation/az-blob-storage-post-exploitation.md {{#endref}} ## स्थिरता {{#ref}} ../az-persistence/az-storage-persistence.md {{#endref}} ## संदर्भ - [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction) - [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview) - [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support) {{#include ../../../banners/hacktricks-training.md}}