Az - SQL

Reading time: 14 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Azure SQL

Azure SQL एक प्रबंधित, सुरक्षित और बुद्धिमान उत्पादों का परिवार है जो Azure क्लाउड में SQL Server डेटाबेस इंजन का उपयोग करता है। इसका मतलब है कि आपको अपने सर्वरों के भौतिक प्रशासन की चिंता करने की आवश्यकता नहीं है, और आप अपने डेटा के प्रबंधन पर ध्यान केंद्रित कर सकते हैं।

Azure SQL में चार मुख्य पेशकशें शामिल हैं:

  1. Azure SQL Server: SQL Server डेटाबेस के तैनाती और प्रबंधन के लिए एक सर्वर की आवश्यकता होती है।
  2. Azure SQL Database: यह एक पूर्ण-प्रबंधित डेटाबेस सेवा है, जो आपको Azure क्लाउड में व्यक्तिगत डेटाबेस होस्ट करने की अनुमति देती है।
  3. Azure SQL Managed Instance: यह बड़े पैमाने पर, पूरे SQL Server इंस्टेंस-स्कोप्ड तैनातियों के लिए है।
  4. Azure SQL Server on Azure VMs: यह उन आर्किटेक्चर के लिए सबसे अच्छा है जहां आप ऑपरेटिंग सिस्टम और SQL Server इंस्टेंस पर नियंत्रण चाहते हैं।

SQL Server सुरक्षा विशेषताएँ

नेटवर्क एक्सेस:

  • सार्वजनिक एंडपॉइंट (विशिष्ट नेटवर्कों तक पहुंच को सीमित कर सकता है)।
  • निजी एंडपॉइंट।
  • डोमेन नामों के आधार पर कनेक्शनों को प्रतिबंधित करना भी संभव है।
  • Azure सेवाओं को इसे एक्सेस करने की अनुमति देना भी संभव है (जैसे पोर्टल में क्वेरी संपादक का उपयोग करने के लिए या Azure VM को कनेक्ट करने की अनुमति देना)।

प्रमाणीकरण विधियाँ:

  • Microsoft Entra-only प्रमाणीकरण: आपको उन Entra प्रिंसिपल को इंगित करने की आवश्यकता है जिनके पास सेवा तक पहुंच होगी।
  • SQL और Microsoft Entra दोनों प्रमाणीकरण: उपयोगकर्ता नाम और पासवर्ड के साथ पारंपरिक SQL प्रमाणीकरण Microsoft Entra के साथ।
  • केवल SQL प्रमाणीकरण: केवल डेटाबेस उपयोगकर्ताओं के माध्यम से पहुंच की अनुमति दें।

ध्यान दें कि यदि कोई SQL प्रमाणीकरण अनुमति दी जाती है, तो एक व्यवस्थापक उपयोगकर्ता (उपयोगकर्ता नाम + पासवर्ड) को इंगित करना आवश्यक है और यदि Entra ID प्रमाणीकरण चुना गया है, तो कम से कम एक प्रिंसिपल को व्यवस्थापक पहुंच के साथ इंगित करना भी आवश्यक है।

एन्क्रिप्शन:

  • इसे "पारदर्शी डेटा एन्क्रिप्शन" कहा जाता है और यह डेटाबेस, बैकअप और लॉग को विश्राम में एन्क्रिप्ट करता है।

  • हमेशा की तरह, डिफ़ॉल्ट रूप से Azure प्रबंधित कुंजी का उपयोग किया जाता है लेकिन ग्राहक प्रबंधित एन्क्रिप्शन कुंजी (CMEK) का भी उपयोग किया जा सकता है। प्रबंधित पहचान:

  • सिस्टम और उपयोगकर्ता प्रबंधित MIs को असाइन करना संभव है।

  • एन्क्रिप्शन कुंजी (यदि CMEK का उपयोग किया गया है) और डेटाबेस से अन्य सेवाओं तक पहुंच के लिए उपयोग किया जाता है।

  • डेटाबेस से एक्सेस की जा सकने वाली Azure सेवाओं के कुछ उदाहरणों के लिए इस पृष्ठ को देखें

  • यदि एक से अधिक UMI असाइन किया गया है, तो उपयोग के लिए डिफ़ॉल्ट एक को इंगित करना संभव है।

  • क्रॉस-टेनेंट एक्सेस के लिए एक संघीय क्लाइंट पहचान को कॉन्फ़िगर करना संभव है।

