← All posts
Try it

Spot the phish: five emails, two are genuine

Five sets of real-looking mail headers. Decide which are forged before you read the answers, then paste any of them into the phishing email analyzer to see what it would have told you.

This is a drill, not a lecture. Below are five sets of headers, trimmed to the lines that matter. For each one decide one thing: would you act on this message? Write your five answers down before you reach the answers, because the whole point is to find out what your reflexes do when nobody gives you a hint.

Two of the five are genuine. The other three are built the way real phishing is built, which is to say they mostly pass the technical checks. If that surprises you, that is the lesson, and the rest of the post explains why.

For a second opinion on any of them, paste the block into the phishing email analyzer. It runs in your browser and reads headers the way a mail server does.

How to read the block

Three lines do the work. Authentication-Results is the receiving server's verdict on SPF, DKIM and DMARC. header.from is the domain the DMARC check ran against, which is the domain you see in the From line. Reply-To, when it is present, is where your answer actually goes. Everything else is scenery.

Email 1

From: "Microsoft 365" <[email protected]>
Return-Path: <[email protected]>
Authentication-Results: mx.acme.com;
  spf=pass smtp.mailfrom=microsoft365-notices.com;
  dkim=pass header.d=microsoft365-notices.com;
  dmarc=pass header.from=microsoft365-notices.com
Subject: Unusual sign-in activity. Verify within 24 hours

Email 2

From: "Slack" <[email protected]>
Return-Path: <[email protected]>
Authentication-Results: mx.acme.com;
  spf=pass smtp.mailfrom=slack.com;
  dkim=pass header.d=slack.com;
  dmarc=pass (p=reject) header.from=slack.com
Subject: Priya mentioned you in #incidents

Email 3

From: "Anil Mehta (CEO)" <[email protected]>
Reply-To: <[email protected]>
Return-Path: <[email protected]>
Authentication-Results: mx.acme.com;
  spf=pass smtp.mailfrom=acme.com;
  dkim=pass header.d=acme.com;
  dmarc=pass header.from=acme.com
Subject: Are you at your desk? Need a quick favour, can't talk

Email 4

From: "Amazon Web Services" <[email protected]>
Return-Path: <[email protected]>
Authentication-Results: mx.acme.com;
  spf=pass smtp.mailfrom=amazonses.com;
  dkim=pass header.d=amazon.com;
  dmarc=pass (p=quarantine) header.from=amazon.com
Subject: Your AWS invoice for September is available

Email 5

From: "IT Helpdesk" <[email protected]>
Return-Path: <[email protected]>
Authentication-Results: mx.acme.com;
  spf=pass smtp.mailfrom=acme-it-support.com;
  dkim=pass header.d=acme-it-support.com;
  dmarc=pass header.from=acme-it-support.com
Subject: Password expires today. Reset now to avoid lockout

Stop here and commit to five answers.

Answers

Email 1 is phishing. Everything passes, and that is exactly the point: whoever sent it registered microsoft365-notices.com, published SPF and DKIM records for it, and so of course the checks pass. Authentication proves the mail came from the domain it claims. It never proves that domain belongs to Microsoft. The tell is the domain itself, plus the countdown in the subject.

Email 2 is genuine. The From domain is the real one, DKIM is signed by that same domain, and DMARC passed against a p=reject policy, which means the real owner would have rejected a forgery. The subject is ordinary. Nothing is asking you to hurry.

Email 3 is phishing, and it is the most dangerous of the five. The From address is a real acme.com address and every check passes, because it was sent through a service allowed to send as acme.com, or from a mailbox that was taken over, or simply because acme.com has a loose record. The giveaway is Reply-To: your answer goes to a Gmail account. Add "can't talk" and "quick favour" and this is the opening move of gift-card or wire fraud. The analyzer flags a diverging Reply-To for this reason.

Email 4 is genuine. It looks wrong if you only read Return-Path, which is a bulk-sending domain rather than amazon.com. That is normal: large senders bounce through a separate domain. What matters is that DKIM is signed by amazon.com and DMARC passed against the From domain. SPF and DKIM need not agree with each other; DMARC needs only one of them to line up with the From line.

Email 5 is phishing. Same shape as the first: a lookalike domain the sender controls, fully authenticated, with a same-day deadline. Your company's helpdesk writes from your company's domain. A brand-new domain with the company name baked into it is the most common form of credential phishing aimed at staff.

What the score means

Five out of five, and the Reply-To on email 3 jumped at you: you read headers for a living, or you have been burned once. Three or four: normal, and the gap is almost always emails 3 and 4, because they invert the rule people think they know. Two or fewer: you were deciding on the display name and the subject, which is the part the sender wrote for you.

The rule that survives this drill is short. Passing authentication tells you the domain is real. It tells you nothing about whether the domain is the one you meant. Read the domain, then read where a reply would go, then notice whether you are being hurried. The longer explanation covers why the checks were built this way.

Want a fresh one of these every morning? The Daily Adversary rotates forged headers through its week.

Try itPhishingScams
It looks strict. It permits everything. Which is which?Try it

Read this CSP: four policies, which one actually stops an XSS?

Four Content-Security-Policy headers that all look strict. Predict what each one really permits before you read the answers, then paste any of them into the CSP builder to confirm.

Hours on a video call. Here is how to end it.Scams

The digital arrest scam, explained: how it works and how to end the call

How the digital arrest scam traps people on a video call for hours, the red flags that give it away, and exactly what to do in the first hour if money has already gone.

Your fingers type lodahs. The install script runs anyway.Try it

Spot the typosquat: eight package names, which one is fake?

Eight install commands, each with one impostor package name hidden among the real ones. Train the instinct that reads a dependency name twice, because the install script runs before any of your code does.