huntkit 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. huntkit-0.3.0/LICENSE +21 -0
  2. huntkit-0.3.0/PKG-INFO +340 -0
  3. huntkit-0.3.0/README.md +309 -0
  4. huntkit-0.3.0/huntkit/__init__.py +4 -0
  5. huntkit-0.3.0/huntkit/__main__.py +8 -0
  6. huntkit-0.3.0/huntkit/ai/__init__.py +42 -0
  7. huntkit-0.3.0/huntkit/ai/advisor.py +133 -0
  8. huntkit-0.3.0/huntkit/ai/providers.py +200 -0
  9. huntkit-0.3.0/huntkit/app/__init__.py +13 -0
  10. huntkit-0.3.0/huntkit/app/config_cmd.py +65 -0
  11. huntkit-0.3.0/huntkit/app/context.py +50 -0
  12. huntkit-0.3.0/huntkit/app/main.py +1166 -0
  13. huntkit-0.3.0/huntkit/app/plugins_cmd.py +79 -0
  14. huntkit-0.3.0/huntkit/app/workspace_cmd.py +62 -0
  15. huntkit-0.3.0/huntkit/core/__init__.py +6 -0
  16. huntkit-0.3.0/huntkit/core/cache.py +67 -0
  17. huntkit-0.3.0/huntkit/core/config.py +272 -0
  18. huntkit-0.3.0/huntkit/core/logger.py +66 -0
  19. huntkit-0.3.0/huntkit/core/pacing.py +71 -0
  20. huntkit-0.3.0/huntkit/core/runner.py +117 -0
  21. huntkit-0.3.0/huntkit/core/state.py +154 -0
  22. huntkit-0.3.0/huntkit/core/workspace.py +145 -0
  23. huntkit-0.3.0/huntkit/enrich/__init__.py +39 -0
  24. huntkit-0.3.0/huntkit/enrich/asn.py +139 -0
  25. huntkit-0.3.0/huntkit/enrich/engine.py +167 -0
  26. huntkit-0.3.0/huntkit/enrich/favicon.py +91 -0
  27. huntkit-0.3.0/huntkit/enrich/mmh3.py +69 -0
  28. huntkit-0.3.0/huntkit/fingerprint/__init__.py +26 -0
  29. huntkit-0.3.0/huntkit/fingerprint/engine.py +83 -0
  30. huntkit-0.3.0/huntkit/fingerprint/rules.py +170 -0
  31. huntkit-0.3.0/huntkit/history/__init__.py +38 -0
  32. huntkit-0.3.0/huntkit/history/diff.py +95 -0
  33. huntkit-0.3.0/huntkit/history/store.py +133 -0
  34. huntkit-0.3.0/huntkit/intel/__init__.py +48 -0
  35. huntkit-0.3.0/huntkit/intel/engine.py +233 -0
  36. huntkit-0.3.0/huntkit/intel/signals.py +826 -0
  37. huntkit-0.3.0/huntkit/knowledge/__init__.py +27 -0
  38. huntkit-0.3.0/huntkit/knowledge/playbooks.py +452 -0
  39. huntkit-0.3.0/huntkit/monitor/__init__.py +24 -0
  40. huntkit-0.3.0/huntkit/monitor/runner.py +111 -0
  41. huntkit-0.3.0/huntkit/notify/__init__.py +16 -0
  42. huntkit-0.3.0/huntkit/notify/webhook.py +73 -0
  43. huntkit-0.3.0/huntkit/pipeline.py +302 -0
  44. huntkit-0.3.0/huntkit/plugins/__init__.py +36 -0
  45. huntkit-0.3.0/huntkit/plugins/amass.py +25 -0
  46. huntkit-0.3.0/huntkit/plugins/arjun.py +18 -0
  47. huntkit-0.3.0/huntkit/plugins/assetfinder.py +18 -0
  48. huntkit-0.3.0/huntkit/plugins/base.py +220 -0
  49. huntkit-0.3.0/huntkit/plugins/chaos.py +20 -0
  50. huntkit-0.3.0/huntkit/plugins/dalfox.py +24 -0
  51. huntkit-0.3.0/huntkit/plugins/dnsx.py +19 -0
  52. huntkit-0.3.0/huntkit/plugins/ffuf.py +34 -0
  53. huntkit-0.3.0/huntkit/plugins/findomain.py +18 -0
  54. huntkit-0.3.0/huntkit/plugins/gau.py +18 -0
  55. huntkit-0.3.0/huntkit/plugins/hakrawler.py +19 -0
  56. huntkit-0.3.0/huntkit/plugins/httpx.py +30 -0
  57. huntkit-0.3.0/huntkit/plugins/katana.py +23 -0
  58. huntkit-0.3.0/huntkit/plugins/naabu.py +22 -0
  59. huntkit-0.3.0/huntkit/plugins/nmap.py +39 -0
  60. huntkit-0.3.0/huntkit/plugins/nuclei.py +27 -0
  61. huntkit-0.3.0/huntkit/plugins/registry.py +117 -0
  62. huntkit-0.3.0/huntkit/plugins/subfinder.py +21 -0
  63. huntkit-0.3.0/huntkit/plugins/waybackurls.py +29 -0
  64. huntkit-0.3.0/huntkit/plugins/whatweb.py +19 -0
  65. huntkit-0.3.0/huntkit/py.typed +0 -0
  66. huntkit-0.3.0/huntkit/report/__init__.py +103 -0
  67. huntkit-0.3.0/huntkit/report/builder.py +145 -0
  68. huntkit-0.3.0/huntkit/report/render.py +323 -0
  69. huntkit-0.3.0/huntkit/scanner/__init__.py +28 -0
  70. huntkit-0.3.0/huntkit/scanner/runner.py +239 -0
  71. huntkit-0.3.0/huntkit/secrets/__init__.py +34 -0
  72. huntkit-0.3.0/huntkit/secrets/patterns.py +172 -0
  73. huntkit-0.3.0/huntkit/secrets/scanner.py +133 -0
  74. huntkit-0.3.0/huntkit/shots/__init__.py +29 -0
  75. huntkit-0.3.0/huntkit/shots/runner.py +186 -0
  76. huntkit-0.3.0/huntkit/tui/__init__.py +13 -0
  77. huntkit-0.3.0/huntkit/tui/dashboard.py +160 -0
  78. huntkit-0.3.0/huntkit/utils/__init__.py +6 -0
  79. huntkit-0.3.0/huntkit/utils/filesystem.py +109 -0
  80. huntkit-0.3.0/huntkit/utils/process.py +104 -0
  81. huntkit-0.3.0/huntkit/utils/severity.py +49 -0
  82. huntkit-0.3.0/huntkit/utils/terminal.py +88 -0
  83. huntkit-0.3.0/huntkit/utils/validators.py +99 -0
  84. huntkit-0.3.0/huntkit.egg-info/PKG-INFO +340 -0
  85. huntkit-0.3.0/huntkit.egg-info/SOURCES.txt +115 -0
  86. huntkit-0.3.0/huntkit.egg-info/dependency_links.txt +1 -0
  87. huntkit-0.3.0/huntkit.egg-info/entry_points.txt +2 -0
  88. huntkit-0.3.0/huntkit.egg-info/requires.txt +14 -0
  89. huntkit-0.3.0/huntkit.egg-info/top_level.txt +1 -0
  90. huntkit-0.3.0/pyproject.toml +84 -0
  91. huntkit-0.3.0/setup.cfg +4 -0
  92. huntkit-0.3.0/tests/test_ai.py +250 -0
  93. huntkit-0.3.0/tests/test_cache_state.py +84 -0
  94. huntkit-0.3.0/tests/test_cli.py +131 -0
  95. huntkit-0.3.0/tests/test_config.py +56 -0
  96. huntkit-0.3.0/tests/test_demo.py +43 -0
  97. huntkit-0.3.0/tests/test_docker.py +66 -0
  98. huntkit-0.3.0/tests/test_enrich.py +248 -0
  99. huntkit-0.3.0/tests/test_filesystem.py +51 -0
  100. huntkit-0.3.0/tests/test_fingerprint.py +115 -0
  101. huntkit-0.3.0/tests/test_history.py +180 -0
  102. huntkit-0.3.0/tests/test_intel.py +330 -0
  103. huntkit-0.3.0/tests/test_knowledge.py +154 -0
  104. huntkit-0.3.0/tests/test_monitor.py +233 -0
  105. huntkit-0.3.0/tests/test_notify.py +97 -0
  106. huntkit-0.3.0/tests/test_pacing.py +67 -0
  107. huntkit-0.3.0/tests/test_pipeline.py +226 -0
  108. huntkit-0.3.0/tests/test_plugins.py +274 -0
  109. huntkit-0.3.0/tests/test_process_runner.py +69 -0
  110. huntkit-0.3.0/tests/test_release.py +62 -0
  111. huntkit-0.3.0/tests/test_report.py +203 -0
  112. huntkit-0.3.0/tests/test_scan.py +197 -0
  113. huntkit-0.3.0/tests/test_secrets.py +141 -0
  114. huntkit-0.3.0/tests/test_shots.py +187 -0
  115. huntkit-0.3.0/tests/test_tui.py +115 -0
  116. huntkit-0.3.0/tests/test_validators.py +74 -0
  117. huntkit-0.3.0/tests/test_workspace.py +81 -0