SQL डेटाबेस से एक ब्लॉब स्टोरेज के अंदर जानकारी तक पहुंचने के लिए कुछ कमांड:

sql
-- Create a credential for the managed identity
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
WITH IDENTITY = 'Managed Identity';
GO

-- Create an external data source pointing to the blob storage to access
CREATE EXTERNAL DATA SOURCE ManagedIdentity
WITH (
TYPE = BLOB_STORAGE,
LOCATION = 'https://testsqlidentity.blob.core.windows.net/sqlcontainer',
CREDENTIAL = ManagedIdentityCredential
);
GO

-- Read a file from ths storage and return it
SELECT *
FROM OPENROWSET(
BULK 'message.txt',
DATA_SOURCE = 'ManagedIdentity',
SINGLE_CLOB
) AS DataFile;
GO

Microsoft Defender:

  • “संभावित डेटाबेस कमजोरियों को कम करने और असामान्य गतिविधियों का पता लगाने” के लिए उपयोगी
  • हम Defender के बारे में अपनी एक पाठ में बात करेंगे (इसे कई अन्य Azure सेवाओं में सक्षम किया जा सकता है)

Backups:

  • बैकअप की आवृत्ति को रिटेंशन नीतियों में प्रबंधित किया जाता है।

Deleted databases:

  • मौजूदा बैकअप से हटाए गए DBs को पुनर्स्थापित करना संभव है।

Azure SQL Database

Azure SQL Database एक पूर्ण रूप से प्रबंधित डेटाबेस प्लेटफ़ॉर्म के रूप में सेवा (PaaS) है जो स्केलेबल और सुरक्षित संबंधपरक डेटाबेस समाधान प्रदान करता है। यह नवीनतम SQL Server तकनीकों पर आधारित है और अवसंरचना प्रबंधन की आवश्यकता को समाप्त करता है, जिससे यह क्लाउड-आधारित अनुप्रयोगों के लिए एक लोकप्रिय विकल्प बन जाता है।

SQL डेटाबेस बनाने के लिए यह आवश्यक है कि SQL सर्वर को इंगित किया जाए जहाँ इसे होस्ट किया जाएगा।

SQL Database Security Features

  • हमेशा अद्यतित: नवीनतम स्थिर संस्करण पर चलता है SQL Server का और स्वचालित रूप से नए फीचर्स और पैच प्राप्त करता है।
  • विरासत में प्राप्त SQL Server सुरक्षा विशेषताएँ:
  • प्रमाणीकरण (SQL और/या Entra ID)
  • असाइन किए गए प्रबंधित पहचान
  • नेटवर्क प्रतिबंध
  • एन्क्रिप्शन
  • बैकअप
  • डेटा पुनरावृत्ति: विकल्प स्थानीय, क्षेत्र, भू-क्षेत्र या भू-क्षेत्र पुनरावृत्ति हैं।
  • लेजर: यह डेटा की अखंडता को क्रिप्टोग्राफिक रूप से सत्यापित करता है, यह सुनिश्चित करता है कि किसी भी छेड़छाड़ का पता लगाया जाए। वित्तीय, चिकित्सा और किसी भी संगठन के लिए उपयोगी जो संवेदनशील डेटा का प्रबंधन करता है।

एक SQL डेटाबेस एक इलास्टिक पूल का हिस्सा हो सकता है। इलास्टिक पूल कई डेटाबेस का प्रबंधन करने के लिए एक लागत-कुशल समाधान है, जो उनके बीच कॉन्फ़िगर करने योग्य कंप्यूट (eDTUs) और स्टोरेज संसाधनों को साझा करता है, जिसमें मूल्य निर्धारण केवल आवंटित संसाधनों के आधार पर होता है न कि डेटाबेस की संख्या के आधार पर।

Azure SQL Column Level Security (Masking) & Row Level Security

Azure SQL का डायनामिक डेटा मास्किंग एक विशेषता है जो संवेदनशील जानकारी की सुरक्षा में मदद करती है इसे अनधिकृत उपयोगकर्ताओं से छिपाकर। वास्तविक डेटा को बदलने के बजाय, यह प्रदर्शित डेटा को डायनामिक रूप से मास्क करता है, यह सुनिश्चित करता है कि संवेदनशील विवरण जैसे क्रेडिट कार्ड नंबर अस्पष्ट हैं।

