Situatie
Procedura acoperă un email de phishing livrat în tenanți Microsoft 365 fără Defender for Office 365, adică doar cu Exchange Online Protection (EOP). Fără Defender nu ai Threat Explorer, Safe Links, URL click trace sau AIR, așa că totul se face din Exchange admin center, Purview, Entra și PowerShell.
Roluri necesare pe contul de admin
| Ce faci | Rol | Unde se atribuie |
| Message trace, blocări, transport rules | Exchange Administrator | Entra ID |
| Căutare în cutii poștale | eDiscovery Manager | Purview → Roles & scopes |
| Ștergere (purge) | Search And Purge (inclus în Organization Management) | Purview → Roles & scopes |
| Sign-in logs, revocare sesiuni | Security Administrator sau User Administrator | Entra ID |
Solutie
Pasi de urmat
Unelte
- Modulul PowerShell ExchangeOnlineManagement versiunea 3.9 sau mai nouă (Install-Module ExchangeOnlineManagement -Scope CurrentUser).
- Opțional, Microsoft.Graph pentru sign-in-uri și revocare sesiuni.
- Analiză externă: Microsoft Message Header Analyzer (mha.azurewebsites.net), un sandbox (Triage / tria.ge, ANY.RUN), urlscan.io, VirusTotal.
Regula de bază: mesajul suspect nu se deschide în Outlook-ul de producție. Se cere utilizatorului ca forward ca atașament (.msg/.eml) sau se exportă din Content search.
Faza 1 – Identificare
Scopul fazei e lista completă a destinatarilor și statusul livrării, obținută din message trace. Message trace păstrează 90 de zile de istoric, dar o interogare acoperă maximum 10 zile.
Din interfață: Exchange admin center → Mail flow → Message trace → Start a trace. Filtrezi după subiect, expeditor sau IP sursă și intervalul de timp.
Din PowerShell:
Connect-ExchangeOnline -UserPrincipalName admin@tenant.onmicrosoft.com -DisableWAM
# după subiect
Get-MessageTraceV2 -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) `
-Subject “QuotaExceeded” -SubjectFilterType Contains -ResultSize 5000 |
Sort-Object Received | Format-Table Received, SenderAddress, RecipientAddress, Status, FromIP
# după IP-ul sursă (prinde și variantele cu alt subiect)
Get-MessageTraceV2 -StartDate (Get-Date).AddDays(-2) -EndDate (Get-Date) -FromIP xx.xx.xx.xx -ResultSize 5000
Cum citești statusurile
| Status | Ce înseamnă | Acțiune |
| Delivered | A ajuns în casuta utilizatorului | Intră la purge |
| Expanded | Destinatarul e un grup; mesajul s-a dus la membri | Verifici membrii grupului (rândurile Delivered) |
| FilteredAsSpam | Livrat în Junk | Intră și el la purge |
| Quarantined | Reținut în carantină | Nu se eliberează; se șterge din carantină |
| Failed | Nelivrat | Fără acțiune |
Ce notezi: numărul de destinatari Delivered, grupurile Expanded, ora primei livrări, IP-ul sursă și dacă cineva a raportat mesajul. Ora primei livrări e reperul pentru verificarea sign-in-urilor din Faza 5.
# export pentru dosarul incidentului
… | Export-Csv .\trace_incident.csv -NoTypeInformation -Encoding UTF8
Faza 2 – Analiză
Scopul fazei e un verdict (phishing, malware, spam sau legitim) și lista de IOC-uri pentru blocare. Se lucrează pe fișierul .msg/.eml, niciodată pe mesajul deschis în Outlook.
- Antete — lipești antetele în Message Header Analyzer și verifici:
| Antet | Ce cauți | Semnal de alarmă |
| Authentication-Results | spf, dkim, dmarc, compauth | fail la oricare, compauth=fail |
| ARC-Authentication-Results | Rezultatul inițial, înainte de retrimitere | dmarc=fail aici, chiar dacă Authentication-Results arată pass |
| Received (cel mai de jos) | Primul server extern și IP-ul lui | Domeniu fără legătură cu expeditorul |
| DKIM-Signature d= | Cine a semnat | Alt domeniu decât cel din From (ex. *.onmicrosoft.com străin) |
| X-Forefront-Antispam-Report | SCL, SFV, CIP, CTRY | SCL ≥ 5, SFV:SPM în varianta -untrusted |
| Return-Path, Reply-To | Adresele reale de răspuns | Diferite de From |
Exista situatii in care expeditorul poate fi afisat messaging.microsoft.com, iar verificarea inițială avea SPF fail și DMARC fail (p=reject). Mesajul a fost retrimis printr-un tenant M365 străin, care l-a semnat DKIM, așa că rezultatul final a arătat compauth=pass. Adevărul se vede doar în ARC-Authentication-Results și în x-forefront-antispam-report-untrusted.
- URL-uri și atașamente
- Extragi link-urile fără să dai click: din MHA sau cu Python (pip install extract-msg).
- Verifici domeniile în urlscan.io și VirusTotal, iar hash-urile atașamentelor în VirusTotal.
- Semne de phishing pentru credentiale: parametri care conțin adresa sau domeniul victimei (ex. success%poct.ro%) și domenii proaspete în spatele Cloudflare.
- Sandbox (Triage / ANY.RUN) — trimiți .msg-ul și citești raportul critic:
- Scorul nu e verdictul. Outlook și Edge generează zgomot de tip SetWindowsHookEx, FEATURE_BROWSER_EMULATION, WriteProcessMemory sau fișiere Edge în Program Files. Acestea nu înseamnă malware.
- Ce contează: secțiunea Processes (msedge.exe –single-argument <URL> arată ce link s-a deschis), secțiunea Network (domeniile contactate) și fișierele cu adevărat descărcate.
- challenges.cloudflare.com plus trafic STUN înseamnă Cloudflare Turnstile, folosit de kiturile AiTM (de ex. Tycoon2FA) ca să ascundă pagina de sandbox. Verdictul rămâne atunci „suspicious”, deși mesajul e phishing.
- IOC-uri de notat
Tip Valoare Sursă IP sursă email Received / FromIP HELO / domeniu expeditor real Received Domeniu semnătură DKIM DKIM-Signature d= Domenii phishing Corp mesaj / sandbox Domeniu tracking pixel Corp mesaj / sandbox IP-uri găzduire Sandbox Network Subiect, expeditor afișat Message trace
Faza 3 – Eradicare (ștergere din casutele de mail)
Fără Defender, mesajul se șterge cu Content Search și purge din PowerShell. Sesiunea trebuie deschisă cu -EnableSearchOnlySession, altfel căutarea nu pornește.
- Conectare:
- Connect-IPPSSession -UserPrincipalName admin@tenant.onmicrosoft.com -EnableSearchOnlySession -DisableWAM
$name = “Phish-<Subiect>-<YYYYMMDD>”
- Creare și pornire căutare. Interogarea se face după subiect și dată, fără from:, care ratează expeditorii falsificați:
- New-ComplianceSearch -Name $name -ExchangeLocation All `
- -ContentMatchQuery ‘(subject:”<subiect exact>”) AND (received:2026-10-26..2026-10-27)’
- Start-ComplianceSearch -Identity $name
- do { Start-Sleep 30; $s = Get-ComplianceSearch -Identity $name } while ($s.Status -ne ‘Completed’)
- $s | Format-List Status, Items, JobEndTime
$s.SuccessResults -split ‘,’ | Select-String ‘Item count: [1-9]’
10.Validare înainte de purge: numărul de casute cu iteme trebuie să corespundă cu destinatarii Delivered din Faza 1. O cutie cu mai multe iteme înseamnă de obicei reply sau forward. Verifici cu message trace pe expeditorul respectiv: un forward către IT e raportare, un reply sau forward extern înseamnă posibil compromis (Faza 5).
11. Purge:
12. New-ComplianceSearchAction -SearchName $name -Purge -PurgeType HardDelete -Confirm:$false
13. do { Start-Sleep 30; $p = Get-ComplianceSearchAction -Identity “${name}_Purge” } while ($p.Status -ne ‘Completed’)
$p.Results
O acțiune de purge șterge maximum 10 iteme per adresa. Dacă trebuie repetată: Remove-ComplianceSearchAction -Identity “${name}_Purge” -Confirm:$false, apoi din nou New-ComplianceSearchAction.
14.Verificare pe 1–2 casute, din sesiunea Exchange Online:
15. Get-EXOMailboxFolderStatistics -Identity user@domeniu.ro -FolderScope RecoverableItems |
Format-Table Name, ItemsInFolder
Mesajul trebuie să apară în folderul Purges. Content Search îl va găsi în continuare acolo până expiră retenția (implicit 14 zile), așa că nu repeta purge-ul așteptând 0 iteme.
16. Carantină: dacă în Faza 1 au apărut mesaje Quarantined, le ștergi din Defender portal → Review → Quarantine (disponibil și în EOP) și nu le eliberezi.
Faza 4 – Blocare
EOP blochează doar la livrarea emailului. Nu există Safe Links, deci un link dintr-un mesaj deja livrat nu e blocat la click. Click-ul se oprește doar la nivel de DNS, firewall sau proxy.
| Ce blochezi | Unde | Efect |
| Domenii phishing și tracking | Tenant Allow/Block List (URL) | Mesajele noi care conțin URL-ul ajung în carantină |
| IP sursă | Connection filter policy | Mesajele de la IP sunt respinse sau marcate spam |
| Spoofing pe un domeniu | Tenant Allow/Block List (Spoofed senders) | Blochează combinația domeniu falsificat + infrastructură |
| Campanii retrimise prin alți tenanți | Transport rule pe antete | Carantină pe bază de ARC sau DKIM d= |
| Click pe link | DNS filter / firewall / proxy | Singura protecție la click fără Defender |
Connect-ExchangeOnline -UserPrincipalName admin@tenant.onmicrosoft.com -DisableWAM
# URL-uri (max. 250 caractere per intrare)
New-TenantAllowBlockListItems -ListType Url -Block -NoExpiration `
-Entries “*.dongho17.com”,”dongho17.com”,”444ik.com” -Notes “INC phishing 2026-10-26″
# IP sursă
Set-HostedConnectionFilterPolicy -Identity Default -IPBlockList @{Add=”5.181.3.204”}
# spoofing: domeniu falsificat + infrastructura de trimitere (IP/24 sau domeniu PTR)
New-TenantAllowBlockListSpoofItems -Identity Default -Action Block -SpoofType External `
-SpoofedUser “messaging.microsoft.com” -SendingInfrastructure “5.181.3.0/24”
Nu bloca expeditorul afișat când e un domeniu legitim falsificat (de ex. microsoft.com), pentru că ai bloca și alertele reale.
Transport rule pentru mesaje falsificate retrimise prin alți tenanți. Rulați-l întâi în mod audit, pentru că și forward-urile legitime pot avea ARC cu fail:
New-TransportRule -Name “Quarantine spoofed Microsoft via ARC fail” `
-SenderDomainIs “microsoft.com”,”messaging.microsoft.com”,”microsoftonline.com” `
-HeaderMatchesMessageHeader “ARC-Authentication-Results” -HeaderMatchesPatterns “dmarc=fail” `
-Quarantine $true -Mode AuditAndNotify -SetAuditSeverity High
# după 1-2 săptămâni fără alarme false: Set-TransportRule -Identity “…” -Mode Enforce
Pentru o campanie anume se poate bloca și tenantul abuzat, după semnătura DKIM: -HeaderContainsMessageHeader “DKIM-Signature” -HeaderContainsWords “d=wesleyanuniversityp.onmicrosoft.com”.
Măsuri de durată recomandate în EOP:
- Set-ExternalInOutlook -Enabled $true, care pune eticheta „External” pe mesajele din afară.
- Politica anti-phishing implicită cu spoof intelligence activ și acțiunea Quarantine.
- Butonul Report pentru utilizatori, cu raportare către o cutie a echipei de securitate (Settings → Email & collaboration → User reported settings).
Faza 5 – Click-uri și conturi compromise
Fără Defender nu există URL click trace, așa că click-urile se deduc din trei surse: log-urile de rețea, sign-in-urile utilizatorilor și întrebarea directă către aceștia.
- Cine a dat click
- Log-uri DNS, firewall sau proxy pentru domeniile de phishing, de la ora primei livrări încoace.
- Notificarea către utilizatori (Faza 6) cere explicit raportarea click-ului.
- Sign-in-uri suspecte — Entra admin center → Users → Sign-in logs, filtrat pe destinatari și pe intervalul de după livrare. Pe licența gratuită Entra retenția e de 7 zile, pe P1 de 30.
Cauți IP-uri sau țări neobișnuite, sign-in-uri reușite imediat după ora livrării, user agent ne-browser (axios, python-requests) și sign-in-uri de pe IP-uri de hosting sau VPN. Kiturile AiTM fură cookie-ul de sesiune, așa că un sign-in reușit cu MFA satisfăcut nu exclude compromiterea.
- Activitate după compromitere (Unified Audit Log și configurația cutiei):
Connect-ExchangeOnline -UserPrincipalName admin@tenant.onmicrosoft.com -DisableWAM
$u = “user@domeniu.ro”
# reguli de inbox (mutare, ștergere, forward ascuns)
Get-InboxRule -Mailbox $u | Format-List Name, Enabled, From, SubjectContainsWords, MoveToFolder, DeleteMessage, ForwardTo, RedirectTo
# forward la nivel de cutie
Get-Mailbox $u | Format-List ForwardingSmtpAddress, ForwardingAddress, DeliverToMailboxAndForward
# audit: login-uri, reguli noi, acces la mail
Search-UnifiedAuditLog -StartDate (Get-Date).AddDays(-3) -EndDate (Get-Date) -UserIds $u `
-Operations UserLoggedIn,New-InboxRule,Set-InboxRule,UpdateInboxRules,Set-Mailbox,MailItemsAccessed,Send -ResultSize 5000 |
Select-Object CreationDate, Operations, ClientIP, AuditData | Export-Csv .\ual_$($u.Split(‘@’)[0]).csv -NoTypeInformation
- Dacă utilizatorul a introdus parola sau există indicii de compromitere:
- Resetare parolă și obligarea schimbării la următorul login
- Revocare sesiuni: Revoke-MgUserSignInSession -UserId $u (Microsoft.Graph) sau Entra → User → Revoke sessions
- Verificare metode MFA adăugate recent (Get-MgUserAuthenticationMethod -UserId $u) și ștergerea celor necunoscute
- Ștergere reguli de inbox și forward-uri suspecte
- Verificare aplicații OAuth consimțite (Get-MgUserOauth2PermissionGrant -UserId <id>) și revocarea celor necunoscute
- Verificare mesaje trimise din cont după ora compromiterii (message trace cu -SenderAddress $u), ca să vezi dacă atacul s-a propagat intern sau la clienți
- Blocarea temporară a contului (Update-MgUser -UserId $u -AccountEnabled:$false) dacă activitatea malitioasă continuă
Faza 6 – Comunicare și închidere
Incidentul se închide doar după ce mesajele sunt șterse, IOC-urile blocate, utilizatorii notificați și conturile cu click verificate.
- Notificare către destinatari, trimisă după blocare: ce s-a întâmplat, că mesajul a fost șters, „dacă ați dat click sau ați introdus parola, contactați-ne imediat” și cum recunosc pe viitor un astfel de mesaj
- Mulțumiri utilizatorului care a raportat
- Raportarea mesajului la Microsoft: Defender portal → Actions & submissions → Submissions → Emails (disponibil și în EOP)
- Raportarea tenantului M365 abuzat la phish@office365.microsoft.com, cu antetele complete
- Raportarea domeniului de phishing la registrar și la Cloudflare (abuse.cloudflare.com), dacă e găzduit în spatele lor
- Raport de incident: cronologie, destinatari (număr), IOC-uri, acțiuni, conturi afectate, lecții învățate
- Evaluare GDPR: dacă un cont a fost compromis și s-au accesat date personale, se evaluează notificarea către ANSPDCP în 72 de ore (art. 33 GDPR), împreună cu DPO-ul clientului
- Probele (.msg, raport sandbox, CSV-uri) se păstrează în dosarul incidentului cu acces restricționat, se șterg din alte locuri (desktop, Downloads, conversații AI) și se elimină la expirarea perioadei de păstrare
- Căutarea și acțiunea de purge se șterg după închidere: Remove-ComplianceSearch -Identity $name
Spam legitim (cold outreach) vs. phishing
Nu orice email nedorit e incident de securitate. Mesajele comerciale trimise legitim prin platforme ca Salesforce, Mailchimp sau SendGrid trec SPF, DKIM și DMARC și ajung în Inbox. Se blochează la cererea clientului, fără purge HardDelete și fără verificare de compromitere.
| Criteriu | Spam legitim / cold outreach | Phishing |
| Autentificare | SPF, DKIM, DMARC pass pe domeniul platformei; ARC fără fail | Fail în Authentication-Results sau în ARC-Authentication-Results |
| Expeditor | Platformă de marketing în numele firmei (ex. *.sfcustomeremail.com), Reply-To pe domeniul real al firmei | Domeniu legitim falsificat (ex. microsoft.com) sau domeniu proaspăt, fără legătură cu brandul |
| Link-uri | Doar către domeniile firmei (ex. trendyol.com) | Către domenii străine, cu adresa victimei în URL, des în spatele Cloudflare |
| Conținut | Ofertă comercială, fără cerere de autentificare | Urgență, cont blocat, cotă depășită, cerere de login |
| Sandbox | Scor mic (1–3), doar zgomot Outlook, fără conexiuni suspecte | Scor ridicat, URL deschis în Edge, Turnstile sau STUN, pagină de login |
| Acțiune | Blocare la cerere, cel mult SoftDelete | Procedura completă, Fazele 1–6 |
De ce „Block sender” din Outlook nu oprește mesajele
- Lista e personală și doar mută mesajul în Junk. Nu îl oprește și nu se aplică altor utilizatori.
- Când destinatarul e un grup de distribuție (ex. office@), grupul nu are setări de Junk. Fiecare membru primește mesajul după propria listă, așa că doar cel care a blocat îl vede în Junk. Statusul în message trace e atunci FilteredAsSpam la el și Delivered la ceilalți.
- Platformele de marketing pot schimba adresa From între campanii, iar lista personală se potrivește doar pe adresa exactă.
Diagnostic:
Get-Recipient office@domeniu.ro | Format-List RecipientTypeDetails # MailUniversalDistributionGroup = grup
Get-DistributionGroupMember office@domeniu.ro | Format-Table Name, PrimarySmtpAddress
Get-MailboxJunkEmailConfiguration -Identity user@domeniu.ro | Format-List Enabled, BlockedSendersAndDomains
Blocare la nivel de tenant, înainte de distribuirea către grup:
# subdomeniul specific organizației expeditoare (nu domeniul platformei)
New-TenantAllowBlockListItems -ListType Sender -Block -NoExpiration `
-Entries “00d4k000001o3sxuaa.sfcustomeremail.com” -Notes “<firma> outreach – <client>”
# plasă de siguranță pe Reply-To, rezistentă la schimbarea adresei From
New-TransportRule -Name “Block <firma> outreach” `
-HeaderContainsMessageHeader “Reply-To” -HeaderContainsWords “<domeniu-firma>” -Quarantine $true
Ce nu se blochează: domeniile și IP-urile platformei (salesforce.com, sfcustomeremail.com, sendgrid.net, mailchimp.com și altele asemănătoare). Prin ele trimit și furnizori legitimi ai clientului.
Mesajele deja livrate: blocarea nu e retroactivă. Dacă clientul vrea curățare, se face Content Search + purge ca în Faza 3, dar cu -PurgeType SoftDelete, pentru că utilizatorii îl pot recupera dacă e nevoie.
Opțiune non-tehnică: o cerere de oprire către adresa din Reply-To, în baza dreptului de opoziție (GDPR art. 21) și a Legii 506/2004. Blocarea din tenant rămâne plasa de siguranță.
Verificare după următoarea campanie: message trace trebuie să arate Quarantined la toți destinatarii. Blocarea se propagă în 5–30 de minute. Dacă apare tot Delivered, verifici transport rules cu prioritate mai mare care setează SCL -1 sau opresc procesarea.
Erori frecvente
| Simptom | Cauză | Soluție |
| Error Acquiring Token … 0x80070520 A specified logon session does not exist | Autentificarea WAM pică în PowerShell rulat ca Administrator sau cu cont cloud neadaugat în Windows | -DisableWAM la Connect-*, consolă fără „Run as administrator” |
| Start-ComplianceSearch: „open a new session using Connect-IPPSSession with the -EnableSearchOnlySession flag” | Microsoft cere sesiune dedicată pentru căutare și purge | Disconnect-ExchangeOnline, apoi Connect-IPPSSession -EnableSearchOnlySession -DisableWAM (modul ≥ 3.9) |
| Status Completed, Items: 0, JobEndTime vechi | Căutarea nu a rulat de fapt | Rulezi Start-ComplianceSearch și aștepți trecerea prin Starting / InProgress |
| 0 iteme deși message trace arată livrări | from: nu se potrivește pe expeditorul falsificat | Interogare doar pe subject: și received: |
| După purge, căutarea găsește tot iteme | HardDelete mută în Recoverable Items \ Purges, care e indexat | Normal. Verifici cu Get-EXOMailboxFolderStatistics -FolderScope RecoverableItems |
| New-ComplianceSearchAction refuză: acțiunea există deja | Numele <search>_Purge e ocupat | Remove-ComplianceSearchAction -Identity “${name}_Purge” |
| Cmdlet-ul New-ComplianceSearchAction -Purge nu există | Lipsește rolul Search And Purge | Atribui rolul în Purview → Roles & scopes |
| Get-MessageTrace întoarce avertismente sau nimic | Cmdlet înlocuit | Get-MessageTraceV2, maximum 10 zile per interogare |
| Raportul sandbox are scor mare cu „adware” sau „spyware” pe un .msg | Zgomot generat de Outlook și Edge | Judeci după secțiunile Processes (URL deschis) și Network, nu după scor |
Încă două capcane la purge:
- New-ComplianceSearchAction imediat după Start-ComplianceSearch e refuzat cu „the search is still running”. Aștepți întâi statusul Completed.
- După Set-ComplianceSearch (interogare schimbată) rulezi din nou Start-ComplianceSearch și verifici rezultatele. Purge-ul folosește interogarea curentă, așa că fără o rulare nouă nu ai validat exact ce se șterge.
Leave A Comment?