huntkit-0.3.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Raresney
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
huntkit-0.3.0/PKG-INFO ADDED
@@ -0,0 +1,340 @@
1
+ Metadata-Version: 2.4
2
+ Name: huntkit
3
+ Version: 0.3.0
4
+ Summary: Local-first bug bounty recon, methodology & workflow framework for authorised testing.
5
+ Author: Raresney
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/Raresney/HuntKit
8
+ Project-URL: Repository, https://github.com/Raresney/HuntKit
9
+ Project-URL: Issues, https://github.com/Raresney/HuntKit/issues
10
+ Keywords: bugbounty,recon,security,pentest,cli,osint,framework
11
+ Classifier: Environment :: Console
12
+ Classifier: Intended Audience :: Information Technology
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Topic :: Security
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+ Requires-Dist: typer>=0.12
19
+ Requires-Dist: rich>=13.7
20
+ Requires-Dist: pyyaml>=6.0
21
+ Provides-Extra: ai
22
+ Requires-Dist: httpx>=0.27; extra == "ai"
23
+ Provides-Extra: dev
24
+ Requires-Dist: pytest>=8.0; extra == "dev"
25
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
26
+ Requires-Dist: ruff>=0.5; extra == "dev"
27
+ Requires-Dist: mypy>=1.10; extra == "dev"
28
+ Requires-Dist: types-PyYAML; extra == "dev"
29
+ Requires-Dist: pre-commit>=3.7; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ # HuntKit
33
+
34
+ [![CI](https://github.com/Raresney/HuntKit/actions/workflows/ci.yml/badge.svg)](https://github.com/Raresney/HuntKit/actions/workflows/ci.yml)
35
+ ![Python](https://img.shields.io/badge/python-3.10%2B-blue)
36
+ ![License](https://img.shields.io/badge/license-MIT-blue)
37
+ ![Coverage](https://img.shields.io/badge/coverage-92%25-brightgreen)
38
+ [![PyPI](https://img.shields.io/pypi/v/huntkit)](https://pypi.org/project/huntkit/)
39
+ ![Release](https://img.shields.io/badge/release-v0.3.0-blue)
40
+
41
+ **Local-first bug-bounty recon, methodology & workflow framework for _authorised_ testing.**
42
+
43
+ HuntKit drives the bug-bounty toolchain you already use (subfinder, httpx, naabu,
44
+ gau, nuclei, ffuf, dalfox, …), keeps every engagement in a tidy per-program
45
+ workspace, then **reasons over what it found** — scoring the attack surface,
46
+ pointing you at the right playbooks, and writing a shareable report. Everything
47
+ is offline and on your machine; the only time data can leave is a cloud-AI call
48
+ you explicitly approve.
49
+
50
+ > ⚠️ **Authorised testing only.** Use HuntKit against assets you own or that are
51
+ > explicitly in scope for a bug-bounty program or signed engagement. It enforces
52
+ > a per-program scope list and refuses recon on hosts you haven't declared in
53
+ > scope. You are responsible for staying within the rules.
54
+
55
+ ---
56
+
57
+ ## Demo
58
+
59
+ ![HuntKit — an end-to-end recon run](docs/demo.svg)
60
+
61
+ A full pass — scope guard, recon, scan, analyze, report, then continuous
62
+ `monitor` and the live `dashboard` — against Acunetix's public, intentionally
63
+ vulnerable test site. The step-by-step walkthrough with real output is in
64
+ [DEMO.md](DEMO.md).
65
+
66
+ ---
67
+
68
+ ## Highlights
69
+
70
+ - **Parallel, resumable recon pipeline** — `subdomains → resolve → live → ports → urls`,
71
+ running every available tool in each wave concurrently, deduped on disk, with
72
+ stage resume and an opt-in content-addressed cache.
73
+ - **Pluggable toolchain** — each external tool is one file in `huntkit/plugins/`.
74
+ Adding a tool is dropping a file; the pipeline wires it in by capability.
75
+ - **Active scanning** — `scan` drives the vuln/fuzz plugins (nuclei, dalfox, …)
76
+ over the URLs recon gathered, **re-checked against scope**, writing findings
77
+ to the workspace's `scans/` dir — where `analyze` folds them into host scoring.
78
+ - **Intelligence engine** — turns recon output **and scan findings** into scored,
79
+ prioritised hosts and **attack paths** (which bug class to run, and where), from
80
+ a declarative signal catalog. Pure and offline — it never touches the target.
81
+ - **Knowledge base** — full playbooks for 9 bug classes (detection, payloads,
82
+ bypasses, tools, references), cross-linked from the attack paths.
83
+ - **Reporting** — one model rendered to Markdown, a self-contained HTML page, or
84
+ JSON (PDF when `weasyprint` is present, else print-ready HTML).
85
+ - **AI advisor (optional)** — hand the scored surface to a local Ollama model, or
86
+ a cloud model (Claude/OpenAI) **only after an explicit approval prompt that
87
+ shows exactly what will be sent**.
88
+ - **Content scanners** — a redacting secret & JS-endpoint scanner, and a
89
+ header-based CDN/WAF/cloud/tech fingerprinter.
90
+ - **Asset-correlation enrichment** — `enrich` hashes each origin's favicon
91
+ (the Shodan `http.favicon.hash:` pivot) and maps every host to its ASN /
92
+ BGP prefix, turning one asset into the rest of the estate to sweep.
93
+ - **Screenshot gallery** — `shots` drives `gowitness` over the live URLs and
94
+ the report embeds the captures as a grid (inlined, so the HTML stays one
95
+ self-contained file) — eyeball a big surface at a glance.
96
+ - **Diff across runs** — `diff` snapshots a program's result set and shows the
97
+ delta on the next sweep: new subdomains, freshly-live URLs, and above all
98
+ **new findings** — the thing you actually re-run a program to catch.
99
+ - **Live dashboard** — `dashboard` paints the whole engagement on one screen
100
+ (priority, recon surface, top hosts, attack paths, notable exposures,
101
+ enrichment) and `--watch` redraws it live. Built on Rich — no extra deps.
102
+ - **Continuous monitoring** — `monitor` re-sweeps a program, diffs the result
103
+ set against the last snapshot, and pings a Slack/Discord webhook the moment a
104
+ **new finding** turns up. `--interval N` loops every N minutes — a program
105
+ watches itself while you sleep.
106
+
107
+ ---
108
+
109
+ ## Install
110
+
111
+ Requires **Python 3.10+**. Runtime deps are light: `typer`, `rich`, `pyyaml`.
112
+
113
+ ```bash
114
+ pip install huntkit # or: pipx install huntkit
115
+ huntkit doctor
116
+ ```
117
+
118
+ Or from source:
119
+
120
+ ```bash
121
+ git clone https://github.com/Raresney/HuntKit.git
122
+ cd HuntKit
123
+ pip install -e . # or: pipx install .
124
+
125
+ # run it:
126
+ python -m huntkit doctor
127
+ ```
128
+
129
+ The external tools are the usual bug-bounty stack. `doctor` shows what you have;
130
+ anything missing is reported with its install hint and that stage is simply
131
+ skipped, so HuntKit is useful even on a fresh box.
132
+
133
+ On a Debian-family box (Kali / Ubuntu), the whole toolchain plus HuntKit itself
134
+ installs in one shot:
135
+
136
+ ```bash
137
+ bash scripts/install-tools.sh # apt + go install + arjun, then huntkit in a venv
138
+ ```
139
+
140
+ The tools are Linux-native — a Kali VM (or WSL) is the intended runtime.
141
+
142
+ ### Docker — the whole toolchain, baked
143
+
144
+ No Linux box to set up? The image carries HuntKit **and** every external tool,
145
+ so it runs anywhere Docker does:
146
+
147
+ ```bash
148
+ docker build -t huntkit .
149
+ docker run --rm huntkit doctor
150
+
151
+ # a real run — mount a dir to keep workspaces, add caps for naabu's SYN scan
152
+ docker run --rm -v "$PWD/hk-data:/data" \
153
+ --cap-add=NET_ADMIN --cap-add=NET_RAW \
154
+ huntkit recon acme.com -p acme
155
+ ```
156
+
157
+ Engagement data lives in the `/data` volume (`HUNTKIT_HOME`); mount a host
158
+ directory to keep it between runs. The image never bakes in a workspace.
159
+
160
+ ---
161
+
162
+ ## Quick start
163
+
164
+ ```bash
165
+ # 1. create a workspace + declare scope
166
+ python -m huntkit init acme -s "*.acme.com" -x blog.acme.com
167
+
168
+ # 2. run the recon pipeline
169
+ python -m huntkit recon acme.com -p acme
170
+
171
+ # 3. actively scan the gathered URLs (nuclei, dalfox, …)
172
+ python -m huntkit scan -p acme
173
+
174
+ # 4. enrich: favicon hashes (Shodan pivot) + ASN/BGP origins
175
+ python -m huntkit enrich -p acme
176
+
177
+ # 5. screenshot every live URL (feeds the report gallery)
178
+ python -m huntkit shots -p acme
179
+
180
+ # 6. score the surface into prioritised hosts + attack paths
181
+ python -m huntkit analyze -p acme
182
+
183
+ # 7. pull a full playbook for a bug class the analysis points at
184
+ python -m huntkit playbook ssrf
185
+
186
+ # 8. write a shareable report (embeds the screenshot gallery)
187
+ python -m huntkit report -p acme -f html
188
+
189
+ # 9. (optional) ask a local LLM to prioritise it
190
+ python -m huntkit advise -p acme --provider ollama
191
+
192
+ # 10. (optional) re-sweep on a schedule, ping me when a new finding lands
193
+ python -m huntkit monitor acme.com -p acme \
194
+ --webhook "$SLACK_WEBHOOK" --interval 360
195
+ ```
196
+
197
+ With a single workspace, `-p` is inferred.
198
+
199
+ ---
200
+
201
+ ## Commands
202
+
203
+ | Command | What it does |
204
+ | --- | --- |
205
+ | `doctor` | Show which external tools are installed / missing, and where data lives. |
206
+ | `init <program> -s <scope>` | Create a workspace and set in/out scope (`*.wildcards` ok). |
207
+ | `recon <domain> [--stage] [--threads] [--fresh] [--no-cache]` | Parallel, resumable recon pipeline. |
208
+ | `scan -p <program> [--tool] [--threads] [--no-cache]` | Run the vuln/fuzz scanners (nuclei, dalfox) over the gathered in-scope URLs. |
209
+ | `enrich -p <program> [--favicon/--no-favicon] [--asn/--no-asn]` | Favicon hashes (Shodan pivot) + ASN/BGP origin per host. |
210
+ | `shots -p <program>` | Screenshot every live in-scope URL (gowitness) for the report gallery. |
211
+ | `analyze -p <program>` | Score hosts Low→Critical and roll signals into attack paths. |
212
+ | `playbook [<id>] [--md]` | List the bug-class knowledge base, or render one playbook. |
213
+ | `report -p <program> [-f md\|html\|json\|pdf]` | Write an engagement report. |
214
+ | `diff -p <program> [--save] [--against <id>] [--list]` | Snapshot the result set and show what changed since a baseline. |
215
+ | `dashboard -p <program> [--watch <secs>]` | One-screen engagement overview; `--watch` redraws it live. |
216
+ | `monitor <domain> -p <program> [--webhook <url>] [--notify-on findings\|changes] [--interval <min>]` | Re-sweep, diff vs. last snapshot, and webhook-notify on new findings. |
217
+ | `advise -p <program> [--provider] [--yes]` | LLM action plan (local, or cloud with approval). |
218
+ | `secrets <paths…> [--endpoints] [--out]` | Scan gathered text for leaked secrets + JS endpoints (redacted). |
219
+ | `fingerprint <file\|-> [--out]` | Identify CDN / WAF / cloud / tech from response headers. |
220
+ | `config` · `plugins` · `workspace` | Manage config, inspect the tool registry, list workspaces. |
221
+ | `clean -p <program>` | Reset stage state and/or clear the tool cache. |
222
+
223
+ Bug classes: `idor`, `bac`, `xss`, `ssrf`, `sqli`, `ssti`, `subtakeover`,
224
+ `authn`, `cors`.
225
+
226
+ ---
227
+
228
+ ## How it fits together
229
+
230
+ ```
231
+ recon ──▶ scan ──▶ intel.analyze ──▶ report ──▶ advise
232
+ (tools) (nuclei/ (scores recon + (md/html/json) (LLM, gated)
233
+ dalfox) scan findings → │
234
+ attack paths) │
235
+ └──────▶ knowledge playbooks (huntkit playbook <id>)
236
+
237
+ enrich — favicon hashes + ASN/BGP origins over the recon surface (pivot outward)
238
+ shots — gowitness screenshots of the live URLs, embedded in the HTML report
239
+ secrets / fingerprint — standalone scanners over content you've gathered
240
+ diff — snapshot the result set and show the delta on the next sweep
241
+ monitor — re-sweep on a schedule; diff vs. last snapshot; webhook on new findings
242
+ ```
243
+
244
+ The recon layer is a thin orchestrator over **plugins**; the analysis,
245
+ knowledge, reporting, AI and scanner layers are pure feature packages that build
246
+ on a small `core` (config, workspace, state, runner) and `utils`.
247
+
248
+ ---
249
+
250
+ ## Security model
251
+
252
+ - **Scope guard** — recon refuses any host not matched by the program's in-scope
253
+ list (and honours out-of-scope patterns).
254
+ - **Safe subprocess** — tools are run argv-only, never through a shell.
255
+ - **Politeness, one knob** — `http.rate_limit` (requests/sec), `http.delay`
256
+ (seconds between requests) and `general.rate` (port-scan packets/sec) are a
257
+ single policy that HuntKit maps onto every rate-aware tool's native flags
258
+ (subfinder, dnsx, httpx, naabu, katana, nuclei, ffuf, dalfox). Dial a program
259
+ down to a gentle crawl in one place — real programs ban noisy scanners.
260
+ - **Redaction** — the secret scanner masks every match, so its tables and JSON
261
+ locate a leak without re-leaking it.
262
+ - **Cloud-AI approval gate** — a local provider (Ollama) stays offline. A cloud
263
+ provider is sent nothing unless you confirm, after being shown the exact text
264
+ and the destination host — and that check is enforced in the advisor layer,
265
+ not just the CLI.
266
+ - **Webhook egress is opt-in** — `monitor` only POSTs to a webhook you pass
267
+ explicitly (`--webhook`), scheme-guarded to http(s). Sending a diff to
268
+ Slack/Discord is egress of engagement data to a third party, so it never
269
+ happens by default and the CLI names the destination host before it sends.
270
+ - **Enrichment egress is named** — `enrich` fetches favicons from in-scope
271
+ targets (scheme-guarded to http/https), and its ASN lookup sends a resolved
272
+ in-scope IP to Team Cymru's public WHOIS — the one call to a non-target host,
273
+ called out in the CLI before it runs.
274
+ - **Engagement data is gitignored** — never commit a workspace.
275
+
276
+ ---
277
+
278
+ ## Extending — add a row, not a branch
279
+
280
+ The framework is built around declarative catalogs:
281
+
282
+ | To add… | Drop a row in… |
283
+ | --- | --- |
284
+ | an external tool | a one-file plugin in `huntkit/plugins/` |
285
+ | a scoring heuristic | `PORT_RULES` / `PATH_RULES` / … in `huntkit/intel/signals.py` |
286
+ | a bug-class playbook | `PLAYBOOKS` in `huntkit/knowledge/playbooks.py` |
287
+ | a secret pattern | `SECRET_PATTERNS` in `huntkit/secrets/patterns.py` |
288
+ | a CDN/WAF/tech fingerprint | `FINGERPRINT_RULES` in `huntkit/fingerprint/rules.py` |
289
+
290
+ ---
291
+
292
+ ## Workspace layout
293
+
294
+ ```
295
+ ~/.huntkit/<program>/
296
+ ├── scope/ in/out scope lists
297
+ ├── recon/ subdomains.txt, resolved.txt, live.txt, ports.txt
298
+ ├── urls/ urls.txt
299
+ ├── scans/ intel.json, findings.json, enrich.json, screenshots.json …
300
+ ├── notes/ your own notes
301
+ ├── history/ timestamped result snapshots (for `diff`)
302
+ ├── reports/ generated md / html / json (+ shots/ screenshots)
303
+ └── state.json stage tracking + counts
304
+ ```
305
+
306
+ Override the base dir with `-w <dir>` or `$HUNTKIT_HOME`.
307
+
308
+ ---
309
+
310
+ ## Development
311
+
312
+ ```bash
313
+ pip install -e ".[dev]"
314
+ ruff check huntkit tests # lint
315
+ ruff format huntkit tests # format (CI checks with --check)
316
+ mypy huntkit # type-check
317
+ pytest --cov=huntkit # tests (92% coverage, gate at 90%)
318
+ ```
319
+
320
+ CI runs lint, format-check, type-check and tests on Python 3.10–3.13.
321
+
322
+ ---
323
+
324
+ ## Acknowledgements
325
+
326
+ HuntKit's AI advisor (`feat(ai): multi-provider advisor with cloud-approval gate`)
327
+ was selected for the [XERJ Corpus Hub](https://hub.xerj.org) as a reference
328
+ implementation, under this repository's MIT license with attribution.
329
+
330
+ ---
331
+
332
+ ## Changelog
333
+
334
+ See [CHANGELOG.md](CHANGELOG.md). Current release: **v0.3.0**.
335
+
336
+ ---
337
+
338
+ ## License
339
+
340
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,309 @@
1
+ # HuntKit
2
+
3
+ [![CI](https://github.com/Raresney/HuntKit/actions/workflows/ci.yml/badge.svg)](https://github.com/Raresney/HuntKit/actions/workflows/ci.yml)
4
+ ![Python](https://img.shields.io/badge/python-3.10%2B-blue)
5
+ ![License](https://img.shields.io/badge/license-MIT-blue)
6
+ ![Coverage](https://img.shields.io/badge/coverage-92%25-brightgreen)
7
+ [![PyPI](https://img.shields.io/pypi/v/huntkit)](https://pypi.org/project/huntkit/)
8
+ ![Release](https://img.shields.io/badge/release-v0.3.0-blue)
9
+
10
+ **Local-first bug-bounty recon, methodology & workflow framework for _authorised_ testing.**
11
+
12
+ HuntKit drives the bug-bounty toolchain you already use (subfinder, httpx, naabu,
13
+ gau, nuclei, ffuf, dalfox, …), keeps every engagement in a tidy per-program
14
+ workspace, then **reasons over what it found** — scoring the attack surface,
15
+ pointing you at the right playbooks, and writing a shareable report. Everything
16
+ is offline and on your machine; the only time data can leave is a cloud-AI call
17
+ you explicitly approve.
18
+
19
+ > ⚠️ **Authorised testing only.** Use HuntKit against assets you own or that are
20
+ > explicitly in scope for a bug-bounty program or signed engagement. It enforces
21
+ > a per-program scope list and refuses recon on hosts you haven't declared in
22
+ > scope. You are responsible for staying within the rules.
23
+
24
+ ---
25
+
26
+ ## Demo
27
+
28
+ ![HuntKit — an end-to-end recon run](docs/demo.svg)
29
+
30
+ A full pass — scope guard, recon, scan, analyze, report, then continuous
31
+ `monitor` and the live `dashboard` — against Acunetix's public, intentionally
32
+ vulnerable test site. The step-by-step walkthrough with real output is in
33
+ [DEMO.md](DEMO.md).
34
+
35
+ ---
36
+
37
+ ## Highlights
38
+
39
+ - **Parallel, resumable recon pipeline** — `subdomains → resolve → live → ports → urls`,
40
+ running every available tool in each wave concurrently, deduped on disk, with
41
+ stage resume and an opt-in content-addressed cache.
42
+ - **Pluggable toolchain** — each external tool is one file in `huntkit/plugins/`.
43
+ Adding a tool is dropping a file; the pipeline wires it in by capability.
44
+ - **Active scanning** — `scan` drives the vuln/fuzz plugins (nuclei, dalfox, …)
45
+ over the URLs recon gathered, **re-checked against scope**, writing findings
46
+ to the workspace's `scans/` dir — where `analyze` folds them into host scoring.
47
+ - **Intelligence engine** — turns recon output **and scan findings** into scored,
48
+ prioritised hosts and **attack paths** (which bug class to run, and where), from
49
+ a declarative signal catalog. Pure and offline — it never touches the target.
50
+ - **Knowledge base** — full playbooks for 9 bug classes (detection, payloads,
51
+ bypasses, tools, references), cross-linked from the attack paths.
52
+ - **Reporting** — one model rendered to Markdown, a self-contained HTML page, or
53
+ JSON (PDF when `weasyprint` is present, else print-ready HTML).
54
+ - **AI advisor (optional)** — hand the scored surface to a local Ollama model, or
55
+ a cloud model (Claude/OpenAI) **only after an explicit approval prompt that
56
+ shows exactly what will be sent**.
57
+ - **Content scanners** — a redacting secret & JS-endpoint scanner, and a
58
+ header-based CDN/WAF/cloud/tech fingerprinter.
59
+ - **Asset-correlation enrichment** — `enrich` hashes each origin's favicon
60
+ (the Shodan `http.favicon.hash:` pivot) and maps every host to its ASN /
61
+ BGP prefix, turning one asset into the rest of the estate to sweep.
62
+ - **Screenshot gallery** — `shots` drives `gowitness` over the live URLs and
63
+ the report embeds the captures as a grid (inlined, so the HTML stays one
64
+ self-contained file) — eyeball a big surface at a glance.
65
+ - **Diff across runs** — `diff` snapshots a program's result set and shows the
66
+ delta on the next sweep: new subdomains, freshly-live URLs, and above all
67
+ **new findings** — the thing you actually re-run a program to catch.
68
+ - **Live dashboard** — `dashboard` paints the whole engagement on one screen
69
+ (priority, recon surface, top hosts, attack paths, notable exposures,
70
+ enrichment) and `--watch` redraws it live. Built on Rich — no extra deps.
71
+ - **Continuous monitoring** — `monitor` re-sweeps a program, diffs the result
72
+ set against the last snapshot, and pings a Slack/Discord webhook the moment a
73
+ **new finding** turns up. `--interval N` loops every N minutes — a program
74
+ watches itself while you sleep.
75
+
76
+ ---
77
+
78
+ ## Install
79
+
80
+ Requires **Python 3.10+**. Runtime deps are light: `typer`, `rich`, `pyyaml`.
81
+
82
+ ```bash
83
+ pip install huntkit # or: pipx install huntkit
84
+ huntkit doctor
85
+ ```
86
+
87
+ Or from source:
88
+
89
+ ```bash
90
+ git clone https://github.com/Raresney/HuntKit.git
91
+ cd HuntKit
92
+ pip install -e . # or: pipx install .
93
+
94
+ # run it:
95
+ python -m huntkit doctor
96
+ ```
97
+
98
+ The external tools are the usual bug-bounty stack. `doctor` shows what you have;
99
+ anything missing is reported with its install hint and that stage is simply
100
+ skipped, so HuntKit is useful even on a fresh box.
101
+
102
+ On a Debian-family box (Kali / Ubuntu), the whole toolchain plus HuntKit itself
103
+ installs in one shot:
104
+
105
+ ```bash
106
+ bash scripts/install-tools.sh # apt + go install + arjun, then huntkit in a venv
107
+ ```
108
+
109
+ The tools are Linux-native — a Kali VM (or WSL) is the intended runtime.
110
+
111
+ ### Docker — the whole toolchain, baked
112
+
113
+ No Linux box to set up? The image carries HuntKit **and** every external tool,
114
+ so it runs anywhere Docker does:
115
+
116
+ ```bash
117
+ docker build -t huntkit .
118
+ docker run --rm huntkit doctor
119
+
120
+ # a real run — mount a dir to keep workspaces, add caps for naabu's SYN scan
121
+ docker run --rm -v "$PWD/hk-data:/data" \
122
+ --cap-add=NET_ADMIN --cap-add=NET_RAW \
123
+ huntkit recon acme.com -p acme
124
+ ```
125
+
126
+ Engagement data lives in the `/data` volume (`HUNTKIT_HOME`); mount a host
127
+ directory to keep it between runs. The image never bakes in a workspace.
128
+
129
+ ---
130
+
131
+ ## Quick start
132
+
133
+ ```bash
134
+ # 1. create a workspace + declare scope
135
+ python -m huntkit init acme -s "*.acme.com" -x blog.acme.com
136
+
137
+ # 2. run the recon pipeline
138
+ python -m huntkit recon acme.com -p acme
139
+
140
+ # 3. actively scan the gathered URLs (nuclei, dalfox, …)
141
+ python -m huntkit scan -p acme
142
+
143
+ # 4. enrich: favicon hashes (Shodan pivot) + ASN/BGP origins
144
+ python -m huntkit enrich -p acme
145
+
146
+ # 5. screenshot every live URL (feeds the report gallery)
147
+ python -m huntkit shots -p acme
148
+
149
+ # 6. score the surface into prioritised hosts + attack paths
150
+ python -m huntkit analyze -p acme
151
+
152
+ # 7. pull a full playbook for a bug class the analysis points at
153
+ python -m huntkit playbook ssrf
154
+
155
+ # 8. write a shareable report (embeds the screenshot gallery)
156
+ python -m huntkit report -p acme -f html
157
+
158
+ # 9. (optional) ask a local LLM to prioritise it
159
+ python -m huntkit advise -p acme --provider ollama
160
+
161
+ # 10. (optional) re-sweep on a schedule, ping me when a new finding lands
162
+ python -m huntkit monitor acme.com -p acme \
163
+ --webhook "$SLACK_WEBHOOK" --interval 360
164
+ ```
165
+
166
+ With a single workspace, `-p` is inferred.
167
+
168
+ ---
169
+
170
+ ## Commands
171
+
172
+ | Command | What it does |
173
+ | --- | --- |
174
+ | `doctor` | Show which external tools are installed / missing, and where data lives. |
175
+ | `init <program> -s <scope>` | Create a workspace and set in/out scope (`*.wildcards` ok). |
176
+ | `recon <domain> [--stage] [--threads] [--fresh] [--no-cache]` | Parallel, resumable recon pipeline. |
177
+ | `scan -p <program> [--tool] [--threads] [--no-cache]` | Run the vuln/fuzz scanners (nuclei, dalfox) over the gathered in-scope URLs. |
178
+ | `enrich -p <program> [--favicon/--no-favicon] [--asn/--no-asn]` | Favicon hashes (Shodan pivot) + ASN/BGP origin per host. |
179
+ | `shots -p <program>` | Screenshot every live in-scope URL (gowitness) for the report gallery. |
180
+ | `analyze -p <program>` | Score hosts Low→Critical and roll signals into attack paths. |
181
+ | `playbook [<id>] [--md]` | List the bug-class knowledge base, or render one playbook. |
182
+ | `report -p <program> [-f md\|html\|json\|pdf]` | Write an engagement report. |
183
+ | `diff -p <program> [--save] [--against <id>] [--list]` | Snapshot the result set and show what changed since a baseline. |
184
+ | `dashboard -p <program> [--watch <secs>]` | One-screen engagement overview; `--watch` redraws it live. |
185
+ | `monitor <domain> -p <program> [--webhook <url>] [--notify-on findings\|changes] [--interval <min>]` | Re-sweep, diff vs. last snapshot, and webhook-notify on new findings. |
186
+ | `advise -p <program> [--provider] [--yes]` | LLM action plan (local, or cloud with approval). |
187
+ | `secrets <paths…> [--endpoints] [--out]` | Scan gathered text for leaked secrets + JS endpoints (redacted). |
188
+ | `fingerprint <file\|-> [--out]` | Identify CDN / WAF / cloud / tech from response headers. |
189
+ | `config` · `plugins` · `workspace` | Manage config, inspect the tool registry, list workspaces. |
190
+ | `clean -p <program>` | Reset stage state and/or clear the tool cache. |
191
+
192
+ Bug classes: `idor`, `bac`, `xss`, `ssrf`, `sqli`, `ssti`, `subtakeover`,
193
+ `authn`, `cors`.
194
+
195
+ ---
196
+
197
+ ## How it fits together
198
+
199
+ ```
200
+ recon ──▶ scan ──▶ intel.analyze ──▶ report ──▶ advise
201
+ (tools) (nuclei/ (scores recon + (md/html/json) (LLM, gated)
202
+ dalfox) scan findings → │
203
+ attack paths) │
204
+ └──────▶ knowledge playbooks (huntkit playbook <id>)
205
+
206
+ enrich — favicon hashes + ASN/BGP origins over the recon surface (pivot outward)
207
+ shots — gowitness screenshots of the live URLs, embedded in the HTML report
208
+ secrets / fingerprint — standalone scanners over content you've gathered
209
+ diff — snapshot the result set and show the delta on the next sweep
210
+ monitor — re-sweep on a schedule; diff vs. last snapshot; webhook on new findings
211
+ ```
212
+
213
+ The recon layer is a thin orchestrator over **plugins**; the analysis,
214
+ knowledge, reporting, AI and scanner layers are pure feature packages that build
215
+ on a small `core` (config, workspace, state, runner) and `utils`.
216
+
217
+ ---
218
+
219
+ ## Security model
220
+
221
+ - **Scope guard** — recon refuses any host not matched by the program's in-scope
222
+ list (and honours out-of-scope patterns).
223
+ - **Safe subprocess** — tools are run argv-only, never through a shell.
224
+ - **Politeness, one knob** — `http.rate_limit` (requests/sec), `http.delay`
225
+ (seconds between requests) and `general.rate` (port-scan packets/sec) are a
226
+ single policy that HuntKit maps onto every rate-aware tool's native flags
227
+ (subfinder, dnsx, httpx, naabu, katana, nuclei, ffuf, dalfox). Dial a program
228
+ down to a gentle crawl in one place — real programs ban noisy scanners.
229
+ - **Redaction** — the secret scanner masks every match, so its tables and JSON
230
+ locate a leak without re-leaking it.
231
+ - **Cloud-AI approval gate** — a local provider (Ollama) stays offline. A cloud
232
+ provider is sent nothing unless you confirm, after being shown the exact text
233
+ and the destination host — and that check is enforced in the advisor layer,
234
+ not just the CLI.
235
+ - **Webhook egress is opt-in** — `monitor` only POSTs to a webhook you pass
236
+ explicitly (`--webhook`), scheme-guarded to http(s). Sending a diff to
237
+ Slack/Discord is egress of engagement data to a third party, so it never
238
+ happens by default and the CLI names the destination host before it sends.
239
+ - **Enrichment egress is named** — `enrich` fetches favicons from in-scope
240
+ targets (scheme-guarded to http/https), and its ASN lookup sends a resolved
241
+ in-scope IP to Team Cymru's public WHOIS — the one call to a non-target host,
242
+ called out in the CLI before it runs.
243
+ - **Engagement data is gitignored** — never commit a workspace.
244
+
245
+ ---
246
+
247
+ ## Extending — add a row, not a branch
248
+
249
+ The framework is built around declarative catalogs:
250
+
251
+ | To add… | Drop a row in… |
252
+ | --- | --- |
253
+ | an external tool | a one-file plugin in `huntkit/plugins/` |
254
+ | a scoring heuristic | `PORT_RULES` / `PATH_RULES` / … in `huntkit/intel/signals.py` |
255
+ | a bug-class playbook | `PLAYBOOKS` in `huntkit/knowledge/playbooks.py` |
256
+ | a secret pattern | `SECRET_PATTERNS` in `huntkit/secrets/patterns.py` |
257
+ | a CDN/WAF/tech fingerprint | `FINGERPRINT_RULES` in `huntkit/fingerprint/rules.py` |
258
+
259
+ ---
260
+
261
+ ## Workspace layout
262
+
263
+ ```
264
+ ~/.huntkit/<program>/
265
+ ├── scope/ in/out scope lists
266
+ ├── recon/ subdomains.txt, resolved.txt, live.txt, ports.txt
267
+ ├── urls/ urls.txt
268
+ ├── scans/ intel.json, findings.json, enrich.json, screenshots.json …
269
+ ├── notes/ your own notes
270
+ ├── history/ timestamped result snapshots (for `diff`)
271
+ ├── reports/ generated md / html / json (+ shots/ screenshots)
272
+ └── state.json stage tracking + counts
273
+ ```
274
+
275
+ Override the base dir with `-w <dir>` or `$HUNTKIT_HOME`.
276
+
277
+ ---
278
+
279
+ ## Development
280
+
281
+ ```bash
282
+ pip install -e ".[dev]"
283
+ ruff check huntkit tests # lint
284
+ ruff format huntkit tests # format (CI checks with --check)
285
+ mypy huntkit # type-check
286
+ pytest --cov=huntkit # tests (92% coverage, gate at 90%)
287
+ ```
288
+
289
+ CI runs lint, format-check, type-check and tests on Python 3.10–3.13.
290
+
291
+ ---
292
+
293
+ ## Acknowledgements
294
+
295
+ HuntKit's AI advisor (`feat(ai): multi-provider advisor with cloud-approval gate`)
296
+ was selected for the [XERJ Corpus Hub](https://hub.xerj.org) as a reference
297
+ implementation, under this repository's MIT license with attribution.
298
+
299
+ ---
300
+
301
+ ## Changelog
302
+
303
+ See [CHANGELOG.md](CHANGELOG.md). Current release: **v0.3.0**.
304
+
305
+ ---
306
+
307
+ ## License
308
+
309
+ MIT — see [LICENSE](LICENSE).
@@ -0,0 +1,4 @@
1
+ """HuntKit - a local bug bounty recon & methodology copilot."""
2
+
3
+ __version__ = "0.3.0"
4
+ __all__ = ["__version__"]
@@ -0,0 +1,8 @@
1
+ """Enable ``python -m huntkit`` to launch the Typer interface."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from .app import run
6
+
7
+ if __name__ == "__main__":
8
+ run()