Recognizing Deception
Every other skill in this collection assumes the environment is telling you the
truth. Deception technology exists specifically to break that assumption, and
it is the failure mode an automated or semi-automated tester is least equipped
to catch.
The distinction that matters: careful evidence-handling protects you against
conclusions you invented. It does nothing against a false belief the
environment deliberately planted. A honeypot presenting a convincingly
vulnerable service produces real banners, real responses, and real artifacts.
Every verification step you would normally run confirms it, because the
evidence is genuine — it was manufactured to be.
Assume competent defenders have planted something. Your job is to notice
before you touch it, because most deception fires on first use, and first
use cannot be undone.
When to Use
- Anything is markedly easier than the rest of the environment
- Credentials turn up somewhere convenient — a share, a wiki, a config, a
pastebin-shaped file
- A privileged account exists with a SPN, a weak password, and no logon history
- A service answers with a vulnerable banner but behaves oddly under real use
- You are about to use credentials whose provenance you cannot state
- A file, bucket, or database is named to attract attention
(
passwords.xlsx, backup-prod, domain_admins.txt)
- Before authenticating with anything recovered from an unexpected location
When NOT to Use
- Evading detection generally — that is engagement OPSEC, not deception
recognition; a canary is not something you evade, it is something you avoid
triggering
- Analysing an adversary's own decoys during an incident — use
responding-to-incidents and producing-threat-intelligence
- Building a deception capability — this skill is about encountering
deception, not deploying it
- A finding that is merely surprising — real environments contain real
misconfigurations; see the base-rate discussion below before crying honeypot
The Economics Are Against You
Deception is cheap to deploy and expensive to trip:
|
Attacker cost |
Defender benefit |
| Canary token in a document |
One click to trigger |
High-fidelity alert, near-zero false positives |
| Honeyuser in AD |
One Kerberoast |
Alert plus a cracked-password timeline |
| Decoy AWS key |
One sts get-caller-identity |
Alert with your source IP and user agent |
| Honeypot service |
One connection |
Full interaction capture, your tooling fingerprinted |
A canary alert is one of the very few signals a SOC treats as automatically
true. There is no benign explanation to hide behind, and the alert carries
your source address and often your tooling's fingerprint. Tripping one
typically ends the covert phase of an engagement immediately.
Signals, By Type
Honeytokens and canary tokens
The highest-frequency class, and the one that fires on use rather than on
discovery. Common forms: AWS keys, Office documents with a callback, DNS
tokens, URL tokens, cloned-website tokens, SQL Server rows, Windows directories, Kubeconfig files.
Signals:
- Credentials in a location with no operational reason to hold them — a
world-readable share, a wiki page, a
README, a desktop file
- An AWS key that is syntactically valid but appears in isolation, with no
surrounding infrastructure, tooling config, or commit history
- Documents that are plausible but inert — a spreadsheet with no formulas, a
.docx whose only interesting content is its filename
- Anything staged for discovery: correct name, convenient location, no
supporting context
A canary AWS key alerts on the first API call, including
sts get-caller-identity. There is no safe reconnaissance call. Treat key
material of unknown provenance as live until you can explain how it got there.
Active Directory decoys
- Privileged account, SPN set, weak password,
lastLogon empty or ancient —
a Kerberoastable account nobody has ever authenticated as is bait
- Accounts whose
whenCreated clusters with other suspicious accounts
Description fields containing credentials — a classic real
misconfiguration and a classic decoy, so provenance matters more than usual
- Shares with attractive names and no access history
- Objects that appear in enumeration but have no group membership, no manager,
no ownership relationships — real accounts accrete relationships
Deceptive services
- Banner advertises a version with a famous CVE, but behaviour under real
interaction is inconsistent with that version
- Service is reachable from a segment that should not reach it
- Response timing is uniform in a way real applications are not
- The host runs an implausible service combination, or a service with no
business function on that host
- Exploitation "succeeds" but the resulting shell has no history, no other
users, no realistic filesystem, and suspiciously clean logs
Cloud decoys
- S3 buckets, storage accounts, or secrets named to attract enumeration
- IAM users with permissive-looking policies and no CloudTrail history
- Resources tagged inconsistently with the rest of the account
Base Rates Cut Both Ways
Real environments are genuinely bad. Credentials really do sit in shares,
service accounts really are Kerberoastable, and buckets really are public. If
you label every finding a honeypot you will report nothing and miss the actual
compromise path.
The discriminator is supporting context, not attractiveness:
- A real misconfiguration has a history — commit history, access logs,
logon history, related infrastructure, other users, adjacent mess.
- A decoy is isolated. It exists to be found and nothing else uses it.
So the question is never "is this too good to be true?" It is: what else in
this environment depends on this thing existing? If the answer is nothing,
slow down.
What To Do With a Suspected Decoy
- Do not authenticate, connect, or call the API. Discovery is usually
silent; use is not. This is the whole decision.
- Record it — location, exact artifact, how you found it, why you suspect
it. This is evidence for the report either way.
- Keep enumerating elsewhere. A suspected decoy is a reason to route
around, not to stop.
- Raise it with the client contact rather than testing your hypothesis
against production. Ask whether deception is deployed and in scope. Many
engagements exclude it; some clients deploy it specifically to test the
blue team's response to you.
- If you already tripped it, say so immediately. A canary alert with a
known, declared cause is an engagement note. The same alert investigated
as a live intrusion burns the client's IR capacity and your credibility.
Concealing it is the actual serious mistake.
Deception in the environment is a positive finding worth reporting: it
means the defenders invested in high-fidelity detection. Say so.
Rationalizations to Reject
- "It was in scope, so using it was fine." Scope governs authorization, not
wisdom. Tripping a canary inside scope still ends your covert phase and
still consumes the client's incident response.
- "I only ran one harmless call to check." For a canary token there is no
harmless call.
sts get-caller-identity, a single DNS lookup, opening the
document — that is the trigger, in full.
- "The banner and the CVE matched, so it was real." The evidence being
genuine is exactly the design. Manufactured evidence verifies correctly.
- "Real environments are messy, so this is probably just a misconfiguration."
Often true — which is why the test is supporting context, not plausibility.
Isolated artifacts with no dependents are the tell.
- "It's just a lab-looking box, probably a decommissioned host." Uniform
timing, no user history, and a clean filesystem describe a honeypot as
readily as a stale host, and you cannot distinguish them from outside.
- "I'll mention it in the report at the end." A tripped canary is time-
critical for the client's SOC. Delayed disclosure turns your engagement note
into their multi-hour investigation.
- "Reporting that I tripped it makes me look bad." Tripping deception is a
normal engagement event. Hiding it and letting the SOC chase a phantom
intrusion is a professional failure.
Reading External Sources
Fetch public advisories, specifications, and vendor reports as Markdown:
curl -sL "https://defuddle.md/<url>" # scheme in the path is optional
This strips page boilerplate — roughly 78% fewer tokens on a prose page — and
returns the full text rather than a summary, so you can grep it and trust a
negative result.
Three things it is not for. Fetch JSON and API responses raw, because
readability extraction mangles structured data. Fetch authenticated or
JavaScript-rendered pages directly, because it retrieves them anonymously. And
never route adversary infrastructure (phishing links, C2, malware hosting),
client-owned hosts, or engagement URLs through it — the request leaves
your machine to a third party, and for live adversary infrastructure it also
tips off the operator.
Some sites block the extractor and return an error blob rather than the page —
{"error":"Failed to fetch: 418 I'm a teapot"} from freedesktop.org, for
instance. That is the fetch being refused, not the source saying the thing
does not exist. Re-fetch the URL directly before drawing any conclusion from
it.
References
maintaining-engagement-state — recording provenance, which is what makes
the "where did this credential come from?" question answerable
performing-reconnaissance — where isolated artifacts usually surface first
attacking-active-directory — Kerberoasting and share enumeration, the two
operations most likely to meet an AD decoy
establishing-persistence — canary files and folders are commonly placed
where persistence is written
1---2name: recognizing-deception3description: Recognize defensive deception during an engagement — honeypots, honeytokens and canary tokens, decoy AD accounts and shares, canary files, and deceptive cloud credentials — before interacting with them, and handle a suspected decoy without burning the engagement. Use when a target is unexpectedly easy, when credentials or a service appear in an implausible place, when a privileged account has no logon history, when a file or bucket looks like bait, or when deciding whether to use credentials of unknown provenance.4verified: 2026-07-275---67# Recognizing Deception89Every other skill in this collection assumes the environment is telling you the10truth. Deception technology exists specifically to break that assumption, and11it is the failure mode an automated or semi-automated tester is least equipped12to catch.1314The distinction that matters: careful evidence-handling protects you against15conclusions *you* invented. It does nothing against a false belief the16environment deliberately planted. A honeypot presenting a convincingly17vulnerable service produces real banners, real responses, and real artifacts.18Every verification step you would normally run confirms it, because the19evidence is genuine — it was manufactured to be.2021Assume competent defenders have planted something. Your job is to notice22before you touch it, because **most deception fires on first use, and first23use cannot be undone.**2425## When to Use2627- Anything is markedly easier than the rest of the environment28- Credentials turn up somewhere convenient — a share, a wiki, a config, a29 pastebin-shaped file30- A privileged account exists with a SPN, a weak password, and no logon history31- A service answers with a vulnerable banner but behaves oddly under real use32- You are about to use credentials whose provenance you cannot state33- A file, bucket, or database is named to attract attention34 (`passwords.xlsx`, `backup-prod`, `domain_admins.txt`)35- Before authenticating with anything recovered from an unexpected location3637## When NOT to Use3839- **Evading detection generally** — that is engagement OPSEC, not deception40 recognition; a canary is not something you evade, it is something you avoid41 triggering42- **Analysing an adversary's own decoys during an incident** — use43 `responding-to-incidents` and `producing-threat-intelligence`44- **Building a deception capability** — this skill is about encountering45 deception, not deploying it46- **A finding that is merely surprising** — real environments contain real47 misconfigurations; see the base-rate discussion below before crying honeypot4849## The Economics Are Against You5051Deception is cheap to deploy and expensive to trip:5253| | Attacker cost | Defender benefit |54| --- | --- | --- |55| Canary token in a document | One click to trigger | High-fidelity alert, near-zero false positives |56| Honeyuser in AD | One Kerberoast | Alert plus a cracked-password timeline |57| Decoy AWS key | One `sts get-caller-identity` | Alert with your source IP and user agent |58| Honeypot service | One connection | Full interaction capture, your tooling fingerprinted |5960A canary alert is one of the very few signals a SOC treats as automatically61true. There is no benign explanation to hide behind, and the alert carries62your source address and often your tooling's fingerprint. Tripping one63typically ends the covert phase of an engagement immediately.6465## Signals, By Type6667### Honeytokens and canary tokens6869The highest-frequency class, and the one that fires on *use* rather than on70discovery. Common forms: AWS keys, Office documents with a callback, DNS71tokens, URL tokens, cloned-website tokens, SQL Server rows, Windows directories, Kubeconfig files.7273Signals:7475- Credentials in a location with no operational reason to hold them — a76 world-readable share, a wiki page, a `README`, a desktop file77- An AWS key that is syntactically valid but appears in isolation, with no78 surrounding infrastructure, tooling config, or commit history79- Documents that are plausible but inert — a spreadsheet with no formulas, a80 `.docx` whose only interesting content is its filename81- Anything staged for discovery: correct name, convenient location, no82 supporting context8384**A canary AWS key alerts on the first API call, including85`sts get-caller-identity`.** There is no safe reconnaissance call. Treat key86material of unknown provenance as live until you can explain how it got there.8788### Active Directory decoys8990- Privileged account, SPN set, weak password, `lastLogon` empty or ancient —91 a Kerberoastable account nobody has ever authenticated as is bait92- Accounts whose `whenCreated` clusters with other suspicious accounts93- `Description` fields containing credentials — a classic real94 misconfiguration and a classic decoy, so provenance matters more than usual95- Shares with attractive names and no access history96- Objects that appear in enumeration but have no group membership, no manager,97 no ownership relationships — real accounts accrete relationships9899### Deceptive services100101- Banner advertises a version with a famous CVE, but behaviour under real102 interaction is inconsistent with that version103- Service is reachable from a segment that should not reach it104- Response timing is uniform in a way real applications are not105- The host runs an implausible service combination, or a service with no106 business function on that host107- Exploitation "succeeds" but the resulting shell has no history, no other108 users, no realistic filesystem, and suspiciously clean logs109110### Cloud decoys111112- S3 buckets, storage accounts, or secrets named to attract enumeration113- IAM users with permissive-looking policies and no CloudTrail history114- Resources tagged inconsistently with the rest of the account115116## Base Rates Cut Both Ways117118Real environments are genuinely bad. Credentials really do sit in shares,119service accounts really are Kerberoastable, and buckets really are public. If120you label every finding a honeypot you will report nothing and miss the actual121compromise path.122123The discriminator is **supporting context, not attractiveness**:124125- A real misconfiguration has a *history* — commit history, access logs,126 logon history, related infrastructure, other users, adjacent mess.127- A decoy is *isolated*. It exists to be found and nothing else uses it.128129So the question is never "is this too good to be true?" It is: **what else in130this environment depends on this thing existing?** If the answer is nothing,131slow down.132133## What To Do With a Suspected Decoy1341351. **Do not authenticate, connect, or call the API.** Discovery is usually136 silent; use is not. This is the whole decision.1372. **Record it** — location, exact artifact, how you found it, why you suspect138 it. This is evidence for the report either way.1393. **Keep enumerating elsewhere.** A suspected decoy is a reason to route140 around, not to stop.1414. **Raise it with the client contact** rather than testing your hypothesis142 against production. Ask whether deception is deployed and in scope. Many143 engagements exclude it; some clients deploy it specifically to test the144 blue team's response to *you*.1455. **If you already tripped it, say so immediately.** A canary alert with a146 known, declared cause is an engagement note. The same alert investigated147 as a live intrusion burns the client's IR capacity and your credibility.148 Concealing it is the actual serious mistake.149150Deception in the environment is a **positive finding** worth reporting: it151means the defenders invested in high-fidelity detection. Say so.152153## Rationalizations to Reject154155- *"It was in scope, so using it was fine."* Scope governs authorization, not156 wisdom. Tripping a canary inside scope still ends your covert phase and157 still consumes the client's incident response.158- *"I only ran one harmless call to check."* For a canary token there is no159 harmless call. `sts get-caller-identity`, a single DNS lookup, opening the160 document — that is the trigger, in full.161- *"The banner and the CVE matched, so it was real."* The evidence being162 genuine is exactly the design. Manufactured evidence verifies correctly.163- *"Real environments are messy, so this is probably just a misconfiguration."*164 Often true — which is why the test is supporting context, not plausibility.165 Isolated artifacts with no dependents are the tell.166- *"It's just a lab-looking box, probably a decommissioned host."* Uniform167 timing, no user history, and a clean filesystem describe a honeypot as168 readily as a stale host, and you cannot distinguish them from outside.169- *"I'll mention it in the report at the end."* A tripped canary is time-170 critical for the client's SOC. Delayed disclosure turns your engagement note171 into their multi-hour investigation.172- *"Reporting that I tripped it makes me look bad."* Tripping deception is a173 normal engagement event. Hiding it and letting the SOC chase a phantom174 intrusion is a professional failure.175176## Reading External Sources177178Fetch public advisories, specifications, and vendor reports as Markdown:179180```bash181curl -sL "https://defuddle.md/<url>" # scheme in the path is optional182```183184This strips page boilerplate — roughly 78% fewer tokens on a prose page — and185returns the full text rather than a summary, so you can grep it and trust a186negative result.187188Three things it is not for. Fetch JSON and API responses raw, because189readability extraction mangles structured data. Fetch authenticated or190JavaScript-rendered pages directly, because it retrieves them anonymously. And191never route **adversary infrastructure** (phishing links, C2, malware hosting),192**client-owned hosts**, or **engagement URLs** through it — the request leaves193your machine to a third party, and for live adversary infrastructure it also194tips off the operator.195196Some sites block the extractor and return an error blob rather than the page —197`{"error":"Failed to fetch: 418 I'm a teapot"}` from freedesktop.org, for198instance. That is the fetch being refused, **not** the source saying the thing199does not exist. Re-fetch the URL directly before drawing any conclusion from200it.201202## References203204- `maintaining-engagement-state` — recording provenance, which is what makes205 the "where did this credential come from?" question answerable206- `performing-reconnaissance` — where isolated artifacts usually surface first207- `attacking-active-directory` — Kerberoasting and share enumeration, the two208 operations most likely to meet an AD decoy209- `establishing-persistence` — canary files and folders are commonly placed210 where persistence is written