From a1edcb4ee27f66314176a719ec49f09eb54e8794 Mon Sep 17 00:00:00 2001 From: shuvonsec <83355567+shuvonsec@users.noreply.github.com> Date: Fri, 23 Oct 2026 15:59:28 +0800 Subject: [PATCH] Fix stale tools/ paths from the bughunter/ restructure (#175) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What: repointed 259 `tools/` references to `bughunter/tools/` across command/skill/agent docs, CLAUDE.md, AGENTS.md, README and the live docs; fixed the .gitignore lead-board anchor to match both layouts; added a CI job that fails on unresolvable command/skill tool paths; documented php_filter_chain_generator.py as the external synacktiv tool (not shipped here) Why: #175 — the tools/ -> bughunter/tools/ move (025367b / #148) did not update call sites, so agents hit "No such file or directory" and the test suite dirtied the working tree Update: 57 files (55 docs rewritten, .gitignore, .github/workflows/tests.yml); historical CHANGELOG / docs/phase* / TODOS / CAPABILITY-GAPS left as-is; no code under bughunter/ touched Test: every referenced bughunter/tools/* path exists; new guard PASSES on the fixed tree and CATCHES an injected stale path; git check-ignore matches memory/leads/ at both root and bughunter/ depth --- .github/workflows/tests.yml | 25 +++++++ .gitignore | 3 +- AGENTS.md | 18 ++--- CLAUDE.md | 72 +++++++++---------- README.md | 2 +- bughunter/agents/credential-hunter.md | 12 ++-- bughunter/agents/report-writer.md | 2 +- bughunter/agents/token-auditor.md | 6 +- bughunter/tools/README.md | 14 ++-- commands/arsenal.md | 2 +- commands/autopilot.md | 4 +- commands/breach-check.md | 2 +- commands/bypass-403.md | 16 ++--- commands/cors.md | 2 +- commands/crlf.md | 2 +- commands/dashboard.md | 6 +- commands/domxss.md | 4 +- commands/hunt.md | 38 +++++----- commands/jwt-scan.md | 4 +- commands/llm-app-audit.md | 6 +- commands/llm-redteam.md | 4 +- commands/nosqli.md | 2 +- commands/oob.md | 6 +- commands/oracle.md | 6 +- commands/osint-employees.md | 2 +- commands/param-discover.md | 2 +- commands/poc.md | 6 +- commands/portscan.md | 4 +- commands/recon.md | 24 +++---- commands/sast.md | 4 +- commands/scope-aggregate.md | 2 +- commands/scope.md | 4 +- commands/screenshot.md | 4 +- commands/spray.md | 4 +- commands/takeover.md | 2 +- commands/token-scan.md | 6 +- commands/verify.md | 6 +- commands/wordlist-gen.md | 4 +- docs/TUTORIAL.md | 12 ++-- docs/auth-sessions.md | 20 +++--- docs/mcp-tools.md | 2 +- docs/research-learning-schema.md | 8 +-- skills/agentic-app-audit/SKILL.md | 2 +- skills/argus/SKILL.md | 28 ++++---- skills/bb-methodology/SKILL.md | 34 ++++----- skills/bug-bounty/SKILL.md | 16 ++--- skills/cicd-security/SKILL.md | 10 +-- skills/credential-attack/SKILL.md | 12 ++-- skills/graphql-audit/SKILL.md | 10 +-- skills/llm-redteam/SKILL.md | 12 ++-- skills/meme-coin-audit/SKILL.md | 6 +- skills/report-writing/SKILL.md | 2 +- .../METHODOLOGY_CHEATSHEET.md | 2 +- skills/security-arsenal/REFERENCES.md | 2 +- skills/security-arsenal/SKILL.md | 12 ++-- skills/web2-vuln-classes/SKILL.md | 11 +-- tests/benchmark/README.md | 2 +- 57 files changed, 281 insertions(+), 254 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 00a2145b..345be425 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -38,3 +38,28 @@ jobs: - name: Run test suite run: pytest -q + + tool-paths: + name: tool paths resolve + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Invoked tool paths must exist + run: | + # Every `bash|python3 /.{py,sh}` in commands/ and skills/ must + # resolve to a real file. Bare filenames (no slash) are external tools and + # are skipped. Guards against the bughunter/ restructure leaving stale paths. + missing=0 + while IFS= read -r p; do + case "$p" in + */*) if [ ! -f "$p" ]; then echo "MISSING: $p"; missing=1; fi ;; + *) : ;; + esac + done < <(grep -rhoE '(bash|python3?) [A-Za-z0-9/._-]+\.(py|sh)' commands/ skills/ \ + | awk '{print $2}' | sort -u) + if [ "$missing" -ne 0 ]; then + echo "::error::command/skill docs reference tool paths that do not exist (see MISSING lines)" + exit 1 + fi + echo "All invoked tool paths resolve." diff --git a/.gitignore b/.gitignore index 7f09cf59..2114f981 100644 --- a/.gitignore +++ b/.gitignore @@ -50,6 +50,7 @@ nmap-output/ .forge/ # Runtime lead-board ledgers (per-target, regenerated on each hunt) -memory/leads/ +# ** matches both the repo-root layout and bughunter/memory/leads/ after the bughunter/ move +**/memory/leads/ dist/ build/ diff --git a/AGENTS.md b/AGENTS.md index 27e6ed32..42885880 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -79,15 +79,15 @@ This repo is an agent-portable bug bounty plugin for professional hunting across ### Tools (Python/shell — in `tools/`) -See **`tools/README.md`** for the full ~50-tool catalogue. Highlights: - -- `tools/hunt.py` — master orchestrator (auto lead-board ingest + EOL after recon; `--graphql` / `--cve-hunt` / `--zero-day`) -- `tools/lead_board.py` — persistent recon→skill lead ledger (`ingest` / `show` / `next` / `touch`) -- `tools/recon_engine.sh` · `vuln_scanner.sh` · `validate.py` · `scope_checker.py` -- `tools/graphql_audit.sh` · `cicd_scanner.sh` · `cve_scan.sh` · `eol_check.py` -- `tools/waf_encoder.py` · `waf_response_analyzer.py` · `multipart_mutator.py` · `bypass_403.sh` -- `tools/external_arsenal.sh` — installed-tool registry (~50 tools); `_have ` gate -- `tools/secrets_hunter.sh` · `takeover_scanner.sh` · `cloud_recon.sh` · `param_discovery.sh` +See **`bughunter/tools/README.md`** for the full ~50-tool catalogue. Highlights: + +- `bughunter/tools/hunt.py` — master orchestrator (auto lead-board ingest + EOL after recon; `--graphql` / `--cve-hunt` / `--zero-day`) +- `bughunter/tools/lead_board.py` — persistent recon→skill lead ledger (`ingest` / `show` / `next` / `touch`) +- `bughunter/tools/recon_engine.sh` · `vuln_scanner.sh` · `validate.py` · `scope_checker.py` +- `bughunter/tools/graphql_audit.sh` · `cicd_scanner.sh` · `cve_scan.sh` · `eol_check.py` +- `bughunter/tools/waf_encoder.py` · `waf_response_analyzer.py` · `multipart_mutator.py` · `bypass_403.sh` +- `bughunter/tools/external_arsenal.sh` — installed-tool registry (~50 tools); `_have ` gate +- `bughunter/tools/secrets_hunter.sh` · `takeover_scanner.sh` · `cloud_recon.sh` · `param_discovery.sh` - Credential attack (opt-in): `wordlist_engine.sh` · `osint_employees.sh` · `breach_checker.py` · `spray_orchestrator.sh` - Web3: `token_scanner.py` diff --git a/CLAUDE.md b/CLAUDE.md index 2519acce..7cf25d27 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -91,42 +91,42 @@ This repo is a Claude Code plugin for professional bug bounty hunting across Hac ### Tools (Python/shell — in `tools/`) -- `tools/hunt.py` — master orchestrator -- `tools/recon_engine.sh` — subdomain + URL discovery (now with optional `nuclei` phase) -- `tools/vuln_scanner.sh` — XSS/SQLi/SSTI/MFA/SAML probe pipeline -- `tools/validate.py` — 4-gate finding validator -- `tools/learn.py` — CVE + disclosure intel -- `tools/intel_engine.py` — on-demand intel with memory context -- `tools/scope_checker.py` — deterministic scope safety checker -- `tools/scope_aggregator.sh` — multi-platform scope pull (bbscope + bounty-targets-data) -- `tools/secrets_hunter.sh` — trufflehog/noseyparker/gitleaks wrapper for FS/git/JS/GH-org -- `tools/takeover_scanner.sh` — dnsReaper/subjack subdomain-takeover scanner -- `tools/cloud_recon.sh` — S3Scanner + cloud_enum + CloudFail wrapper -- `tools/param_discovery.sh` — Arjun/x8 hidden-parameter discovery -- `tools/bypass_403.sh` — byp4xx + built-in 403/401 bypass matrix -- `tools/cve_scan.sh` — focused nuclei CVE-tag sweep + optional log4j-scan -- `tools/external_arsenal.sh` — installed-tool registry (~50 tools); other scripts source this for `_have ` -- `tools/cicd_scanner.sh` — GitHub Actions workflow scanner (sisakulint wrapper, remote scan) -- `tools/token_scanner.py` — automated token red flag scanner (EVM + Solana) -- `tools/wordlist_engine.sh` — company-specific password wordlist generator (cewler + hashcat rules); requires `--with-credential-attack` -- `tools/osint_employees.sh` — employee names + email patterns for spray prep (theHarvester + username-anarchy, opt-in CrossLinked); requires `--with-credential-attack` -- `tools/breach_checker.py` — HIBP k-anonymity wordlist enrichment; ranks passwords by breach count (no API key, free) -- `tools/spray_orchestrator.sh` — password spray with typed-hostname guard + lockout warning + audit log; modes: http-form / oauth / o365 / okta (TREVOR); requires `--with-credential-attack` for TREVOR modes -- `tools/graphql_audit.sh` — 7-phase GraphQL audit: introspection + schema dump, graphw00f fingerprint, clairvoyance field discovery, batching DoS, alias bomb, gqlmap injection, graphql-cop checklist -- `tools/lead_board.py` — persistent per-target lead ledger that routes every recon observation to the right `hunt-*` skill and tracks its status so no lead is forgotten (`memory/leads/.jsonl`). `ingest` parses recon output and routes 30+ signal types (IDOR/SSRF/GraphQL/OAuth/SAML/LLM/source-leak/tech-stack/nuclei) to skills; `show` lists untouched-first and flags stale high-priority leads; `next` returns the single top lead; `touch` marks a lead investigating/killed/reported (re-ingest preserves status). See **Critical Rule 6**. -- `tools/eol_check.py` — EOL / lifecycle intel from endoflife.date (auto-run by `hunt.py` after recon) -- `tools/waf_encoder.py` · `waf_response_analyzer.py` · `multipart_mutator.py` — WAF bypass + soft-block scoring + upload mutation -- `tools/cors_scanner.py` — CORS misconfig scanner (origin-reflection / null / credentialed / suffix-prefix regex / scheme-downgrade); pure classifier, no deps -- `tools/crlf_scanner.py` — CRLF / response-splitting + host-header injection with Set-Cookie canary detection (encoded + UTF-8 bypass variants) -- `tools/nosqli_scanner.py` — NoSQL injection (operator auth-bypass, bracket-syntax, $where time-based blind) with differential + timing classifier -- `tools/jwt_scanner.py` — offline JWT toolkit: alg:none forgery, RS256→HS256 confusion, HS256 secret crack, static claim analysis (pure stdlib) -- `tools/oob_listener.py` — out-of-band orchestrator wrapping interactsh-client; payloads + correlation for blind SSRF/XXE/SQLi/RCE/Log4Shell -- `tools/llm_redteam.py` — LLM red-team corpus runner (prompt-injection/jailbreak/system-prompt-leak/exfil/indirect/guardrail-bypass) with canary detection -- `tools/poc_bundler.py` — PoC evidence bundler (`capture` live via SSRF-guarded `safe_http`, or `from-request` offline from a saved/Burp request). Emits `request.http`, `response.http`, `repro.sh` (curl), `evidence.har` (HAR 1.2), optional `screenshot.png`, `evidence.md` (report-ready), and `bundle.json` (manifest + response SHA-256) under `findings/-/evidence//`. Secrets redacted by default (repro.sh uses `$ENV` placeholders); refuses PUT/DELETE/PATCH without `--confirm-unsafe`. See `/poc`. -- `tools/hunt_dashboard.py` — local web Hunt Dashboard (`serve`/`export`); reads `memory/leads/`, `recon/`, `findings/`, `reports/`, galleries, and `hunt-memory/` into one live view. Pure stdlib, binds to 127.0.0.1, HTML-escapes all recon-derived data, path-traversal-guarded `/file` endpoint. Distinct from `tools/dashboard.py` (the in-terminal ANSI progress TUI). See `/dashboard`. -- `tools/verifier.py` — the report gate (prove-or-suppress). Independently re-derives a finding from its `poc_bundler` bundle (re-sends via SSRF-guarded `safe_http` with an initial-host guard, checks a confirmation marker in the fresh response headers+body) and decides reportability: PROVEN only if the marker was in the original response AND is still present now; else REFUTED/UNPROVEN/INCONCLUSIVE → suppressed. Records the re-fetched response's SHA + status. `decide()` is a pure, total policy function; only PROVEN ships. Writes `verification.json`; `check`/`sweep`; `--require-proof` exits non-zero for gating; unsafe methods never re-fired without `--confirm-unsafe`; secrets read from env only. Reuses only merged code (poc_bundler). See `/verify`. -- `tools/oracle.py` — self-learning lead/finding prioritizer. Trains a smoothed Naive-Bayes log-odds model on `journal.jsonl` outcomes (confirmed/rejected + payout/severity/vuln-class/endpoint/tech features) to score P(lead becomes a real finding), replacing the static regex priority with a data-driven, per-feature-explainable rank. Cold-start prior blends toward the learned model as evidence grows; `eval` runs leave-one-out CV against the prior + majority baselines to prove lift. `train` / `eval` / `rank ` (reuses `lead_board`) / `score`. Pure-stdlib, deterministic, read-only. See `/oracle`. -- Full catalogue: **`tools/README.md`** (~50 tools). `hunt.py` auto-ingests leads after recon (`--graphql` / `--cve-hunt` / `--skip-leads` flags). +- `bughunter/tools/hunt.py` — master orchestrator +- `bughunter/tools/recon_engine.sh` — subdomain + URL discovery (now with optional `nuclei` phase) +- `bughunter/tools/vuln_scanner.sh` — XSS/SQLi/SSTI/MFA/SAML probe pipeline +- `bughunter/tools/validate.py` — 4-gate finding validator +- `bughunter/tools/learn.py` — CVE + disclosure intel +- `bughunter/tools/intel_engine.py` — on-demand intel with memory context +- `bughunter/tools/scope_checker.py` — deterministic scope safety checker +- `bughunter/tools/scope_aggregator.sh` — multi-platform scope pull (bbscope + bounty-targets-data) +- `bughunter/tools/secrets_hunter.sh` — trufflehog/noseyparker/gitleaks wrapper for FS/git/JS/GH-org +- `bughunter/tools/takeover_scanner.sh` — dnsReaper/subjack subdomain-takeover scanner +- `bughunter/tools/cloud_recon.sh` — S3Scanner + cloud_enum + CloudFail wrapper +- `bughunter/tools/param_discovery.sh` — Arjun/x8 hidden-parameter discovery +- `bughunter/tools/bypass_403.sh` — byp4xx + built-in 403/401 bypass matrix +- `bughunter/tools/cve_scan.sh` — focused nuclei CVE-tag sweep + optional log4j-scan +- `bughunter/tools/external_arsenal.sh` — installed-tool registry (~50 tools); other scripts source this for `_have ` +- `bughunter/tools/cicd_scanner.sh` — GitHub Actions workflow scanner (sisakulint wrapper, remote scan) +- `bughunter/tools/token_scanner.py` — automated token red flag scanner (EVM + Solana) +- `bughunter/tools/wordlist_engine.sh` — company-specific password wordlist generator (cewler + hashcat rules); requires `--with-credential-attack` +- `bughunter/tools/osint_employees.sh` — employee names + email patterns for spray prep (theHarvester + username-anarchy, opt-in CrossLinked); requires `--with-credential-attack` +- `bughunter/tools/breach_checker.py` — HIBP k-anonymity wordlist enrichment; ranks passwords by breach count (no API key, free) +- `bughunter/tools/spray_orchestrator.sh` — password spray with typed-hostname guard + lockout warning + audit log; modes: http-form / oauth / o365 / okta (TREVOR); requires `--with-credential-attack` for TREVOR modes +- `bughunter/tools/graphql_audit.sh` — 7-phase GraphQL audit: introspection + schema dump, graphw00f fingerprint, clairvoyance field discovery, batching DoS, alias bomb, gqlmap injection, graphql-cop checklist +- `bughunter/tools/lead_board.py` — persistent per-target lead ledger that routes every recon observation to the right `hunt-*` skill and tracks its status so no lead is forgotten (`memory/leads/.jsonl`). `ingest` parses recon output and routes 30+ signal types (IDOR/SSRF/GraphQL/OAuth/SAML/LLM/source-leak/tech-stack/nuclei) to skills; `show` lists untouched-first and flags stale high-priority leads; `next` returns the single top lead; `touch` marks a lead investigating/killed/reported (re-ingest preserves status). See **Critical Rule 6**. +- `bughunter/tools/eol_check.py` — EOL / lifecycle intel from endoflife.date (auto-run by `hunt.py` after recon) +- `bughunter/tools/waf_encoder.py` · `waf_response_analyzer.py` · `multipart_mutator.py` — WAF bypass + soft-block scoring + upload mutation +- `bughunter/tools/cors_scanner.py` — CORS misconfig scanner (origin-reflection / null / credentialed / suffix-prefix regex / scheme-downgrade); pure classifier, no deps +- `bughunter/tools/crlf_scanner.py` — CRLF / response-splitting + host-header injection with Set-Cookie canary detection (encoded + UTF-8 bypass variants) +- `bughunter/tools/nosqli_scanner.py` — NoSQL injection (operator auth-bypass, bracket-syntax, $where time-based blind) with differential + timing classifier +- `bughunter/tools/jwt_scanner.py` — offline JWT toolkit: alg:none forgery, RS256→HS256 confusion, HS256 secret crack, static claim analysis (pure stdlib) +- `bughunter/tools/oob_listener.py` — out-of-band orchestrator wrapping interactsh-client; payloads + correlation for blind SSRF/XXE/SQLi/RCE/Log4Shell +- `bughunter/tools/llm_redteam.py` — LLM red-team corpus runner (prompt-injection/jailbreak/system-prompt-leak/exfil/indirect/guardrail-bypass) with canary detection +- `bughunter/tools/poc_bundler.py` — PoC evidence bundler (`capture` live via SSRF-guarded `safe_http`, or `from-request` offline from a saved/Burp request). Emits `request.http`, `response.http`, `repro.sh` (curl), `evidence.har` (HAR 1.2), optional `screenshot.png`, `evidence.md` (report-ready), and `bundle.json` (manifest + response SHA-256) under `findings/-/evidence//`. Secrets redacted by default (repro.sh uses `$ENV` placeholders); refuses PUT/DELETE/PATCH without `--confirm-unsafe`. See `/poc`. +- `bughunter/tools/hunt_dashboard.py` — local web Hunt Dashboard (`serve`/`export`); reads `memory/leads/`, `recon/`, `findings/`, `reports/`, galleries, and `hunt-memory/` into one live view. Pure stdlib, binds to 127.0.0.1, HTML-escapes all recon-derived data, path-traversal-guarded `/file` endpoint. Distinct from `bughunter/tools/dashboard.py` (the in-terminal ANSI progress TUI). See `/dashboard`. +- `bughunter/tools/verifier.py` — the report gate (prove-or-suppress). Independently re-derives a finding from its `poc_bundler` bundle (re-sends via SSRF-guarded `safe_http` with an initial-host guard, checks a confirmation marker in the fresh response headers+body) and decides reportability: PROVEN only if the marker was in the original response AND is still present now; else REFUTED/UNPROVEN/INCONCLUSIVE → suppressed. Records the re-fetched response's SHA + status. `decide()` is a pure, total policy function; only PROVEN ships. Writes `verification.json`; `check`/`sweep`; `--require-proof` exits non-zero for gating; unsafe methods never re-fired without `--confirm-unsafe`; secrets read from env only. Reuses only merged code (poc_bundler). See `/verify`. +- `bughunter/tools/oracle.py` — self-learning lead/finding prioritizer. Trains a smoothed Naive-Bayes log-odds model on `journal.jsonl` outcomes (confirmed/rejected + payout/severity/vuln-class/endpoint/tech features) to score P(lead becomes a real finding), replacing the static regex priority with a data-driven, per-feature-explainable rank. Cold-start prior blends toward the learned model as evidence grows; `eval` runs leave-one-out CV against the prior + majority baselines to prove lift. `train` / `eval` / `rank ` (reuses `lead_board`) / `score`. Pure-stdlib, deterministic, read-only. See `/oracle`. +- Full catalogue: **`bughunter/tools/README.md`** (~50 tools). `hunt.py` auto-ingests leads after recon (`--graphql` / `--cve-hunt` / `--skip-leads` flags). ### External tool references diff --git a/README.md b/README.md index 46f0bc28..79d55252 100644 --- a/README.md +++ b/README.md @@ -502,7 +502,7 @@ Agentic-Bug-Hunter/ │ ├── recon_engine.sh # Subdomain + URL discovery │ ├── vuln_scanner.sh # XSS · SQLi · SSRF · SSTI probe pipeline │ ├── validate.py # 4-gate finding validator with identity checks -│ └── … # 30+ more scanners - see tools/README.md +│ └── … # 30+ more scanners - see bughunter/tools/README.md │ ├── memory/ # Cross-session hunt memory (pattern DB · audit log) ├── rules/ # Always-active hunting + reporting rules diff --git a/bughunter/agents/credential-hunter.md b/bughunter/agents/credential-hunter.md index 344a88b2..1ec67b92 100644 --- a/bughunter/agents/credential-hunter.md +++ b/bughunter/agents/credential-hunter.md @@ -24,7 +24,7 @@ A target domain (e.g., `target.com`) and optional flags: ## Hard safety rails (NON-NEGOTIABLE) -1. **NEVER invoke `/spray` or `tools/spray_orchestrator.sh` without explicit human approval via AskUserQuestion.** This applies even if the user said "go" or "run the whole pipeline" — spray is its own decision point. +1. **NEVER invoke `/spray` or `bughunter/tools/spray_orchestrator.sh` without explicit human approval via AskUserQuestion.** This applies even if the user said "go" or "run the whole pipeline" — spray is its own decision point. 2. **NEVER bypass the spray pre-flight (`--i-understand`) on the user's behalf.** Let the orchestrator's typed-hostname confirmation actually run. 3. **Stage outputs live under `recon//`** — DO NOT write anywhere else, DO NOT delete previous runs without permission. 4. **If `/scope ` reports out-of-scope, STOP and surface that to the user before any further work.** @@ -45,7 +45,7 @@ If unreachable or DNS-fail, STOP and report. ### Stage 1 — `/wordlist-gen ` ```bash -tools/wordlist_engine.sh --filter strict --mode balanced +bughunter/tools/wordlist_engine.sh --filter strict --mode balanced ``` Wait for completion. Capture stats from `recon//wordlists/`: @@ -58,7 +58,7 @@ If `cleaned.txt` has <100 entries, the target's website is too thin for a useful ### Stage 2 — `/osint-employees ` ```bash -tools/osint_employees.sh [--with-linkedin] [--with-pydictor-social] +bughunter/tools/osint_employees.sh [--with-linkedin] [--with-pydictor-social] ``` Wait. Capture stats from `recon//osint/`: @@ -71,7 +71,7 @@ If `usernames.txt` is empty AND `--with-linkedin` was not enabled, surface: "0 u ### Stage 3 — `/breach-check` on the ranked wordlist ```bash -tools/breach_checker.py recon//wordlists/ranked.txt \ +bughunter/tools/breach_checker.py recon//wordlists/ranked.txt \ --limit --shuffle --with-counts ``` @@ -120,7 +120,7 @@ When user picks option 1, hand them the **exact command** to copy-paste, includi ```bash # AGENT NEVER RUNS THIS — only suggests it for user to run -tools/spray_orchestrator.sh https:/// \ +bughunter/tools/spray_orchestrator.sh https:/// \ --mode http-form \ --users recon//osint/usernames.txt \ --passes recon//wordlists/ranked-ranked.txt \ @@ -129,7 +129,7 @@ tools/spray_orchestrator.sh https:/// \ ## What you DO NOT do -- ❌ DO NOT call `tools/spray_orchestrator.sh` yourself, even with `--dry-run` +- ❌ DO NOT call `bughunter/tools/spray_orchestrator.sh` yourself, even with `--dry-run` - ❌ DO NOT bypass `--i-understand` on the user's behalf - ❌ DO NOT auto-pick http-form vs oauth vs o365 — ask the user - ❌ DO NOT report bugs / write a report — that's a separate skill (`/validate` + `/report`) diff --git a/bughunter/agents/report-writer.md b/bughunter/agents/report-writer.md index 750348a3..054c83cf 100644 --- a/bughunter/agents/report-writer.md +++ b/bughunter/agents/report-writer.md @@ -69,7 +69,7 @@ SSRF → cloud metadata: AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:L/VA:N/SC:H/S Stored XSS → ATO: AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:H/SI:H/SA:N = 8.8 High ``` -Use `python3 tools/validate.py` for interactive CVSS 4.0 scoring, or verify at: +Use `python3 bughunter/tools/validate.py` for interactive CVSS 4.0 scoring, or verify at: https://www.first.org/cvss/calculator/4.0 ## HackerOne Format diff --git a/bughunter/agents/token-auditor.md b/bughunter/agents/token-auditor.md index 3b0fc2fb..233580c2 100644 --- a/bughunter/agents/token-auditor.md +++ b/bughunter/agents/token-auditor.md @@ -139,13 +139,13 @@ After manual grep review, run the automated scanner: ```bash # EVM -python3 tools/token_scanner.py +python3 bughunter/tools/token_scanner.py # Solana -python3 tools/token_scanner.py --chain solana --recursive +python3 bughunter/tools/token_scanner.py --chain solana --recursive # With markdown report -python3 tools/token_scanner.py --recursive --output findings/token-scan.md +python3 bughunter/tools/token_scanner.py --recursive --output findings/token-scan.md ``` ## Reporting Format diff --git a/bughunter/tools/README.md b/bughunter/tools/README.md index da4ea1f9..8fcfb836 100644 --- a/bughunter/tools/README.md +++ b/bughunter/tools/README.md @@ -6,10 +6,10 @@ external dependency is installed — missing tools are skipped, never hard-error Full catalogue below. Quick start: ```bash -python3 tools/hunt.py --target target.com # recon → leads → scan → report -python3 tools/lead_board.py ingest target.com # after any /recon -python3 tools/lead_board.py next target.com # highest-value untouched lead -bash tools/external_arsenal.sh # what's installed vs missing +python3 bughunter/tools/hunt.py --target target.com # recon → leads → scan → report +python3 bughunter/tools/lead_board.py ingest target.com # after any /recon +python3 bughunter/tools/lead_board.py next target.com # highest-value untouched lead +bash bughunter/tools/external_arsenal.sh # what's installed vs missing ``` --- @@ -119,9 +119,9 @@ Scanner confidence states prepended to every finding: ## Post-recon ritual (never skip) ```bash -python3 tools/lead_board.py ingest target.com -python3 tools/lead_board.py show target.com -python3 tools/lead_board.py next target.com +python3 bughunter/tools/lead_board.py ingest target.com +python3 bughunter/tools/lead_board.py show target.com +python3 bughunter/tools/lead_board.py next target.com # then route: GraphQL → hunt-graphql /skills/graphql-audit, etc. ``` diff --git a/commands/arsenal.md b/commands/arsenal.md index 169573ca..3d49ae5b 100644 --- a/commands/arsenal.md +++ b/commands/arsenal.md @@ -15,7 +15,7 @@ Inspect the external tool inventory used by this plugin. ## What it covers -`tools/external_arsenal.sh` knows about ~50 tools across: +`bughunter/tools/external_arsenal.sh` knows about ~50 tools across: - **Recon** — subfinder, amass, assetfinder, bbot, theHarvester, dnsrecon, massdns, puredns, shuffledns, knockpy - **Probing** — httpx, dnsx, naabu, smap, aquatone, eyewitness diff --git a/commands/autopilot.md b/commands/autopilot.md index 9d73f5ec..bf34cfc7 100644 --- a/commands/autopilot.md +++ b/commands/autopilot.md @@ -51,9 +51,9 @@ without losing findings. ``` 1. SCOPE Load and confirm program scope (≡ /scope) -2. RECON bash tools/recon_engine.sh (≡ /recon, reuses cache if < 7 days old) +2. RECON bash bughunter/tools/recon_engine.sh (≡ /recon, reuses cache if < 7 days old) 3. RANK Prioritize attack surface (recon-ranker agent) (≡ /surface) -4. HUNT python3 tools/hunt.py --target --scan-only (≡ /hunt) +4. HUNT python3 bughunter/tools/hunt.py --target --scan-only (≡ /hunt) 5. VALIDATE 7-Question Gate on findings (≡ /validate) 6. REPORT Draft reports for validated findings (≡ /report — never auto-submits) 7. CHECKPOINT Present to human for review (frequency depends on mode flag) diff --git a/commands/breach-check.md b/commands/breach-check.md index bce1f8c9..66f0751c 100644 --- a/commands/breach-check.md +++ b/commands/breach-check.md @@ -83,4 +83,4 @@ Pure Python 3.9+, no external deps (uses urllib + hashlib + ThreadPoolExecutor f ## Underlying tool -`tools/breach_checker.py [flags]` — call directly if you prefer a non-slash interface. +`bughunter/tools/breach_checker.py [flags]` — call directly if you prefer a non-slash interface. diff --git a/commands/bypass-403.md b/commands/bypass-403.md index a58c6225..73706929 100644 --- a/commands/bypass-403.md +++ b/commands/bypass-403.md @@ -40,10 +40,10 @@ Fingerprint saved to `findings/bypass//waf_fingerprint.txt`. For payload-level bypass (SQLi/XSS keyword blocked by WAF): ```bash -tools/waf_encoder.py "' OR 1=1--" --class sqli -tools/waf_encoder.py "" --class xss -tools/waf_encoder.py "" --layers 3 # triple URL-encode -tools/waf_encoder.py "" --json # machine-readable output +bughunter/tools/waf_encoder.py "' OR 1=1--" --class sqli +bughunter/tools/waf_encoder.py "" --class xss +bughunter/tools/waf_encoder.py "" --layers 3 # triple URL-encode +bughunter/tools/waf_encoder.py "" --json # machine-readable output ``` Generates 20-40 variants: URL encoding (1-3 layers), unicode escape, HTML entity, SQL comment injection, MySQL version comment, case mixing, operator substitution, base64 XSS wrappers, null byte insertion. @@ -53,8 +53,8 @@ Generates 20-40 variants: URL encoding (1-3 layers), unicode escape, HTML entity For blocked file upload endpoints: ```bash -tools/multipart_mutator.py --file shell.aspx --field file -tools/multipart_mutator.py --file shell.aspx --field file \ +bughunter/tools/multipart_mutator.py --file shell.aspx --field file +bughunter/tools/multipart_mutator.py --file shell.aspx --field file \ --url https://target/upload --send ``` @@ -85,8 +85,8 @@ triage can look up the exact WAF rule that fired. For more sophisticated analysis (baseline calibration + weighted score engine + log ID extraction): ```bash -tools/waf_response_analyzer.py --calibrate https://target.com --output /tmp/baseline.json -tools/waf_response_analyzer.py --classify --status 200 --body /tmp/resp.html \ +bughunter/tools/waf_response_analyzer.py --calibrate https://target.com --output /tmp/baseline.json +bughunter/tools/waf_response_analyzer.py --classify --status 200 --body /tmp/resp.html \ --headers /tmp/resp.hdr --baseline /tmp/baseline.json --metrics "200|2048|0.05" --format json ``` diff --git a/commands/cors.md b/commands/cors.md index 6d006dfe..6d5297aa 100644 --- a/commands/cors.md +++ b/commands/cors.md @@ -19,7 +19,7 @@ the `Access-Control-Allow-Origin` / `Access-Control-Allow-Credentials` reply. Run directly: ```bash -tools/cors_scanner.py https://api.target.com/me --cookie "session=..." +bughunter/tools/cors_scanner.py https://api.target.com/me --cookie "session=..." ``` ## What it tests diff --git a/commands/crlf.md b/commands/crlf.md index 92dcd1e5..bee6d7a4 100644 --- a/commands/crlf.md +++ b/commands/crlf.md @@ -19,7 +19,7 @@ lands in the **response** — proof of CRLF injection. Run directly: ```bash -tools/crlf_scanner.py "https://target.com/r?u=x" --host-header +bughunter/tools/crlf_scanner.py "https://target.com/r?u=x" --host-header ``` ## What it injects diff --git a/commands/dashboard.md b/commands/dashboard.md index 588d342d..bf65df93 100644 --- a/commands/dashboard.md +++ b/commands/dashboard.md @@ -23,11 +23,11 @@ Pure stdlib, zero dependencies. Binds to `127.0.0.1` only. Run directly: ```bash -tools/hunt_dashboard.py serve --port 8777 -tools/hunt_dashboard.py export -o dashboard.html +bughunter/tools/hunt_dashboard.py serve --port 8777 +bughunter/tools/hunt_dashboard.py export -o dashboard.html ``` -> Not to be confused with `tools/dashboard.py`, the in-terminal ANSI progress +> Not to be confused with `bughunter/tools/dashboard.py`, the in-terminal ANSI progress > bar shown *while* a recon/hunt runs. This is the persistent **web view** of > everything a hunt has accumulated. diff --git a/commands/domxss.md b/commands/domxss.md index 9d95c9c0..de14dccf 100644 --- a/commands/domxss.md +++ b/commands/domxss.md @@ -22,12 +22,12 @@ between "reflected, maybe" and a report-ready `[CONFIRMED]` DOM XSS. Run directly: ```bash -tools/dom_xss_harness.py "https://app.target.com/search?q=test" +bughunter/tools/dom_xss_harness.py "https://app.target.com/search?q=test" ``` ## Requires -Playwright (a new dependency, registered in `tools/external_arsenal.sh`): +Playwright (a new dependency, registered in `bughunter/tools/external_arsenal.sh`): ```bash pip install playwright && playwright install chromium diff --git a/commands/hunt.md b/commands/hunt.md index 1df7a6ec..40cf95f7 100644 --- a/commands/hunt.md +++ b/commands/hunt.md @@ -1,5 +1,5 @@ --- -description: Active vulnerability hunt against a target by invoking tools/hunt.py (which calls vuln_scanner.sh against recon//). Auto-runs recon first if no recon dir exists. Usage: /hunt target.com +description: Active vulnerability hunt against a target by invoking bughunter/tools/hunt.py (which calls vuln_scanner.sh against recon//). Auto-runs recon first if no recon dir exists. Usage: /hunt target.com --- # /hunt @@ -10,18 +10,18 @@ Active vulnerability hunting on a target. **Always invoke the production script ```bash # If recon// already exists, scan only: -python3 tools/hunt.py --target target.com --scan-only +python3 bughunter/tools/hunt.py --target target.com --scan-only # If no recon yet, run the full pipeline (recon then scan): -python3 tools/hunt.py --target target.com +python3 bughunter/tools/hunt.py --target target.com # Quick mode (fewer checks, faster): -python3 tools/hunt.py --target target.com --quick +python3 bughunter/tools/hunt.py --target target.com --quick ``` That's it. The script: 1. Reads `recon//` (subdomains, live hosts, URLs, gf-classified candidates). -2. Runs `tools/vuln_scanner.sh recon//` — XSS (dalfox), SQLi (linear-scaling verifier), SSTI math-canary probes, race conditions, RCE PoC, MFA/SAML checks. +2. Runs `bughunter/tools/vuln_scanner.sh recon//` — XSS (dalfox), SQLi (linear-scaling verifier), SSTI math-canary probes, race conditions, RCE PoC, MFA/SAML checks. 3. Writes results to `findings//` with a `summary.txt`. Output you should see (not a loop): @@ -54,7 +54,7 @@ bbhunt v4.3 [✓] HUNT COMPLETE — Summary Dashboard ``` -Pass `--no-banner` for piped / CI output. Pipe through `python3 tools/dashboard.py --tail --kind scan --target target.com` for a live phase-by-phase progress dashboard instead of streaming logs. +Pass `--no-banner` for piped / CI output. Pipe through `python3 bughunter/tools/dashboard.py --tail --kind scan --target target.com` for a live phase-by-phase progress dashboard instead of streaming logs. ## Usage @@ -67,7 +67,7 @@ Pass `--no-banner` for piped / CI output. Pipe through `python3 tools/dashboard. /hunt targets.txt (multi-target — one domain per line) ``` -`--vuln-class`, `--source-code`, `--chrome`, and multi-target are manual-mode flags that switch you out of the scripted pipeline and into the methodology below. They are not arguments to `tools/hunt.py`. +`--vuln-class`, `--source-code`, `--chrome`, and multi-target are manual-mode flags that switch you out of the scripted pipeline and into the methodology below. They are not arguments to `bughunter/tools/hunt.py`. ## Troubleshooting: "/hunt is looping / not actually hunting" @@ -77,16 +77,16 @@ Cause: The model is reading the methodology prose below and trying to re-impleme Fix (run this directly in a shell — no prompt needed): ```bash -python3 tools/hunt.py --target target.com --scan-only +python3 bughunter/tools/hunt.py --target target.com --scan-only ``` -If `tools/vuln_scanner.sh` reports missing tools, install them first: +If `bughunter/tools/vuln_scanner.sh` reports missing tools, install them first: ```bash bash install_tools.sh ``` If you're on a free OpenRouter model and the agent keeps narrating instead of executing, add this to your prompt: -> Run `python3 tools/hunt.py --target target.com --scan-only` and report the output. Do not re-implement the steps. Do not narrate the methodology. Run the command. +> Run `python3 bughunter/tools/hunt.py --target target.com --scan-only` and report the output. Do not re-implement the steps. Do not narrate the methodology. Run the command. ## Session Isolation @@ -108,13 +108,13 @@ admin.target.com Then loop the script: ```bash while read -r t; do - python3 tools/hunt.py --target "$t" --quick + python3 bughunter/tools/hunt.py --target "$t" --quick done < targets.txt ``` ## Source Code Mode (--source-code) -`tools/hunt.py` does not consume source code directly. For `--source-code`, treat it as a manual workflow: +`bughunter/tools/hunt.py` does not consume source code directly. For `--source-code`, treat it as a manual workflow: 1. Grep for hardcoded secrets and API keys. 2. Map routes → controllers; flag endpoints missing auth decorators. @@ -130,7 +130,7 @@ Requires Chrome MCP configured in Claude Code settings. Enables flows the headle - SPA route discovery (React/Vue/Angular) - Real file upload and form submission -This is manual; not driven by `tools/hunt.py`. +This is manual; not driven by `bughunter/tools/hunt.py`. --- @@ -198,14 +198,14 @@ When any probe returns 403, follow this order before declaring dead-end: ```bash # 1. Header/path/method matrix (auto-runs WAF fingerprint) -tools/bypass_403.sh "https://$TARGET/blocked-endpoint" +bughunter/tools/bypass_403.sh "https://$TARGET/blocked-endpoint" # 2. Payload-level encoding bypass (for SQLi/XSS keyword blocked) -tools/waf_encoder.py "" --class sqli -tools/waf_encoder.py "" --class xss +bughunter/tools/waf_encoder.py "" --class sqli +bughunter/tools/waf_encoder.py "" --class xss # 3. Upload endpoint blocked -tools/multipart_mutator.py --file ./shell.aspx --field file \ +bughunter/tools/multipart_mutator.py --file ./shell.aspx --field file \ --url "https://$TARGET/upload" --send # 4. Cloudflare origin hunt (if Cloudflare detected and steps 1-3 fail) @@ -336,7 +336,7 @@ When the hunt session ends, run `/remember` to log a summary to hunt memory so ` Add `--graphql` to audit GraphQL URLs discovered in recon, and `--cve-hunt` for a focused nuclei CVE sweep. ```bash -python3 tools/hunt.py --target target.com --graphql --cve-hunt -python3 tools/lead_board.py next target.com +python3 bughunter/tools/hunt.py --target target.com --graphql --cve-hunt +python3 bughunter/tools/lead_board.py next target.com ``` diff --git a/commands/jwt-scan.md b/commands/jwt-scan.md index 17656e6f..f4c34c88 100644 --- a/commands/jwt-scan.md +++ b/commands/jwt-scan.md @@ -19,8 +19,8 @@ the auth skill. All crypto is pure stdlib — no network needed to mint a forger Run directly: ```bash -tools/jwt_scanner.py "$TOKEN" --analyze -tools/jwt_scanner.py "$TOKEN" --crack --wordlist secrets.txt +bughunter/tools/jwt_scanner.py "$TOKEN" --analyze +bughunter/tools/jwt_scanner.py "$TOKEN" --crack --wordlist secrets.txt ``` ## Attacks diff --git a/commands/llm-app-audit.md b/commands/llm-app-audit.md index 1e82e6bd..1d9834e2 100644 --- a/commands/llm-app-audit.md +++ b/commands/llm-app-audit.md @@ -18,7 +18,7 @@ with its privileges on someone else's behalf, not just say something. Loads the | Attack | ASI | Deterministic oracle | |---|---|---| -| Tool-call hijacking | ASI02 | OOB callback — the tool reaches your collaborator host (`tools/oob_listener.py`) | +| Tool-call hijacking | ASI02 | OOB callback — the tool reaches your collaborator host (`bughunter/tools/oob_listener.py`) | | Cross-session memory poisoning | ASI06 | plant canary as identity A, re-read as identity B | | Confused-deputy via tools | ASI02/03 | privileged record returned that the user's role can't access | | Agent-to-agent IDOR | ASI07 | agent A returns agent B's context | @@ -28,8 +28,8 @@ with its privileges on someone else's behalf, not just say something. Loads the ## Supporting tools ```bash -tools/llm_redteam.py --url --category excessive-agency --json # tool-abuse probes -tools/oob_listener.py --listen # confirm tool reach-out +bughunter/tools/llm_redteam.py --url --category excessive-agency --json # tool-abuse probes +bughunter/tools/oob_listener.py --listen # confirm tool reach-out tools/verifiers/ (xss) # confirm insecure-output XSS at the sink ``` diff --git a/commands/llm-redteam.md b/commands/llm-redteam.md index 67bd4203..66d0fce4 100644 --- a/commands/llm-redteam.md +++ b/commands/llm-redteam.md @@ -26,8 +26,8 @@ at a time, this runs a categorized corpus against a chat endpoint and uses a Run directly: ```bash -tools/llm_redteam.py --url https://t/api/chat --field message --json -tools/llm_redteam.py --list-categories +bughunter/tools/llm_redteam.py --url https://t/api/chat --field message --json +bughunter/tools/llm_redteam.py --list-categories ``` ## Categories (OWASP LLM Top 10 / ASI) diff --git a/commands/nosqli.md b/commands/nosqli.md index 586e09a6..df9ee943 100644 --- a/commands/nosqli.md +++ b/commands/nosqli.md @@ -19,7 +19,7 @@ via operator injection → auth bypass / data read. Run directly: ```bash -tools/nosqli_scanner.py --login https://t/api/login \ +bughunter/tools/nosqli_scanner.py --login https://t/api/login \ --user-field email --pass-field password --json ``` diff --git a/commands/oob.md b/commands/oob.md index 89acb0b3..d17a12b4 100644 --- a/commands/oob.md +++ b/commands/oob.md @@ -29,9 +29,9 @@ confirmed ones. Run directly: ```bash -tools/oob_listener.py --payloads cXXXX.oast.fun --json > payloads.json -tools/oob_listener.py --listen > inter.jsonl -tools/oob_listener.py --correlate inter.jsonl --payloads-file payloads.json +bughunter/tools/oob_listener.py --payloads cXXXX.oast.fun --json > payloads.json +bughunter/tools/oob_listener.py --listen > inter.jsonl +bughunter/tools/oob_listener.py --correlate inter.jsonl --payloads-file payloads.json ``` ## Classes covered diff --git a/commands/oracle.md b/commands/oracle.md index c55ae056..27427d5c 100644 --- a/commands/oracle.md +++ b/commands/oracle.md @@ -22,9 +22,9 @@ your own track record says pay, not the ones a hardcoded regex guesses. Run directly: ```bash -tools/oracle.py train -tools/oracle.py rank target.com --top 20 -tools/oracle.py score --class open-redirect --url https://t.com/go?next=/x --json +bughunter/tools/oracle.py train +bughunter/tools/oracle.py rank target.com --top 20 +bughunter/tools/oracle.py score --class open-redirect --url https://t.com/go?next=/x --json ``` ## What it learns diff --git a/commands/osint-employees.md b/commands/osint-employees.md index 2136a41a..bcf6ed42 100644 --- a/commands/osint-employees.md +++ b/commands/osint-employees.md @@ -64,4 +64,4 @@ Install once: `./install_tools.sh --with-credential-attack` ## Underlying tool -`tools/osint_employees.sh [flags]` — call directly if you prefer a non-slash interface. +`bughunter/tools/osint_employees.sh [flags]` — call directly if you prefer a non-slash interface. diff --git a/commands/param-discover.md b/commands/param-discover.md index b58496fa..771011ff 100644 --- a/commands/param-discover.md +++ b/commands/param-discover.md @@ -18,7 +18,7 @@ unlocks the real surface. ## Tools -`tools/param_discovery.sh` prefers `arjun` (richer JSON output, ML-driven diffing) and +`bughunter/tools/param_discovery.sh` prefers `arjun` (richer JSON output, ML-driven diffing) and falls back to `x8` (Rust, faster on huge wordlists). Install hint: ``` diff --git a/commands/poc.md b/commands/poc.md index c81ef2b2..692e47a8 100644 --- a/commands/poc.md +++ b/commands/poc.md @@ -23,11 +23,11 @@ Run directly: ```bash # live: send the request (SSRF-guarded) and bundle it -tools/poc_bundler.py capture -X GET -H "Cookie: session=..." \ +bughunter/tools/poc_bundler.py capture -X GET -H "Cookie: session=..." \ --target t.com --vuln-class idor --severity high --finding-id F-12 --screenshot # offline: bundle a saved raw request (e.g. copied out of Burp) -tools/poc_bundler.py from-request request.txt --response response.txt \ +bughunter/tools/poc_bundler.py from-request request.txt --response response.txt \ --target t.com --vuln-class idor ``` @@ -57,7 +57,7 @@ Pass `--no-redact` only for local/personal use. ## Safety rails -- `capture` uses the repo's SSRF-guarded opener (`tools/safe_http.py`) — a target +- `capture` uses the repo's SSRF-guarded opener (`bughunter/tools/safe_http.py`) — a target can't 302 the capture into cloud metadata or an internal host. - `PUT`/`DELETE`/`PATCH` are refused unless you pass `--confirm-unsafe` (they can mutate production state), mirroring the autopilot `SafeMethodPolicy`. diff --git a/commands/portscan.md b/commands/portscan.md index ff210945..438ccd72 100644 --- a/commands/portscan.md +++ b/commands/portscan.md @@ -22,14 +22,14 @@ into instant wins. Run directly: ```bash -tools/port_scanner.py target.com --top 1000 +bughunter/tools/port_scanner.py target.com --top 1000 ``` ## Tooling Wraps ProjectDiscovery's **naabu** (fast SYN/CONNECT scan), falling back to **smap** (Shodan-backed, sends no packets — handy when active scanning is out of -scope). Both are registered in `tools/external_arsenal.sh`. If neither is +scope). Both are registered in `bughunter/tools/external_arsenal.sh`. If neither is installed the command prints install hints and exits cleanly. ## What it flags diff --git a/commands/recon.md b/commands/recon.md index ed79770f..e97cf2fb 100644 --- a/commands/recon.md +++ b/commands/recon.md @@ -1,5 +1,5 @@ --- -description: Run the full recon pipeline by invoking tools/recon_engine.sh — subdomain enum (subfinder + amass + crt.sh + wayback), httpx live host probing with tech detection, nmap port scan, gau URL collection, JS analysis, ffuf directory fuzzing, parameter discovery, config exposure check, CI/CD workflow scan. Outputs to recon//. Handles FQDN, IP, CIDR, and file-of-hosts targets automatically. Usage: /recon target.com +description: Run the full recon pipeline by invoking bughunter/tools/recon_engine.sh — subdomain enum (subfinder + amass + crt.sh + wayback), httpx live host probing with tech detection, nmap port scan, gau URL collection, JS analysis, ffuf directory fuzzing, parameter discovery, config exposure check, CI/CD workflow scan. Outputs to recon//. Handles FQDN, IP, CIDR, and file-of-hosts targets automatically. Usage: /recon target.com --- # /recon @@ -10,19 +10,19 @@ Run the full recon pipeline on a target. **Always invoke the production script d ```bash # Domain (full subdomain enum + crawl + fuzz): -bash tools/recon_engine.sh target.com +bash bughunter/tools/recon_engine.sh target.com # CIDR — skips subdomain enum, runs nmap host sweep: -bash tools/recon_engine.sh 10.0.0.0/24 +bash bughunter/tools/recon_engine.sh 10.0.0.0/24 # Single IP — scope-locked, no subdomain enum: -bash tools/recon_engine.sh 192.0.2.10 +bash bughunter/tools/recon_engine.sh 192.0.2.10 # Domain list (programs without wildcard scope) — pre-resolved hosts in a file: -bash tools/recon_engine.sh path/to/scope.txt +bash bughunter/tools/recon_engine.sh path/to/scope.txt # Quick mode (skip amass + reduce ffuf coverage): -bash tools/recon_engine.sh target.com --quick +bash bughunter/tools/recon_engine.sh target.com --quick ``` The script auto-detects target type: @@ -51,7 +51,7 @@ recon// You're on an older revision of this command file where the model re-implemented the pipeline inline and never invoked the production script. Pull latest, or run the script directly: ```bash -bash tools/recon_engine.sh path/to/file.txt +bash bughunter/tools/recon_engine.sh path/to/file.txt ``` You should see `[*] Domain-list target — loading (skipping subdomain enum)` near the start. @@ -61,10 +61,10 @@ You should see `[*] Domain-list target — loading (skipping subdomain en Same root cause as the hunt-loop bug. Run the bash directly: ```bash -bash tools/recon_engine.sh target.com +bash bughunter/tools/recon_engine.sh target.com ``` -Or in your prompt: "Run `bash tools/recon_engine.sh target.com` and report the output. Do not re-implement the steps." +Or in your prompt: "Run `bash bughunter/tools/recon_engine.sh target.com` and report the output. Do not re-implement the steps." ### "Missing tools" @@ -85,7 +85,7 @@ Recon needs: `subfinder`, `dnsx`, `httpx` (ProjectDiscovery — not the Python C ## 5-Minute Kill Signal If after running this pipeline you see: -- All hosts return 403 even after `tools/bypass_403.sh` + wafw00f bypass, or return only static marketing pages +- All hosts return 403 even after `bughunter/tools/bypass_403.sh` + wafw00f bypass, or return only static marketing pages - No API endpoints visible - No interesting parameters in URLs - nuclei returns 0 medium/high findings @@ -96,7 +96,7 @@ If after running this pipeline you see: # Reference: What the script does (informational) -The pipeline in `tools/recon_engine.sh` runs these phases (numbers may shift; check the script source): +The pipeline in `bughunter/tools/recon_engine.sh` runs these phases (numbers may shift; check the script source): 1. **Subdomain enumeration** — subfinder + Chaos API (if `$CHAOS_API_KEY` set) + amass + crt.sh + wayback. 2. **Live host discovery** — dnsx resolve, then httpx with status/title/tech-detect. @@ -104,7 +104,7 @@ The pipeline in `tools/recon_engine.sh` runs these phases (numbers may shift; ch 4. **URL crawl** — katana deep crawl + waybackurls + gau historical. 5. **gf classification** — xss, ssrf, idor, sqli, redirect, lfi candidate files. 6. **JS analysis** — LinkFinder / SecretFinder on every JS bundle. -7. **ffuf directory fuzzing** — uses `wordlists/common.txt` (run `python3 tools/hunt.py --setup-wordlists` once if missing). +7. **ffuf directory fuzzing** — uses `wordlists/common.txt` (run `python3 bughunter/tools/hunt.py --setup-wordlists` once if missing). 8. **Parameter discovery** — Arjun / x8 against high-value endpoints. 9. **Config exposure** — `.git/`, `.env`, `wp-config.php`, `.DS_Store`, swagger.json, etc. 10. **CI/CD scan** — sisakulint against any GitHub Actions workflows discovered. diff --git a/commands/sast.md b/commands/sast.md index e13baa45..01b24b62 100644 --- a/commands/sast.md +++ b/commands/sast.md @@ -20,14 +20,14 @@ toolkit's states so findings drop straight into the validation gate. Run directly: ```bash -tools/sast_scan.py recon/target.com/js/ +bughunter/tools/sast_scan.py recon/target.com/js/ ``` ## Rulesets Default packs (Semgrep Registry): `p/security-audit`, `p/secrets`, `p/xss`, `p/sql-injection`, `p/command-injection`. Override with `--config`. Registered -in `tools/external_arsenal.sh` as `semgrep|sast`; if Semgrep isn't installed the +in `bughunter/tools/external_arsenal.sh` as `semgrep|sast`; if Semgrep isn't installed the command prints the install hint and exits cleanly. ## Severity mapping diff --git a/commands/scope-aggregate.md b/commands/scope-aggregate.md index c5268195..3b9e5919 100644 --- a/commands/scope-aggregate.md +++ b/commands/scope-aggregate.md @@ -17,7 +17,7 @@ from the program page. ## What it does -`tools/scope_aggregator.sh` runs in two strategies: +`bughunter/tools/scope_aggregator.sh` runs in two strategies: 1. **bbscope** (`sw33tLie/bbscope`) — authenticated multi-platform pull. Best freshness, but needs platform tokens in env (`H1_USERNAME`, `H1_API_KEY`, diff --git a/commands/scope.md b/commands/scope.md index bd050557..f13037f3 100644 --- a/commands/scope.md +++ b/commands/scope.md @@ -27,7 +27,7 @@ Always check scope BEFORE the first request. Use the local scope checker before sending traffic: ```bash -python3 tools/scope_checker.py https://api.target.com/v2/users \ +python3 bughunter/tools/scope_checker.py https://api.target.com/v2/users \ --domain target.com \ --domain '*.target.com' \ --exclude-domain staging.target.com @@ -36,7 +36,7 @@ python3 tools/scope_checker.py https://api.target.com/v2/users \ Filter a discovered URL list: ```bash -python3 tools/scope_checker.py \ +python3 bughunter/tools/scope_checker.py \ --domain target.com \ --domain '*.target.com' \ --exclude-domain staging.target.com \ diff --git a/commands/screenshot.md b/commands/screenshot.md index 7d3aafd0..23b61ae2 100644 --- a/commands/screenshot.md +++ b/commands/screenshot.md @@ -20,7 +20,7 @@ scramble for a PoC screenshot later. Run directly: ```bash -tools/visual_triage.py -l recon/target.com/live/urls.txt -o shots/ +bughunter/tools/visual_triage.py -l recon/target.com/live/urls.txt -o shots/ ``` ## Tooling @@ -31,7 +31,7 @@ Uses whichever screenshotter is installed, in order: 2. **aquatone** — fast, clusters similar pages together 3. **httpx `-screenshot`** — already a core dependency, so this always works -All three are registered in `tools/external_arsenal.sh`. Output always includes +All three are registered in `bughunter/tools/external_arsenal.sh`. Output always includes a self-contained `gallery.html` (no external assets) you can open locally or attach to a report. diff --git a/commands/spray.md b/commands/spray.md index e736ad55..54ffcfbc 100644 --- a/commands/spray.md +++ b/commands/spray.md @@ -137,8 +137,8 @@ Type 'yes' to proceed (anything else aborts): _ - Built-in modes (http-form, oauth): pure Python 3.9+ stdlib - TREVOR modes (o365, okta): `trevorspray` from `./install_tools.sh --with-credential-attack` -- `tools/scope_checker.py` for typed-confirmation logic (Python 3.9 compat) +- `bughunter/tools/scope_checker.py` for typed-confirmation logic (Python 3.9 compat) ## Underlying tool -`tools/spray_orchestrator.sh --mode ... --users ... --passes ...` +`bughunter/tools/spray_orchestrator.sh --mode ... --users ... --passes ...` diff --git a/commands/takeover.md b/commands/takeover.md index 7baa78ac..d54f8e5c 100644 --- a/commands/takeover.md +++ b/commands/takeover.md @@ -15,7 +15,7 @@ Find subdomains pointing at services you can claim and serve content from. ## How it works -`tools/takeover_scanner.sh` tries each strategy in turn: +`bughunter/tools/takeover_scanner.sh` tries each strategy in turn: 1. **dnsReaper** (`punk-security/dnsReaper`) — broadest fingerprint set, JSON output. 2. **subjack** (`haccer/subjack`) — fast Go scanner. diff --git a/commands/token-scan.md b/commands/token-scan.md index 28c2bdbc..64423d31 100644 --- a/commands/token-scan.md +++ b/commands/token-scan.md @@ -33,13 +33,13 @@ If ANY answer is NO → flag and proceed with extreme caution. ```bash # EVM -python3 tools/token_scanner.py +python3 bughunter/tools/token_scanner.py # Solana -python3 tools/token_scanner.py --chain solana --recursive +python3 bughunter/tools/token_scanner.py --chain solana --recursive # JSON output for piping -python3 tools/token_scanner.py --json +python3 bughunter/tools/token_scanner.py --json ``` The scanner checks all 8 bug classes via regex and returns a risk score + verdict. diff --git a/commands/verify.md b/commands/verify.md index 777d0a70..116fbf33 100644 --- a/commands/verify.md +++ b/commands/verify.md @@ -30,8 +30,8 @@ step consumes. Run directly: ```bash -tools/verifier.py check --marker "signal-that-proves-the-bug" -tools/verifier.py sweep [root] --require-proof +bughunter/tools/verifier.py check --marker "signal-that-proves-the-bug" +bughunter/tools/verifier.py sweep [root] --require-proof ``` ## Verdicts @@ -59,7 +59,7 @@ classes work too — open-redirect (`Location`), CORS (`Access-Control-Allow-Ori ## Safety -- Re-derivation uses the SSRF-guarded opener (`tools/safe_http.py`), **and the +- Re-derivation uses the SSRF-guarded opener (`bughunter/tools/safe_http.py`), **and the initial host is validated** against the same metadata/private/loopback blocklist before the first request — a tampered bundle URL can't make verification hit `169.254.169.254`/localhost (it holds as `INCONCLUSIVE`). diff --git a/commands/wordlist-gen.md b/commands/wordlist-gen.md index 7deb470c..4cff7161 100644 --- a/commands/wordlist-gen.md +++ b/commands/wordlist-gen.md @@ -71,10 +71,10 @@ The script checks for `cewler` and `hashcat` and exits with a helpful hint if mi ## What this does NOT do -- **No HIBP filtering** — PR #4 will add `tools/breach_checker.py` to rank by leak prevalence. +- **No HIBP filtering** — PR #4 will add `bughunter/tools/breach_checker.py` to rank by leak prevalence. - **No OSINT input** — PR #3 will feed employee names, birthdays, and project codes via pydictor. - **No spray execution** — PR #5 will add `/spray` (with mandatory scope check and lockout warning). ## Underlying tool -`tools/wordlist_engine.sh [flags]` — call directly if you prefer a non-slash interface. +`bughunter/tools/wordlist_engine.sh [flags]` — call directly if you prefer a non-slash interface. diff --git a/docs/TUTORIAL.md b/docs/TUTORIAL.md index d852b2b0..f2767d11 100644 --- a/docs/TUTORIAL.md +++ b/docs/TUTORIAL.md @@ -44,7 +44,7 @@ open Claude Code. ## B. Verify the arsenal (15 sec) ```bash -bash tools/external_arsenal.sh +bash bughunter/tools/external_arsenal.sh ``` You'll see the **BUGHUNTER** banner, then a table of ~50 external tools with @@ -77,7 +77,7 @@ Visit `http://127.0.0.1:8080/` in your browser — the page is a small ## D. Recon (60 sec) Recon is about **discovering attack surface**. Real targets get the full -`tools/recon_engine.sh` treatment (subdomain enum + URL crawl + tech +`bughunter/tools/recon_engine.sh` treatment (subdomain enum + URL crawl + tech fingerprint + nuclei sweep). For our localhost target there's no DNS to enumerate, so we go straight to the URL surface. @@ -111,7 +111,7 @@ you have your **attack surface**: > Pro tip: the real recon engine extracts the same list via `katana` + `gau` > + `waybackurls`. For real targets: > ```bash -> bash tools/recon_engine.sh target.com +> bash bughunter/tools/recon_engine.sh target.com > ``` --- @@ -119,7 +119,7 @@ you have your **attack surface**: ## E. Hunt — find each bug (2 min) We'll probe each endpoint with a single `curl` and note the verdict. In a -real engagement you'd run `bash tools/vuln_scanner.sh recon/target` instead +real engagement you'd run `bash bughunter/tools/vuln_scanner.sh recon/target` instead of doing it by hand — that's the same probes, batched. ### 1. Reflected XSS — `/search?q=` @@ -222,7 +222,7 @@ Six findings is too many to report at once — pick the most-paid one. We'll run the validator against the .env exposure: ```bash -python3 tools/validate.py --program shuvonsec-demo +python3 bughunter/tools/validate.py --program shuvonsec-demo ``` The validator walks you through the **4-gate checklist** and **CVSS 3.1** @@ -291,7 +291,7 @@ Same banner, same workflow line, every step. ## Where to go next -- `bash tools/external_arsenal.sh --install-hint ` to add scanners +- `bash bughunter/tools/external_arsenal.sh --install-hint ` to add scanners the demo skipped (nuclei, ffuf, dalfox — see the install table). - `/scope-aggregate ` to pull every in-scope asset across H1, Bugcrowd, Intigriti, YWH, and Immunefi in one shot. diff --git a/docs/auth-sessions.md b/docs/auth-sessions.md index f3db1020..af35b1b5 100644 --- a/docs/auth-sessions.md +++ b/docs/auth-sessions.md @@ -11,14 +11,14 @@ SQLi / SSTI / upload PoC probes — send your auth headers automatically. ```bash # Option A: CLI flags (one-off run) -python3 tools/hunt.py --target target.com \ +python3 bughunter/tools/hunt.py --target target.com \ --cookie "session=eyJabc..." \ --bearer "eyJhbGciOiJIUzI1NiI..." # Option B: env vars (persists across commands in the shell) export BBHUNT_COOKIE="session=eyJabc..." export BBHUNT_BEARER="eyJhbGciOiJIUzI1NiI..." -python3 tools/hunt.py --target target.com +python3 bughunter/tools/hunt.py --target target.com # Option C: file (recommended for multi-target hunts) cat > .private/target.json <<'JSON' @@ -27,7 +27,7 @@ cat > .private/target.json <<'JSON' "headers": ["X-Org-Id: 42", "X-CSRF-Token: abc"] } JSON -python3 tools/hunt.py --target target.com --auth-file .private/target.json +python3 bughunter/tools/hunt.py --target target.com --auth-file .private/target.json ``` The `.private/` directory is gitignored. Use it. @@ -57,7 +57,7 @@ attack they're checking for. Everything else is gated on the same session. ## CLI flags -All `tools/hunt.py` runs accept: +All `bughunter/tools/hunt.py` runs accept: ``` --auth-header 'Name: value' # repeatable @@ -80,7 +80,7 @@ BBHUNT_API_KEY # one API key (sent as X-API-Key) BBHUNT_AUTH_HEADER # newline-separated "Name: value" entries (repeatable) ``` -When `tools/hunt.py` runs, it merges all inputs into a single session and +When `bughunter/tools/hunt.py` runs, it merges all inputs into a single session and exports two derived vars to every subprocess: ``` @@ -88,11 +88,11 @@ BBHUNT_AUTH_HEADERS # the merged, deduped header list (newline-separated) BBHUNT_SESSION_ID # sha256(headers)[:12] — short, stable hash ``` -Bash scripts source `tools/_auth_helper.sh`, which turns these into an array +Bash scripts source `bughunter/tools/_auth_helper.sh`, which turns these into an array they can splat: ```bash -. tools/_auth_helper.sh +. bughunter/tools/_auth_helper.sh curl -sk "${BB_AUTH_ARGS[@]}" "$url" nuclei -l "$list" "${BB_AUTH_ARGS[@]}" -o "$out" ``` @@ -157,8 +157,8 @@ For IDOR / privilege-escalation work, keep two files: Run two passes: ```bash -python3 tools/hunt.py --target target.com --auth-file .private/user-a.json -python3 tools/hunt.py --target target.com --auth-file .private/user-b.json +python3 bughunter/tools/hunt.py --target target.com --auth-file .private/user-a.json +python3 bughunter/tools/hunt.py --target target.com --auth-file .private/user-b.json ``` Audit log entries will carry different `session_id` hashes, so you can diff @@ -192,5 +192,5 @@ requests.get(url, headers=session.headers_dict()) import subprocess, os env = os.environ.copy() session.export_to_env(env) -subprocess.run(["bash", "tools/recon_engine.sh", target], env=env) +subprocess.run(["bash", "bughunter/tools/recon_engine.sh", target], env=env) ``` diff --git a/docs/mcp-tools.md b/docs/mcp-tools.md index a4998c66..d9dc5c48 100644 --- a/docs/mcp-tools.md +++ b/docs/mcp-tools.md @@ -25,4 +25,4 @@ List at runtime: `bughunter mcp tools`. -Backed by existing `tools/recon_engine.sh`, `tools/hunt.py`, `tools/validate.py`, `tools/lead_board.py`, `memory/*`, and `mcp/hackerone-mcp/`. +Backed by existing `bughunter/tools/recon_engine.sh`, `bughunter/tools/hunt.py`, `bughunter/tools/validate.py`, `bughunter/tools/lead_board.py`, `memory/*`, and `mcp/hackerone-mcp/`. diff --git a/docs/research-learning-schema.md b/docs/research-learning-schema.md index 518795ed..ea675778 100644 --- a/docs/research-learning-schema.md +++ b/docs/research-learning-schema.md @@ -124,17 +124,17 @@ Maps to `.github/ISSUE_TEMPLATE/false_positive.md` (flagged → candidate; why | Hook | Location | |---|---| | Schema factories | `memory/schemas.py` | -| Validate persist | `tools/validate.py:write_validation_json` | +| Validate persist | `bughunter/tools/validate.py:write_validation_json` | | Remember | `commands/remember.md` (+ restore thin journal append helper) | -| Lead lifecycle | `tools/lead_board.py` touch/add/ingest | +| Lead lifecycle | `bughunter/tools/lead_board.py` touch/add/ingest | | FP regressions | `tests/test_false_positives.py` | -| Rotation / GC | `memory/rotation.py`, `tools/memory_gc.py` | +| Rotation / GC | `memory/rotation.py`, `bughunter/tools/memory_gc.py` | ## Migration v1 → v2 - Readers accept schema_version ∈ {1, 2} - Writers emit 2 -- Offline: `tools/memory_migrate.py` (or later `bughunter memory migrate`) — copy-forward, never delete hunt-memory +- Offline: `bughunter/tools/memory_migrate.py` (or later `bughunter memory migrate`) — copy-forward, never delete hunt-memory ## Non-goals (feature v1) diff --git a/skills/agentic-app-audit/SKILL.md b/skills/agentic-app-audit/SKILL.md index a1b44b76..414bb3d6 100644 --- a/skills/agentic-app-audit/SKILL.md +++ b/skills/agentic-app-audit/SKILL.md @@ -21,7 +21,7 @@ Distinct from its siblings: `skills/llm-redteam` attacks the model's text behavi | Signal | Move | |---|---| | Agent summarizes user-supplied docs/URLs | indirect injection + invisible token-smuggling (`skills/llm-redteam`) | -| Agent has a "fetch/browse URL" tool | tool-misuse -> SSRF; confirm via `tools/oob_listener.py` | +| Agent has a "fetch/browse URL" tool | tool-misuse -> SSRF; confirm via `bughunter/tools/oob_listener.py` | | Agent has persistent memory / "remember this" | cross-session memory poisoning (plant, switch identity, re-read) | | Agent calls downstream tools with your text | confused-deputy / param-to-sink (SSRF/cmd/SQL) | | Multi-agent / "assistants talk to each other" | agent-to-agent IDOR (read another agent's context) | diff --git a/skills/argus/SKILL.md b/skills/argus/SKILL.md index b11094af..1f4d0002 100644 --- a/skills/argus/SKILL.md +++ b/skills/argus/SKILL.md @@ -29,8 +29,8 @@ description: Argus — the all-seeing scanner suite. Six automated scanners for ## 1. CORS — `/cors` ```bash -tools/cors_scanner.py https://api.target.com/me --cookie "session=..." -tools/cors_scanner.py -l recon/target.com/urls/api.txt --json +bughunter/tools/cors_scanner.py https://api.target.com/me --cookie "session=..." +bughunter/tools/cors_scanner.py -l recon/target.com/urls/api.txt --json ``` Sends crafted `Origin` headers, classifies `Access-Control-Allow-Origin` / @@ -46,7 +46,7 @@ Sends crafted `Origin` headers, classifies `Access-Control-Allow-Origin` / ## 2. CRLF / host-header — `/crlf` ```bash -tools/crlf_scanner.py "https://target.com/r?u=x" --host-header +bughunter/tools/crlf_scanner.py "https://target.com/r?u=x" --host-header ``` Injects encoded CRLF (`%0d%0a`, double-encoded, UTF-8 overlong `%E5%98%8A%E5%98%8D`) @@ -61,8 +61,8 @@ open redirect, cache poisoning, reset poisoning. ## 3. NoSQL injection — `/nosqli` ```bash -tools/nosqli_scanner.py --login https://t/api/login --user-field email --pass-field password -tools/nosqli_scanner.py --query "https://t/api/items?id=1" # emits bracket variants +bughunter/tools/nosqli_scanner.py --login https://t/api/login --user-field email --pass-field password +bughunter/tools/nosqli_scanner.py --query "https://t/api/items?id=1" # emits bracket variants ``` - Operator auth-bypass: `{"email":{"$ne":null},"password":{"$ne":null}}` @@ -75,10 +75,10 @@ Sends a wrong-credential baseline first, flags a finding when status flips ## 4. JWT attacks — `/jwt-scan` (offline) ```bash -tools/jwt_scanner.py "$TOKEN" --analyze -tools/jwt_scanner.py "$TOKEN" --alg-none --set role=admin -tools/jwt_scanner.py "$TOKEN" --confuse --public-key jwks_pub.pem --set role=admin -tools/jwt_scanner.py "$TOKEN" --crack --wordlist secrets.txt +bughunter/tools/jwt_scanner.py "$TOKEN" --analyze +bughunter/tools/jwt_scanner.py "$TOKEN" --alg-none --set role=admin +bughunter/tools/jwt_scanner.py "$TOKEN" --confuse --public-key jwks_pub.pem --set role=admin +bughunter/tools/jwt_scanner.py "$TOKEN" --crack --wordlist secrets.txt ``` - `--alg-none` — strip signature, set `alg` to none/None/NONE/nOnE. @@ -96,11 +96,11 @@ correlating interactsh callbacks to the firing payload. ```bash # 1. listener (prints your OOB domain, streams interactions) -tools/oob_listener.py --listen > inter.jsonl +bughunter/tools/oob_listener.py --listen > inter.jsonl # 2. payloads embedding a unique marker per injection point -tools/oob_listener.py --payloads cXXXX.oast.fun --json > payloads.json +bughunter/tools/oob_listener.py --payloads cXXXX.oast.fun --json > payloads.json # 3. correlate received callbacks -tools/oob_listener.py --correlate inter.jsonl --payloads-file payloads.json +bughunter/tools/oob_listener.py --correlate inter.jsonl --payloads-file payloads.json ``` Covers blind SSRF, XXE (incl. OOB-DTD exfil), SQLi (MSSQL `xp_dirtree` / MySQL @@ -115,8 +115,8 @@ whole band of Critical findings is otherwise un-submittable. ## 6. LLM red-team — `/llm-redteam` ```bash -tools/llm_redteam.py --url https://t/api/chat --field message -tools/llm_redteam.py --url https://t/api/chat \ +bughunter/tools/llm_redteam.py --url https://t/api/chat --field message +bughunter/tools/llm_redteam.py --url https://t/api/chat \ --template '{"messages":[{"role":"user","content":"{{PAYLOAD}}"}]}' \ --response-path choices.0.message.content --category jailbreak ``` diff --git a/skills/bb-methodology/SKILL.md b/skills/bb-methodology/SKILL.md index fcc1c6dd..281ae177 100644 --- a/skills/bb-methodology/SKILL.md +++ b/skills/bb-methodology/SKILL.md @@ -192,16 +192,16 @@ Google Dorks -> JS file download -> Hidden param discovery -> API mapping | Live subdomains with tech stack | Phase 2 (Mapping) | | Known software (WordPress, Jira) | Check CVEs + defaults immediately | | Cloud resources (S3, Firebase) | Test permissions (read/write/list) | -| 403 **or 200 + block page** on endpoint | `tools/bypass_403.sh ` auto-detects soft blocks (200+block-body). Verdict: bypassed/needs_review/blocked. If all blocked after 5 min, skip | +| 403 **or 200 + block page** on endpoint | `bughunter/tools/bypass_403.sh ` auto-detects soft blocks (200+block-body). Verdict: bypassed/needs_review/blocked. If all blocked after 5 min, skip | | Nothing after 5 min on a host | Skip, try next host (5-minute rule) | **Command**: `/recon target.com` **After every recon (mandatory):** ```bash -python3 tools/lead_board.py ingest target.com -python3 tools/lead_board.py show target.com -python3 tools/lead_board.py next target.com +python3 bughunter/tools/lead_board.py ingest target.com +python3 bughunter/tools/lead_board.py show target.com +python3 bughunter/tools/lead_board.py next target.com # Route in plain language: "GraphQL endpoint → skills/graphql-audit" # touch status when you start / kill / report a lead ``` @@ -267,7 +267,7 @@ What input are you testing? |--------------|-------------| | Low-impact behavior (redirect, self-XSS, cookie injection) | Chain it -- find a connector gadget | | Confirmed vuln (XSS, IDOR, SQLi) | Phase 4 (Prove and Escalate) | -| Blocked by WAF/CSP/403 **or soft-block 200** | `/bypass-403 ` → check verdict (not just status) → `tools/waf_encoder.py ""` → if upload: `tools/multipart_mutator.py` → 5 min, kill | +| Blocked by WAF/CSP/403 **or soft-block 200** | `/bypass-403 ` → check verdict (not just status) → `bughunter/tools/waf_encoder.py ""` → if upload: `bughunter/tools/multipart_mutator.py` → 5 min, kill | | Known software vuln (CVE) | 1-day speed workflow | | Nothing after 20 min on this endpoint | Rotate (20-minute rule) | @@ -369,24 +369,24 @@ Every 20 minutes ask yourself: **"Am I making progress?"** | Recon: JS | `jsluice` + `mantra` + `trufflehog --only-verified` | Extract URLs/secrets -> find API keys -> verify keys actually work | | Recon: Ports | `naabu` (wide) -> `rustscan` (deep) | Fast top-1000 sweep -> full 65535 on interesting targets | | Recon: Scan | `nuclei -tags cve` -> `nuclei -tags takeover` | Known CVEs first -> then takeover (act immediately) | -| **After recon (ALWAYS)** | `python3 tools/lead_board.py ingest ` → `show` → `next` | Route every signal to a `hunt-*` skill; never lose a lead. `touch` when you start/kill/report | -| After recon: EOL | `python3 tools/eol_check.py --tech "php=7.4,nginx=1.18"` | Flag EOL products from `technologies.txt` fingerprints | -| Mapping: Params | `arjun` + `paramspider` + ParamMiner / `tools/param_discovery.sh` | Brute-force hidden params + mine archives + cache headers | -| Mapping: GraphQL | `bash tools/graphql_audit.sh ` | Introspection → fingerprint → batching → IDOR → injection | -| Mapping: CI/CD | `bash tools/cicd_scanner.sh owner/repo` | Workflow injection / secret exfil / runner poisoning | +| **After recon (ALWAYS)** | `python3 bughunter/tools/lead_board.py ingest ` → `show` → `next` | Route every signal to a `hunt-*` skill; never lose a lead. `touch` when you start/kill/report | +| After recon: EOL | `python3 bughunter/tools/eol_check.py --tech "php=7.4,nginx=1.18"` | Flag EOL products from `technologies.txt` fingerprints | +| Mapping: Params | `arjun` + `paramspider` + ParamMiner / `bughunter/tools/param_discovery.sh` | Brute-force hidden params + mine archives + cache headers | +| Mapping: GraphQL | `bash bughunter/tools/graphql_audit.sh ` | Introspection → fingerprint → batching → IDOR → injection | +| Mapping: CI/CD | `bash bughunter/tools/cicd_scanner.sh owner/repo` | Workflow injection / secret exfil / runner poisoning | | Mapping: JS code | Download -> `jsluice` -> VS Code/Cursor grep | Extract -> static analysis -> AI-assisted taint analysis | | Mapping: Dorks | Manual Google Dorks | Custom per-target queries find what automation misses | | Discovery: Fuzz | `ffuf -ac` + `cewl` custom wordlist | Auto-calibrate filtering + target-specific words beat generic lists | | Discovery: XSS | `kxss` -> `dalfox` | Filter (which params reflect?) -> scan (only reflective params) | | Discovery: SQLi | `ghauri` | Modern blind SQLi on ID-like parameters | | Discovery: SSRF | `interactsh-client` | Self-hosted OOB listener for blind SSRF/XXE/RCE | -| Discovery: WAF | `wafw00f` → `tools/bypass_403.sh` → `tools/waf_encoder.py` → `waf_response_analyzer.py` | Fingerprint → soft-block aware bypass → encoded variants → score response | -| Exploit: 403 | `tools/bypass_403.sh` / `byp4xx` | Soft-block (200+block body) aware; verdict: bypassed/needs_review/blocked | -| Exploit: Upload | `tools/multipart_mutator.py --file shell --field f` | Parser-confusion multipart variants | -| Exploit: Takeover | `tools/takeover_scanner.sh` / `subzy` | CNAME against vulnerable services | -| Exploit: Cloud | `tools/cloud_recon.sh` + `aws` CLI | Scan bucket permissions -> extract metadata credentials | -| Exploit: Secrets | `tools/secrets_hunter.sh` / `trufflehog --only-verified` | Only verified working keys (no false positives) | -| Orchestrate | `python3 tools/hunt.py --target T` | Recon → lead ingest → EOL → scan (add `--graphql` / `--cve-hunt` as needed) | +| Discovery: WAF | `wafw00f` → `bughunter/tools/bypass_403.sh` → `bughunter/tools/waf_encoder.py` → `waf_response_analyzer.py` | Fingerprint → soft-block aware bypass → encoded variants → score response | +| Exploit: 403 | `bughunter/tools/bypass_403.sh` / `byp4xx` | Soft-block (200+block body) aware; verdict: bypassed/needs_review/blocked | +| Exploit: Upload | `bughunter/tools/multipart_mutator.py --file shell --field f` | Parser-confusion multipart variants | +| Exploit: Takeover | `bughunter/tools/takeover_scanner.sh` / `subzy` | CNAME against vulnerable services | +| Exploit: Cloud | `bughunter/tools/cloud_recon.sh` + `aws` CLI | Scan bucket permissions -> extract metadata credentials | +| Exploit: Secrets | `bughunter/tools/secrets_hunter.sh` / `trufflehog --only-verified` | Only verified working keys (no false positives) | +| Orchestrate | `python3 bughunter/tools/hunt.py --target T` | Recon → lead ingest → EOL → scan (add `--graphql` / `--cve-hunt` as needed) | ### Session End Checklist diff --git a/skills/bug-bounty/SKILL.md b/skills/bug-bounty/SKILL.md index a5f75c6d..e73c16f6 100644 --- a/skills/bug-bounty/SKILL.md +++ b/skills/bug-bounty/SKILL.md @@ -49,11 +49,11 @@ Full pipeline: Recon -> Learn -> Hunt -> Validate -> Report. One skill for every 15. **ONE-HOUR RULE** -- stuck on one target for an hour with no progress? SWITCH CONTEXT 16. **TWO-EYE APPROACH** -- combine systematic testing (checklist) with anomaly detection (watch for unexpected behavior) 17. **T-SHAPED KNOWLEDGE** -- go DEEP in one area and BROAD across everything else -18. **LEAD BOARD — never lose a lead** -- after recon run `python3 tools/lead_board.py ingest ` + `show` + `next`. Route each signal to its skill ("GraphQL → hunt-graphql"). `touch` when starting/killing/reporting. Focus on one lead; the board remembers the rest. Surface stale high-priority leads unprompted. +18. **LEAD BOARD — never lose a lead** -- after recon run `python3 bughunter/tools/lead_board.py ingest ` + `show` + `next`. Route each signal to its skill ("GraphQL → hunt-graphql"). `touch` when starting/killing/reporting. Focus on one lead; the board remembers the rest. Surface stale high-priority leads unprompted. > **For the full hunting methodology** — 5-phase non-linear workflow, developer psychology framework, session discipline, tool routing by phase, and Wide/Deep route selection — see **`skills/bb-methodology/SKILL.md`**. > -> **Tool catalogue:** `tools/README.md` (~50 tools). Orchestrator: `python3 tools/hunt.py --target T` (auto lead ingest; add `--graphql` / `--cve-hunt` as needed). +> **Tool catalogue:** `bughunter/tools/README.md` (~50 tools). Orchestrator: `python3 bughunter/tools/hunt.py --target T` (auto lead ingest; add `--graphql` / `--cve-hunt` as needed). --- @@ -67,20 +67,20 @@ every downstream tool (httpx, katana, ffuf, nuclei, dalfox, the SQLi / SSTI ```bash # Pick ONE of these and run hunt.py normally: -python3 tools/hunt.py --target T --cookie 'session=eyJabc...' -python3 tools/hunt.py --target T --bearer 'eyJhbGciOi...' -python3 tools/hunt.py --target T --auth-file .private/T.json +python3 bughunter/tools/hunt.py --target T --cookie 'session=eyJabc...' +python3 bughunter/tools/hunt.py --target T --bearer 'eyJhbGciOi...' +python3 bughunter/tools/hunt.py --target T --auth-file .private/T.json # Or via env (persists for the shell): export BBHUNT_COOKIE='session=eyJabc...' -python3 tools/hunt.py --target T +python3 bughunter/tools/hunt.py --target T ``` **For IDOR / BOLA hunts**, load two sessions and diff behavior: ```bash -python3 tools/hunt.py --target T --auth-file .private/T-user-a.json -python3 tools/hunt.py --target T --auth-file .private/T-user-b.json +python3 bughunter/tools/hunt.py --target T --auth-file .private/T-user-a.json +python3 bughunter/tools/hunt.py --target T --auth-file .private/T-user-b.json # Audit log entries carry different session_id hashes → diff which # endpoints behaved differently per identity. ``` diff --git a/skills/cicd-security/SKILL.md b/skills/cicd-security/SKILL.md index 4c9877cc..0a75789a 100644 --- a/skills/cicd-security/SKILL.md +++ b/skills/cicd-security/SKILL.md @@ -30,16 +30,16 @@ description: CI/CD pipeline security hunting — GitHub Actions workflow injecti ```bash # Single repo -bash tools/cicd_scanner.sh owner/repo +bash bughunter/tools/cicd_scanner.sh owner/repo # Org-wide (up to 30 repos) -bash tools/cicd_scanner.sh "org:orgname" --limit 50 --parallel 5 +bash bughunter/tools/cicd_scanner.sh "org:orgname" --limit 50 --parallel 5 # Scan with recursive reusable workflow analysis -bash tools/cicd_scanner.sh owner/repo --recursive --depth 5 +bash bughunter/tools/cicd_scanner.sh owner/repo --recursive --depth 5 # Custom output -bash tools/cicd_scanner.sh owner/repo --output-dir ./findings/target/cicd +bash bughunter/tools/cicd_scanner.sh owner/repo --output-dir ./findings/target/cicd ``` **Output:** `findings//cicd/scan_results.txt` + `summary.txt` @@ -369,7 +369,7 @@ CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H (Critical, 10.0) | `gitleaks` | Scan repos for hardcoded secrets | `bash install_tools.sh` | | `gh` CLI | Download workflow logs, list secrets, trigger runs | `brew install gh` | | `nuclei` | CI/CD-specific templates | `-tags cicd` | -| `secrets_hunter.sh` | Wrapper for all three secret scanners | `bash tools/secrets_hunter.sh` | +| `secrets_hunter.sh` | Wrapper for all three secret scanners | `bash bughunter/tools/secrets_hunter.sh` | ```bash # Download public workflow run logs (no auth needed) diff --git a/skills/credential-attack/SKILL.md b/skills/credential-attack/SKILL.md index 881521f9..e5d3ca7d 100644 --- a/skills/credential-attack/SKILL.md +++ b/skills/credential-attack/SKILL.md @@ -169,7 +169,7 @@ RIGHT (spray order, distributes failures): ... ``` -Our `tools/_spray_http_form.py` and `_spray_oauth.py` enforce spray order. +Our `bughunter/tools/_spray_http_form.py` and `_spray_oauth.py` enforce spray order. --- @@ -260,7 +260,7 @@ Natural user instinct is `--post-data "username={USER}&password={PASSWORD}"`. Ou `theHarvester -f recon//osint/theharvester` does NOT write to that path. It writes `theharvester.json` to `$PWD` (the directory you ran the command from). -**Fix:** `tools/osint_employees.sh` wraps the call in `(cd "$OUT_DIR" && theHarvester ... -f theharvester)`. If you invoke theHarvester directly, `cd` first. +**Fix:** `bughunter/tools/osint_employees.sh` wraps the call in `(cd "$OUT_DIR" && theHarvester ... -f theharvester)`. If you invoke theHarvester directly, `cd` first. ### Pitfall 5 — CrossLinked / theHarvester returning 0 emails @@ -372,10 +372,10 @@ When our default tool fails or you want to swap, here's the practical ladder. To ## DEEP DIVE For the underlying tools' own docs: -- `tools/wordlist_engine.sh -h` -- `tools/osint_employees.sh -h` -- `tools/breach_checker.py -h` -- `tools/spray_orchestrator.sh -h` +- `bughunter/tools/wordlist_engine.sh -h` +- `bughunter/tools/osint_employees.sh -h` +- `bughunter/tools/breach_checker.py -h` +- `bughunter/tools/spray_orchestrator.sh -h` --- diff --git a/skills/graphql-audit/SKILL.md b/skills/graphql-audit/SKILL.md index 569ea8bc..8e9f079c 100644 --- a/skills/graphql-audit/SKILL.md +++ b/skills/graphql-audit/SKILL.md @@ -33,19 +33,19 @@ description: GraphQL security hunting — introspection abuse, field suggestion ```bash # Basic audit -bash tools/graphql_audit.sh https://target.com/graphql +bash bughunter/tools/graphql_audit.sh https://target.com/graphql # With auth cookie -bash tools/graphql_audit.sh https://target.com/api/graphql --cookie "session=abc123" +bash bughunter/tools/graphql_audit.sh https://target.com/api/graphql --cookie "session=abc123" # With Authorization header -bash tools/graphql_audit.sh https://target.com/graphql --header "Authorization: Bearer TOKEN" +bash bughunter/tools/graphql_audit.sh https://target.com/graphql --header "Authorization: Bearer TOKEN" # Through Burp proxy -bash tools/graphql_audit.sh https://target.com/graphql --proxy http://127.0.0.1:8080 +bash bughunter/tools/graphql_audit.sh https://target.com/graphql --proxy http://127.0.0.1:8080 # Custom output directory -bash tools/graphql_audit.sh https://target.com/graphql --output-dir ./findings/target/graphql +bash bughunter/tools/graphql_audit.sh https://target.com/graphql --output-dir ./findings/target/graphql ``` **Output:** `findings//graphql//` diff --git a/skills/llm-redteam/SKILL.md b/skills/llm-redteam/SKILL.md index 0df214d4..f121e01a 100644 --- a/skills/llm-redteam/SKILL.md +++ b/skills/llm-redteam/SKILL.md @@ -7,7 +7,7 @@ description: LLM application red-teaming — prompt injection (direct + indirect > Reflection is not exploitation. A model that *echoes* your payload is noise; a model that *acts* on it — leaks its system prompt, emits your canary, calls a tool, renders raw HTML downstream — is a bug. Prove the action, then chain it to concrete impact. -This is the first-class LLM-attack skill. The scanner behind it is `tools/llm_redteam.py` (canary-based corpus runner, `/llm-redteam`). For auditing an MCP *server*, use `skills/mcp-server-audit`; for attacking a *deployed agent* black-box, use `skills/agentic-app-audit`. +This is the first-class LLM-attack skill. The scanner behind it is `bughunter/tools/llm_redteam.py` (canary-based corpus runner, `/llm-redteam`). For auditing an MCP *server*, use `skills/mcp-server-audit`; for attacking a *deployed agent* black-box, use `skills/agentic-app-audit`. ## 0. QUICK KILL CHECKLIST @@ -23,12 +23,12 @@ Kill the lead (classify Informational, move on) when: | Signal | Run | |---|---| -| Any chat/assistant endpoint | `tools/llm_redteam.py --url --field ` (full corpus) | +| Any chat/assistant endpoint | `bughunter/tools/llm_redteam.py --url --field ` (full corpus) | | OpenAI-style API | `--template '{"messages":[{"role":"user","content":"{{PAYLOAD}}"}]}' --response-path choices.0.message.content` | | Only want one class | `--category jailbreak` (see `--list-categories`) | | Uploads/RAG/"summarize this doc" | indirect-injection + token-smuggling (invisible unicode in the doc) | | Agent has tools | excessive-agency category + `skills/agentic-app-audit` | -| Confirm blind exfil | plant a canary host, correlate with `tools/oob_listener.py` | +| Confirm blind exfil | plant a canary host, correlate with `bughunter/tools/oob_listener.py` | ## 2. ATTACK CLASSES (corpus categories) @@ -43,7 +43,7 @@ The runner fires a canary per run (`RT_PWNED_xxxx`); a category "lands" when the - **multi-turn-crescendo** — single-shot simulation of a gradual escalation jailbreak. - **cross-lingual** — override instruction in another language to dodge English-only filters. - **cipher-obfuscation** — leetspeak / ROT13-wrapped instruction. -- **token-smuggling** — invisible "Sneaky Bits" unicode (U+2062/U+2064) carrying a hidden instruction (shared encoder with `tools/hai_payload_builder.py`). +- **token-smuggling** — invisible "Sneaky Bits" unicode (U+2062/U+2064) carrying a hidden instruction (shared encoder with `bughunter/tools/hai_payload_builder.py`). - **excessive-agency** — coerce an unsafe tool call / exfil (SSRF via "fetch URL", email send, payment). - **insecure-output** — get the model to emit raw HTML/script that a downstream sink renders (XSS via AI). @@ -80,6 +80,6 @@ This table is the ONE authoritative ASI mapping for the whole toolkit — `skill ## 5. CONFIRMATION DISCIPLINE (no false positives) - A category only counts when the **canary / real leak / tool-call** is observed in the response — never on "it sounded compliant." -- For blind exfil, require a correlated out-of-band callback (`tools/oob_listener.py`), not just a rendered beacon tag. -- For insecure-output XSS, confirm execution at the **downstream sink** with the XSS verifier (`tools/verifiers/xss.py` / `tools/dom_xss_harness.py`), not in the chat reply. +- For blind exfil, require a correlated out-of-band callback (`bughunter/tools/oob_listener.py`), not just a rendered beacon tag. +- For insecure-output XSS, confirm execution at the **downstream sink** with the XSS verifier (`tools/verifiers/xss.py` / `bughunter/tools/dom_xss_harness.py`), not in the chat reply. - Record the exact payload + response excerpt; the report must be reproducible verbatim. diff --git a/skills/meme-coin-audit/SKILL.md b/skills/meme-coin-audit/SKILL.md index 9880c77a..097edf28 100644 --- a/skills/meme-coin-audit/SKILL.md +++ b/skills/meme-coin-audit/SKILL.md @@ -142,13 +142,13 @@ Run the token scanner tool for fast red flag detection: ```bash # EVM token -python3 tools/token_scanner.py contracts/Token.sol +python3 bughunter/tools/token_scanner.py contracts/Token.sol # Solana program -python3 tools/token_scanner.py programs/token/ --chain solana --recursive +python3 bughunter/tools/token_scanner.py programs/token/ --chain solana --recursive # Full directory scan with report -python3 tools/token_scanner.py src/ --recursive --output findings/token-report.md +python3 bughunter/tools/token_scanner.py src/ --recursive --output findings/token-report.md ``` The scanner checks all 8 bug classes via regex patterns. It catches: diff --git a/skills/report-writing/SKILL.md b/skills/report-writing/SKILL.md index f8e1d02b..ebe4efed 100644 --- a/skills/report-writing/SKILL.md +++ b/skills/report-writing/SKILL.md @@ -38,7 +38,7 @@ findings/-/ └── evidence/ # screenshots, curl output, response bodies when available ``` -If `tools/validate.py` already wrote `submission-notes.md`, append/update it +If `bughunter/tools/validate.py` already wrote `submission-notes.md`, append/update it instead of creating a duplicate. --- diff --git a/skills/security-arsenal/METHODOLOGY_CHEATSHEET.md b/skills/security-arsenal/METHODOLOGY_CHEATSHEET.md index 65630a8c..565ff26d 100644 --- a/skills/security-arsenal/METHODOLOGY_CHEATSHEET.md +++ b/skills/security-arsenal/METHODOLOGY_CHEATSHEET.md @@ -73,7 +73,7 @@ table during the hunt. 5. ZIP/tar slip: filename `../../../etc/passwd` extracted into restricted dir. ### Subdomain takeover -1. Run `tools/takeover_scanner.sh --recon recon/` — covers most fingerprints. +1. Run `bughunter/tools/takeover_scanner.sh --recon recon/` — covers most fingerprints. 2. Manual: `dig CNAME suspect.target.com`; if it points at a service that returns a "no such app/page" page → claimable. 3. Check `EdOverflow/can-i-take-over-xyz` for the per-provider claim flow. diff --git a/skills/security-arsenal/REFERENCES.md b/skills/security-arsenal/REFERENCES.md index 21dee70f..f33284ed 100644 --- a/skills/security-arsenal/REFERENCES.md +++ b/skills/security-arsenal/REFERENCES.md @@ -55,7 +55,7 @@ GitHub stars list — high-signal repos curated by working bounty hunters. | Repo | Use it for | |---|---| | `EdOverflow/can-i-take-over-xyz` | Authoritative fingerprint + claim-instructions list | -| `punk-security/dnsReaper` | Best-in-class scanner (already wrapped in `tools/takeover_scanner.sh`) | +| `punk-security/dnsReaper` | Best-in-class scanner (already wrapped in `bughunter/tools/takeover_scanner.sh`) | | `vincentcox/bypass-firewalls-by-DNS-history` | DNS-history origin-IP lookup | | `m0rtem/CloudFail` | CloudFlare-specific origin discovery | | `spyboy-productions/CloakQuest3r` | CloudFlare/Sucuri origin IP exposure | diff --git a/skills/security-arsenal/SKILL.md b/skills/security-arsenal/SKILL.md index 17dbf932..5b84fbbe 100644 --- a/skills/security-arsenal/SKILL.md +++ b/skills/security-arsenal/SKILL.md @@ -543,7 +543,7 @@ WAF vendors often return **HTTP 200 OK with a block page** to confuse attackers: - Custom enterprise WAFs: `200 OK` + "Your request has been blocked. Log ID: WAF-..." - AWS + CloudFront custom error pages: may return `200` or `403` depending on config -**Verdict system in `tools/bypass_403.sh`:** +**Verdict system in `bughunter/tools/bypass_403.sh`:** | Verdict | Meaning | Action | |---|---|---| @@ -572,7 +572,7 @@ WAF vendors often return **HTTP 200 OK with a block page** to confuse attackers: | AWS | Header: `X-Amzn-Trace-Id: Root=1--...` | Timestamp in hex | | Generic | Body: `Log ID: WAF-20240512-xxxx` | Include in bug report for triage | -Log IDs extracted by `tools/bypass_403.sh` and `tools/waf_response_analyzer.py --classify`. Include them in reports — triage can verify directly from internal WAF logs. +Log IDs extracted by `bughunter/tools/bypass_403.sh` and `bughunter/tools/waf_response_analyzer.py --classify`. Include them in reports — triage can verify directly from internal WAF logs. ### 403 Bypass Quick Reference @@ -648,7 +648,7 @@ Log IDs extracted by `tools/bypass_403.sh` and `tools/waf_response_analyzer.py - | SQL operator | `=` | `LIKE` | Avoid `=` token | | Base64 XSS | `alert(1)` | `` | Bypass keyword filter | -Generate all variants with: `tools/waf_encoder.py "" --class sqli|xss|generic` +Generate all variants with: `bughunter/tools/waf_encoder.py "" --class sqli|xss|generic` ### Content-Type Confusion @@ -672,7 +672,7 @@ Generate all variants with: `tools/waf_encoder.py "" --class sqli|xss|g | Duplicate `filename=` param | Parser picks first value, scanner sees second | | CRLF/LF mix between parts | Strict-CRLF parser breaks, lenient parser continues | -Generate variants with: `tools/multipart_mutator.py --file shell.aspx --field file` +Generate variants with: `bughunter/tools/multipart_mutator.py --file shell.aspx --field file` ### Origin Server Discovery (Cloudflare Bypass) @@ -702,9 +702,9 @@ Got 403? │ ├── AWS WAF → /**/ comment split + oversized body │ ├── Imperva → unicode overlong + param pollution │ └── F5 → double-slash path + strip TS cookie -├── Payload blocked? tools/waf_encoder.py "" --class sqli|xss +├── Payload blocked? bughunter/tools/waf_encoder.py "" --class sqli|xss │ └── Try each variant until 200 response -├── Upload endpoint? tools/multipart_mutator.py --file shell --field f +├── Upload endpoint? bughunter/tools/multipart_mutator.py --file shell --field f │ └── Try all 10 parser-confusion variants └── 5 min total, still blocked → kill (5-minute rule) ``` diff --git a/skills/web2-vuln-classes/SKILL.md b/skills/web2-vuln-classes/SKILL.md index b981b151..f6f26fcb 100644 --- a/skills/web2-vuln-classes/SKILL.md +++ b/skills/web2-vuln-classes/SKILL.md @@ -142,7 +142,7 @@ location.href = userInput - XSS + credential theft via fake login form = ATO - **No JS allowed?** CSS injection can still exfil tokens via attribute selectors — see **CSS Injection** -**WAF bypass for XSS**: Run `tools/waf_encoder.py "" --class xss` to get 20+ variants (HTML entity, unicode escape, base64-wrapped). Try `` or `` when `