CtrlK
BlogDocsLog inGet started
Tessl Logo

lure-deconfliction

Mandatory out-of-band handshake with the blue-team contact BEFORE any phishing campaign sends. Skipping this is a critical RoE violation - the engagement has no legal coverage for unannounced phishing of real employees.

60

Quality

71%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Critical

Do not install without reviewing

Fix and improve this skill with Tessl

tessl review fix ./packages/decepticon/decepticon/skills/standard/phisher/lure-deconfliction/SKILL.md
SKILL.md
Quality
Evals
Security

Lure Deconfliction

Before the first email leaves the wire, the customer's blue-team contact MUST acknowledge the campaign metadata. This is the legal coverage for the engagement - without it, you're a malicious phisher.

Why this is mandatory

A phishing campaign that surprises the blue team produces:

  • Helpdesk ticket volume (real users reporting suspicious mail).
  • Detection rules firing on lookalike domains, RoE-out-of-scope.
  • Escalation to leadership / external counsel.
  • Potential SOC overtime that the engagement is supposed to test with awareness, not as a surprise.

It also exposes the engagement to legal risk: phishing without written authorization is a crime in most jurisdictions. The RoE + deconfliction ack is the documentation that protects the operator.

Inputs you need

From plan/roe.json:

{
  "escalation_contacts": {
    "blue_team_contact": {
      "name": "...",
      "channel": "signal:@user / email: addr / phone: +...",
      "available": "Mon-Fri 09:00-18:00 KST",
      "ack_method": "signal_message | email_reply | voice_confirm"
    }
  },
  "engagement_id": "RT-2026-0142"
}

Handshake payload

Construct ONE message containing:

Subject: [DECEPTICON RT-2026-0142] Phishing campaign deconfliction

Engagement: RT-2026-0142
Campaign id: <gophish-campaign-id-or-evilginx-phishlet>
Send window: 2026-05-27 14:00 - 16:00 KST
Target count: <N> users
Target population: <description, e.g. "all @engineering of acme.com">
Pretext class: <internal_it_password_reset | external_invoice | shared_doc | ...>
Lure URL: https://login.acme-portal.example/
Lure domain registration: 2026-05-26 (lookalike of acme.com)
Opt-out URL (in every lure): https://decepticon.example/optout/RT-2026-0142

REQUEST: confirm you've received this message before 13:30 KST.
If we have not received an ack by 13:45 KST, the campaign WILL NOT send
and the objective will be marked BLOCKED.

Send it via the configured channel

The ack_method in roe.json drives:

  • signal_message: bash -c 'signal-cli -u <operator> send -m "..." <contact>'
  • email_reply: standard SMTP via the engagement's deconfliction mailbox.
  • voice_confirm: log the planned call in plan/phisher/deconfliction-log.md; operator must complete the call out-of-band and update the log before the campaign send-time.

Wait for ack

Poll the channel until the ack arrives OR the deadline expires.

while true; do
  if ack_received; then break; fi
  if past_deadline; then
    update_objective(status='blocked',
      reason='blue-team contact unreachable for lure-deconfliction')
    return
  fi
  sleep 60
done

Record evidence

Append to plan/phisher/deconfliction-log.md:

## Campaign RT-2026-0142 / gophish-id-12

- Sent: 2026-05-27 12:31:04 UTC via signal_message
- Recipient: <contact>
- Ack received: 2026-05-27 12:48:11 UTC
- Ack message id: <signal-message-id>
- Ack text: "Acknowledged, send window 14:00-16:00 KST approved."

Persist as a Finding node in the knowledge graph with finding_type: "deconfliction_ack", the ack message id, and the timestamp. This is the audit trail for the engagement deliverable.

Failure modes

  • Contact unreachable: pause objective, ask operator via ask_user_question for an alternate contact or a write-down.
  • Contact denies the campaign: the campaign DOES NOT send. The objective is marked BLOCKED with the denial recorded. The orchestrator may dispatch you against a different target user set, or move to a different INITIAL_ACCESS technique.
  • Contact requests modification (e.g. "not the CFO, but their assistant is fine"): update the target list and re-send the handshake.

ZFP

Two-method evidence for the ack:

  1. The actual ack message from the channel.
  2. The Finding node with the message id in Neo4j.

Both must exist before the campaign send-step proceeds.

Repository
PurpleAILAB/Decepticon
Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.