Detecting Email Account Compromise
Overview
Email account compromise (EAC) is a prevalent attack vector where adversaries gain unauthorized access to mailboxes to exfiltrate sensitive data, conduct business email compromise (BEC), or establish persistence through inbox rule manipulation. Attackers commonly create forwarding rules to siphon emails, delete rules to hide evidence, or use OAuth tokens for persistent access. Detection relies on analyzing Microsoft 365 Unified Audit Logs, Azure AD sign-in logs for impossible travel or suspicious locations, inbox rule creation events (Set-InboxRule, New-InboxRule), and Microsoft Graph API access patterns. Key indicators include forwarding rules to external addresses, rules that delete or move messages matching keywords like "invoice" or "payment", and sign-ins from unusual user agents such as python-requests.
When to Use
Trigger phrases:
"detecting email account compromise"
"Detect compromised O365 and Google Workspace email accounts by analyzing inbox r"
When investigating security incidents that require detecting email account compromise
When building detection rules or threat hunting queries for this domain
When SOC analysts need structured procedures for this analysis type
When validating security monitoring coverage for related attack techniques
Prerequisites
- Microsoft 365 with Unified Audit Logging enabled
- Azure AD P1/P2 for risk detection APIs
- Python 3.9+ with
requests, msal libraries
- Microsoft Graph API application registration with Mail.Read, AuditLog.Read.All permissions
- Understanding of OAuth2 client credential flows
Steps
# Example: IOC detection
import re
IOC_PATTERNS = {
"ip": r"\b(?:\d{1,3}\.){3}\d{1,3}\b",
"domain": r"\b[a-z0-9-]+\.[a-z]{2,}\b",
"hash_md5": r"\b[a-f0-9]{32}\b",
"hash_sha256": r"\b[a-f0-9]{64}\b",
}
def extract_iocs(text: str) -> dict:
return {k: re.findall(v, text) for k, v in IOC_PATTERNS.items()}
- Export audit logs or connect to Microsoft Graph API using MSAL authentication
- Query inbox rules for all monitored mailboxes via
/users/{id}/mailFolders/inbox/messageRules
- Analyze rules for external forwarding (ForwardTo, RedirectTo external addresses)
- Detect suspicious rule patterns: deletion rules, keyword-matching rules targeting financial terms
- Query sign-in logs via
/auditLogs/signIns for unusual locations and impossible travel
- Check for suspicious user agent strings (python-requests, PowerShell, curl)
- Identify OAuth application consent grants for suspicious third-party apps
- Correlate findings across users to detect campaign-level compromise
- Generate compromise indicators report with severity scores
Expected Output
A JSON report listing compromised or suspicious accounts, malicious inbox rules detected, impossible travel events, suspicious OAuth grants, and recommended containment actions with severity ratings.
When NOT to Use
- You need to perform the attack to test detection (use performing-* skills)
- Task is about analyzing past incidents (use analyzing-* skills)
- You need to implement detection rules (use implementing-* skills)
- Task is about threat hunting proactively (use hunting-* skills)
- You don't have access to logs or monitoring data
- Task requires incident response (use IR skills)
Red Flags
- Performing actions without explicit written authorization from the asset owner
- Testing against production systems without a defined scope and rules of engagement
- Sharing sensitive findings or credentials in unencrypted communications
- Failing to properly scope and contain the assessment before starting
Process
- Reconnaissance — Gather target information, identify attack surface, enumerate services
- Analysis/Exploitation — Execute the technique, analyze results, document findings
- Reporting — Document IOCs, write findings, provide remediation recommendations
Verification
- All steps executed successfully against a test environment before production use
- Output documented with screenshots or logs demonstrating expected behavior
- Results validated against known-good baselines or reference implementations
- Documentation complete enough for another analyst to reproduce findings
Anti-Rationalization Table
| Rationalization |
Reality |
| "We are too small to be targeted" |
Automated attacks target everyone. Size does not matter. |
| "Security slows us down" |
A breach slows you down 100x more. Build security in from the start. |
| "We will fix it after launch" |
Vulnerabilities in production are exploited within hours. Fix before deploy. |
1---2name: detecting-email-account-compromise3description: Use when detect compromised O365 and Google Workspace email accounts by analyzing inbox rule creation, suspicious sign-in locations, mail forwarding rules, and unusual API access patterns via Microsoft Graph and audit logs. Use when detecting compromised o365 and google workspace email accounts by analyzing.4license: Apache-2.05---67# Detecting Email Account Compromise89## Overview1011Email account compromise (EAC) is a prevalent attack vector where adversaries gain unauthorized access to mailboxes to exfiltrate sensitive data, conduct business email compromise (BEC), or establish persistence through inbox rule manipulation. Attackers commonly create forwarding rules to siphon emails, delete rules to hide evidence, or use OAuth tokens for persistent access. Detection relies on analyzing Microsoft 365 Unified Audit Logs, Azure AD sign-in logs for impossible travel or suspicious locations, inbox rule creation events (Set-InboxRule, New-InboxRule), and Microsoft Graph API access patterns. Key indicators include forwarding rules to external addresses, rules that delete or move messages matching keywords like "invoice" or "payment", and sign-ins from unusual user agents such as python-requests.121314## When to Use15**Trigger phrases:**16- "detecting email account compromise"17- "Detect compromised O365 and Google Workspace email accounts by analyzing inbox r"181920- When investigating security incidents that require detecting email account compromise21- When building detection rules or threat hunting queries for this domain22- When SOC analysts need structured procedures for this analysis type23- When validating security monitoring coverage for related attack techniques2425## Prerequisites2627- Microsoft 365 with Unified Audit Logging enabled28- Azure AD P1/P2 for risk detection APIs29- Python 3.9+ with `requests`, `msal` libraries30- Microsoft Graph API application registration with Mail.Read, AuditLog.Read.All permissions31- Understanding of OAuth2 client credential flows3233## Steps3435```python36# Example: IOC detection37import re3839IOC_PATTERNS = {40 "ip": r"\b(?:\d{1,3}\.){3}\d{1,3}\b",41 "domain": r"\b[a-z0-9-]+\.[a-z]{2,}\b",42 "hash_md5": r"\b[a-f0-9]{32}\b",43 "hash_sha256": r"\b[a-f0-9]{64}\b",44}4546def extract_iocs(text: str) -> dict:47 return {k: re.findall(v, text) for k, v in IOC_PATTERNS.items()}48```49501. Export audit logs or connect to Microsoft Graph API using MSAL authentication512. Query inbox rules for all monitored mailboxes via `/users/{id}/mailFolders/inbox/messageRules`523. Analyze rules for external forwarding (ForwardTo, RedirectTo external addresses)534. Detect suspicious rule patterns: deletion rules, keyword-matching rules targeting financial terms545. Query sign-in logs via `/auditLogs/signIns` for unusual locations and impossible travel556. Check for suspicious user agent strings (python-requests, PowerShell, curl)567. Identify OAuth application consent grants for suspicious third-party apps578. Correlate findings across users to detect campaign-level compromise589. Generate compromise indicators report with severity scores5960## Expected Output6162A JSON report listing compromised or suspicious accounts, malicious inbox rules detected, impossible travel events, suspicious OAuth grants, and recommended containment actions with severity ratings.63## When NOT to Use6465- You need to perform the attack to test detection (use performing-* skills)66- Task is about analyzing past incidents (use analyzing-* skills)67- You need to implement detection rules (use implementing-* skills)68- Task is about threat hunting proactively (use hunting-* skills)69- You don't have access to logs or monitoring data70- Task requires incident response (use IR skills)717273## Red Flags7475- Performing actions without explicit written authorization from the asset owner76- Testing against production systems without a defined scope and rules of engagement77- Sharing sensitive findings or credentials in unencrypted communications78- Failing to properly scope and contain the assessment before starting7980## Process81821. **Reconnaissance** — Gather target information, identify attack surface, enumerate services831. **Analysis/Exploitation** — Execute the technique, analyze results, document findings841. **Reporting** — Document IOCs, write findings, provide remediation recommendations8586## Verification8788- All steps executed successfully against a test environment before production use89- Output documented with screenshots or logs demonstrating expected behavior90- Results validated against known-good baselines or reference implementations91- Documentation complete enough for another analyst to reproduce findings9293## Anti-Rationalization Table9495| Rationalization | Reality |96|---|---|97| "We are too small to be targeted" | Automated attacks target everyone. Size does not matter. |98| "Security slows us down" | A breach slows you down 100x more. Build security in from the start. |99| "We will fix it after launch" | Vulnerabilities in production are exploited within hours. Fix before deploy. |