डायनामिक डेटा मास्किंग सभी उपयोगकर्ताओं पर प्रभाव डालती है सिवाय उन लोगों के जो अनमास्क किए गए हैं (इन उपयोगकर्ताओं को इंगित करने की आवश्यकता है) और प्रशासकों। इसमें वह कॉन्फ़िगरेशन विकल्प है जो निर्दिष्ट करता है कि कौन से SQL उपयोगकर्ता डायनामिक डेटा मास्किंग से छूट प्राप्त करते हैं, प्रशासक हमेशा बाहर होते हैं

Azure SQL रो लेवल सुरक्षा (RLS) एक विशेषता है जो नियंत्रित करती है कि कौन से पंक्तियाँ एक उपयोगकर्ता देख या संशोधित कर सकता है, यह सुनिश्चित करते हुए कि प्रत्येक उपयोगकर्ता केवल उनके लिए प्रासंगिक डेटा देखता है। फ़िल्टर या ब्लॉक प्रीडिकेट के साथ सुरक्षा नीतियाँ बनाकर, संगठन डेटाबेस स्तर पर बारीक-बारीक पहुंच लागू कर सकते हैं।

Azure SQL Managed Instance

Azure SQL Managed Instances बड़े पैमाने पर, पूरे SQL Server इंस्टेंस-स्कोप्ड डिप्लॉयमेंट के लिए हैं। यह नवीनतम SQL Server ऑन-प्रिमाइसेस (Enterprise Edition) डेटाबेस इंजन के साथ लगभग 100% संगतता प्रदान करता है, जो सामान्य सुरक्षा चिंताओं को संबोधित करने के लिए एक स्वदेशी वर्चुअल नेटवर्क (VNet) कार्यान्वयन प्रदान करता है, और ऑन-प्रिमाइसेस SQL Server ग्राहकों के लिए अनुकूल व्यावसायिक मॉडल।

Azure SQL Virtual Machines

Azure SQL Virtual Machines को ऑपरेटिंग सिस्टम और SQL Server इंस्टेंस को नियंत्रित करने की अनुमति देता है, क्योंकि एक VM SQL सर्वर चलाने वाली VM सेवा में उत्पन्न होगा।

जब एक SQL वर्चुअल मशीन बनाई जाती है, तो यह संभव है कि VM की सभी सेटिंग्स का चयन किया जाए (जैसा कि VM पाठ में दिखाया गया है) जो SQL सर्वर को होस्ट करेगा।

  • इसका मतलब है कि VM कुछ VNet(s) तक पहुँच प्राप्त करेगा, इसमें प्रबंधित पहचानें संलग्न हो सकती हैं, फ़ाइल शेयर माउंट किए जा सकते हैं... जिससे SQL से VM में पिवोटिंग करना बहुत दिलचस्प हो जाता है।
  • इसके अलावा, यह एक ऐप आईडी और सीक्रेट को कॉन्फ़िगर करना संभव है ताकि SQL को एक विशिष्ट की वॉल्ट तक पहुँचने की अनुमति दी जा सके, जिसमें संवेदनशील जानकारी हो सकती है।

यह भी संभव है कि स्वचालित SQL अपडेट, स्वचालित बैकअप, Entra ID प्रमाणीकरण और अन्य SQL सेवाओं की अधिकांश विशेषताओं को कॉन्फ़िगर किया जाए।

Enumeration

bash
# List Servers
az sql server list # managed identities are enumerated here too
## List Server Usages
az sql server list-usages --name <server_name> --resource-group <resource_group>
## List Server Firewalls
az sql server firewall-rule list --resource-group <resource_group> --server <server_name>
## List of Azure Active Directory administrators in a server.
az sql server ad-admin list --resource-group <resource_group> --server <server_name>
## Gets an advanced threat protection
az sql server advanced-threat-protection-setting show --resource-group <resource_group> --name <server_name>
## Get server's auditing policy.
az sql server audit-policy show --resource-group <resource_group> --name <server_name>
## Gets a server's secure connection policy.
az sql server conn-policy show --resource-group <resource_group> --server <server_name>
## Gets a list of server DNS aliases for a server.
az sql server dns-alias list --resource-group <resource_group> --server <server_name>
## List of server keys.
az sql server key list --resource-group <resource_group> --server <server_name>
## Gets a server encryption protector.
az sql server tde-key show --resource-group <resource_group> --server <server_name>

