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)` | `