Red-team operator discipline — the mindset corrections that separate offensive testing from defensive WAPT. Built from authorized red-team work where conservative defaults caused multiple findings to be missed and one to be incorrectly retracted. Use at the START of any red-team engagement and again whenever feeling stuck or considering "stopping" on a defended target. The single most important skill to load when scope is "external red team" not "bug bounty / WAPT".
npx skills add https://github.com/elementalsouls/Claude-BugHunter --skill redteam-mindset
Trigger when:
DO NOT use for:
Red team scope = "gain access, prove impact". Bug bounty / WAPT scope = "find a bug, write a report".
These produce DIFFERENT decisions at every blocker. Internalize the difference before starting.
The 9 corrections below are nuance. THIS is the core. If you only retain one thing from this skill, retain this.
Do not insert mid-engagement permission gates. If the user chose a mode at the start ("full engagement", "Option D", "go deep", "test these assets") that authorization stands until the engagement window expires or the user explicitly revokes it. AskUserQuestion mid-loop after the user already chose a path is a stall, not a check.
Read this twice. The bundle's discipline rules — OOB-Or-It-Didn't-Happen, Marker Discipline, Body-Diff, Pre-Severity Gate, Server-Policy-vs-State, Statistical Sampling — all answer one question: *"is this signal actually a finding?"*. None of them answer the question *"should I send the next probe?"* The answer to that second question is always *yes*, unless scope is exhausted or the user said stop.
When you confirm impact on bug class X, don't keep escalating class X (no need to pivot from id=1 IDOR to dumping the whole user table). But classes Y and Z have not been tested yet. Run Y. Then Z. Then the rest of the Pattern Library.
"Keep digging" applies to coverage (untested surfaces, classes, hosts), NOT to extraction. These pull in opposite directions and the persistence directive must NOT bleed into over-collection:
totalCount (a number, not the data), proof a *second endpoint family* is affected (breadth), or quantified blast-radius. Get the MINIMUM evidence that satisfies the stated goal.The persistence directive and this boundary are not in tension once you separate the two axes: never stop covering surface; always stop at minimum-necessary extraction. Authorized ≠ unrestricted.
Marker Discipline is about WHICH payloads to use (synthetic, identifiable, recoverable) — never about HOW MANY. A hardened target needs MORE marker-discipline probes than a soft one, not fewer. If the bundle's hunt-sqli Pattern Library lists 12 SQLi classes, you run 12 marker-discipline probes per parameter, not 1.
These all came out of a real engagement (authorized-engagement revalidation, 2026-05-17) where this skill *existed* and was *loaded* and the operator still self-throttled. The lesson is to make the failure modes explicit:
GET it. Decode it. Pass it back. A view.php?view=<constant-md5> redirect is a session/auth/error-key signal, not noise.brew install jadx, apkpure direct download, apk-redteam-pipeline already documents the flow. Five minutes of setup, not "another session."AskUserQuestion at any decision point inside an active engagement loop. If the user picked a mode at start, that mode is in effect until revoked. Choosing operationally between e.g. SAML acs raw POST vs SAML acs replay is a *technical* decision the operator can make and document — it does not require user pre-approval.10. Skill-gap-as-stop-condition. "No hunt-zoho skill exists, so I logged a v1.1 gap and moved on." NO. If a hunt-* skill doesn't exist for a discovered tech stack, do the same work *manually* using the vendor's public check matrix. Log the gap in v1.1 roadmap *and* run the checks now.
Per live host, before declaring the host complete:
/*.js.map, /static/js/*.js.map, /_next/static/*.js.map, /build/*.js.map)If you've done less than this per host, you have not finished the host. The engagement is not done until every host is finished.
Anti-pattern (what I did wrong):
> "Recheck under load showed no timing differential — recanting the SQLi as indeterminate."
The correct frame:
> "The original 3-sample baseline (σ = 32 ms) with three distinct SLEEP payloads each adding +6 s is statistically definitive. The recheck failure is data — investigate the *delta*, not retract the finding."
When a defense suddenly appears mid-engagement:
Rule: never retract a finding on first reproducibility failure. Investigate why before declaring false positive.
Anti-pattern:
> "I confirmed SQLi on /app-a/. Moving on to other tasks."
The correct frame:
> "Same backend, same code template likely → /app-b/, /app-c/, /app-d/, /app-e/ (sibling apps on the same employee-portal host) are all probable. Test them with the SAME payload."
When you confirm a vuln on app A:
The authorized-engagement case: SQLi confirmed on one sub-app (<app-A>); four sibling sub-apps (<app-B>, <app-C>, <app-D>, <app-E>) sit on the same employee-app host with similar form patterns — likely all share the same vulnerable template. Should have been a multi-app finding.
Skip these in red team scope (they don't yield access):
Pursue these (they DO yield access):
Decision rule: if the bug, exploited fully, doesn't lead to a session/token/foothold or sensitive data exfil, it's WAPT-class — note it briefly but don't burn time on it.
Anti-pattern:
> "Tested 30% of the websites and called it comprehensive."
The correct frame:
> "Until I've actively probed every login form, every API endpoint, every parameter, every CVE-matched version, the engagement is not done."
Aggressive defaults:
Rule: if you haven't actively probed *every* live surface (not just a sampled fraction), you haven't done red team yet — you've done recon.
Anti-pattern:
> "Tesseract failed on 3 captchas, gave up, declared captcha bypass not feasible."
The correct frame:
> "Tesseract failed. Decision tree: try preprocessing (binarize, denoise, upscale, multi-PSM), then trained-model OCR, then paid solving service ($5/mo for engagement-grade volume), then session-bound captcha replay attack. A real attacker WILL invest the $5."
Decision-tree for blockers:
Captcha:
WAF:
Rate limit:
Slow target (timing-based exfil too slow):
Rule: when one path fails, the next move is "another vector to the same goal", not "documented as not vulnerable". A real adversary doesn't have an engagement window.
When the client SOC patches mid-engagement (you observe a vulnerability disappear during your test):
This is its own skill: see mid-engagement-ir-detection.
For every "vulnerable" finding, prove via 2+ techniques:
| Vuln class | Primary | Cross-check |
|---|---|---|
| Time-based blind SQLi | SLEEP() differential | Different SLEEP variants (3 distinct payloads min) |
| Boolean blind SQLi | Body-size differential | Different boolean comparisons |
| Error-based SQLi | Error message reflection | UPDATEXML + EXTRACTVALUE both |
| RCE | Command output reflection | OOB callback (interactsh DNS) |
| LFI | File content reflection | Different file paths, different encodings |
| SSRF | Internal-only response | OOB callback (interactsh DNS) |
| Valid credential (M365) | ROPC + AADSTS53003 | SAML SSO browser flow + ConvergedConditionalAccess page |
| Auth bypass | Logged-in landing page | Session cookie persistence on subsequent request |
A single signal can be coincidence (network jitter, server hiccup, cache). Two distinct signals from the same root cause is definitive.
Real-time, append-only, structured:
{"ts":"2026-05-08T14:40:53","ip":"<src-ip>","tool":"m365_validator","target":"login.microsoftonline.com","payload":"user1@<client>.example:<pw-r4>***","resp_code":400,"resp_body_size":154,"resp_ms":1280,"aadsts":"AADSTS53003","verdict":"VALID_CA_BLOCK","notes":""}
Why:
Anti-pattern: ad-hoc shell commands with no logging. You will lose the original PoC timestamp when you need it most (recheck failed, can't prove the original signal was real).
A real adversary has months. You have an engagement window (weeks). Decisions:
engagement_log/) make Wednesday's work usable on Friday.Before starting a red team engagement, confirm:
engagement_log/ with attempt counter, results JSONL, IP log)Every 30 minutes ask:
Before declaring done:
If you catch yourself thinking any of these, STOP and reconsider:
Only stop when:
NOT legitimate stop conditions (each of these has produced a real failure):
brew install, apt install, direct-download → most engagement tools install in under 5 minutesAfter internalizing this mindset, layer the technique-specific skills:
m365-entra-attack — M365 credential attack chainmid-engagement-ir-detection — turning client SOC patches into findingshunt-sqli — SQL injection across techniqueshunt-rce — RCE across vectorsbug-bounty — for distinguishing red-team vs bb scope when working dual-trackThis skill is the operational discipline; those are the techniques.
recon-scope-triage — Before the "aggressive default, probe every live surface" directive can be applied safely, you must know which surfaces are actually the target's. Engagement flow: ASM/recon dataset received → recon-scope-triage clears namespace-collision noise + soft-404 false positives → only owned, verified assets enter the test queue. Skipping this wastes the engagement on other companies' assets (and risks attacking innocent third parties).hunt-spa-api — Operationalizes the "harvest JS bundles" cadence line into a full play: SPA JS → backend API map → unauthenticated broken-access-control testing. On a real engagement this play (not any scanner) found the apex Critical. Engagement flow: live SPA/console/app/api host identified → hunt-spa-api → test each route family unauthenticated against a gated-sibling control.hunt-dispatch — Once mindset is loaded, the /hunt command needs a mode answer (redteam vs wapt, blackbox vs greybox) before it routes to platform-specific skills. Engagement flow: red-team mindset triggered → confirm engagement mode (bug-bounty vs red-team vs pentest per project memory) → invoke /hunt → hunt-dispatch loads the right cluster (M365 / SharePoint / VPN / vCenter / APK).mid-engagement-ir-detection — Red-team mindset says "behavior changes ARE findings"; this skill operationalizes that. Engagement flow: red-team engagement underway → baseline established at session start → response patterns shift mid-test → mid-engagement-ir-detection captures the SOC-patch state as a NEW finding (defensive-action observed = client capability metric). Don't dismiss it as "the bug got fixed."redteam-report-template — Red-team deliverable is NOT a bug-bounty report; different audience, different tone, different cadence. Engagement flow: findings collected throughout engagement → at session close, package via redteam-report-template (Subject / Observations / Description / Impact / Recommendation / PoC) for client-facing DOCX, not report-writing which is for H1/Bugcrowd/Intigriti platforms.triage-validation — Red-team mindset includes "don't retract too fast" — the 4 retractions from an authorized engagement were mindset failures, not validation failures. Engagement flow: every finding through triage-validation 7-Question Gate, but with the red-team adjustment that "exploitable only with chain" is still a finding, not a no-finding.evidence-hygiene — Red-team engagements often span weeks; without disciplined evidence capture the deliverable suffers. Engagement flow: red-team mindset triggered → set up evidence-hygiene capture cadence (screenshots, request/response dumps, timestamped logs) at session start, not at session close.Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup
Use when implementing any feature or bugfix, before writing implementation code
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes
Use when about to claim work is complete, fixed, or passing, before committing or creating PRs - requires running verification commands and confirming output before making any success claims; evidence before assertions always
Expert guidance for systematic backtesting of trading strategies. Use when developing, testing, stress-testing, or validating quantitative trading strategies. Covers "beating ideas to death" methodology, parameter robustness testing, slippage modeling, bias prevention, and interpreting backtest results. Applicable when user asks about backtesting, strategy validation, robustness testing, avoiding overfitting, or systematic trading development.
Cloud laboratory platform for automated protein testing and validation. Use when designing proteins and needing experimental validation including binding assays, expression testing, thermostability measurements, enzyme activity assays, or protein sequence optimization. Also use for submitting experiments via API, tracking experiment status, downloading results, optimizing protein sequences for better expression using computational tools (NetSolP, SoluProt, SolubleMPNN, ESM), or managing protein design workflows with wet-lab validation.
This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search. Use when working with temporal data, sequential patterns, or time-indexed observations requiring specialized algorithms beyond standard ML approaches. Particularly suited for univariate and multivariate time series analysis with scikit-learn compatible APIs.
Take elementalsouls/redteam-mindset from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference brew.
Without those the skill loads but fails at the first command.