# List Databases in a SQL server
az sql db list --server <server_name> --resource-group <resource_group> #--output table
## Get details of a specific database
az sql db show --name <database_name> --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List of operations performed on the database.
az sql db op list --database <database_name> --server <server_name> --resource-group <resource_group>
## List sql database classification
az sql db classification list --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention backups for a SQL database
az sql db ltr-backup list --database <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db ltr-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db str-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List the replicas of a database and their replication status
az sql db replica list-links --name <database_name> --server <server_name> --resource-group <resource_group>
## List deleted SQL databases
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List restorable dropped databases in a SQL server
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List advanced threat protection setting show
az sql db advanced-threat-protection-setting --name <database_name> --server <server_name> --resource-group <resource_group>

# List all elastic pools in a SQL server
az sql elastic-pool list --server <server_name> --resource-group <resource_group> #--output table
## List all databases in a specific elastic pool
az sql elastic-pool show --name <elastic_pool_name>  --server <server_name> --resource-group <resource_group>
## List of databases in an elastic pool.
az sql elastic-pool list-dbs --name <elastic_pool_name>  --server <server_name> --resource-group <resource_group>

# List all managed Instances
az sql mi list
az sql mi show --resource-group <res-grp> --name <name>
az sql midb list
az sql midb show --resource-group <res-grp> --name <name>

# Lis all sql VM
az sql vm list
az sql vm show --resource-group <res-grp> --name <name>

# List schema by the database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas?api-version=2021-11-01"

# Get tables of a database with the schema
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables?api-version=2021-11-01"

# Get columns of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/columns?api-version=2021-11-01"

# Get columns of a table
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables/<tableName>/columns?api-version=2021-11-01"

# Get DataMaskingPolicies of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default?api-version=2021-11-01"

az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default/rules?api-version=2021-11-01"

इसके अतिरिक्त, यदि आप डेटाबेस के भीतर डायनामिक डेटा मास्किंग और रो लेवल नीतियों की गणना करना चाहते हैं, तो आप क्वेरी कर सकते हैं:

sql
--Enumerates the masked columns
SELECT
OBJECT_NAME(mc.object_id) AS TableName,
c.name AS ColumnName,
mc.masking_function AS MaskingFunction
FROM sys.masked_columns AS mc
JOIN sys.columns AS c
ON mc.object_id = c.object_id
AND mc.column_id = c.column_id

--Enumerates Row level policies
SELECT
sp.name AS PolicyName,
sp.is_enabled,
sp.create_date,
sp.modify_date,
OBJECT_NAME(sp.object_id) AS TableName,
sp2.predicate_definition AS PredicateDefinition
FROM sys.security_policies AS sp
JOIN sys.security_predicates AS sp2
ON sp.object_id = sp2.object_id;

Connect and run SQL queries

आप एक कनेक्शन स्ट्रिंग (जिसमें क्रेडेंशियल्स होते हैं) पा सकते हैं उदाहरण enumerating an Az WebApp:

bash
function invoke-sql{
param($query)
$Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
$Connection = New-Object System.Data.SqlClient.SqlConnection $Connection_string
$Connection.Open()
$Command = New-Object System.Data.SqlClient.SqlCommand
$Command.Connection = $Connection
$Command.CommandText = $query
$Reader = $Command.ExecuteReader()
while ($Reader.Read()) {
$Reader.GetValue(0)
}
$Connection.Close()
}

invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'

आप sqlcmd का उपयोग करके डेटाबेस तक भी पहुँच सकते हैं। यह जानना महत्वपूर्ण है कि क्या सर्वर सार्वजनिक कनेक्शनों की अनुमति देता है az sql server show --name <server-name> --resource-group <resource-group> और यह भी कि क्या फ़ायरवॉल नियम हमारे IP को पहुँचने की अनुमति देता है:

bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>

References

Privilege Escalation

Az - SQL Privesc

Post Exploitation

Az - SQL Post Exploitation

Persistence

Az - SQL Persistence

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें