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.
- huntkit-0.3.0/LICENSE +21 -0
- huntkit-0.3.0/PKG-INFO +340 -0
- huntkit-0.3.0/README.md +309 -0
- huntkit-0.3.0/huntkit/__init__.py +4 -0
- huntkit-0.3.0/huntkit/__main__.py +8 -0
- huntkit-0.3.0/huntkit/ai/__init__.py +42 -0
- huntkit-0.3.0/huntkit/ai/advisor.py +133 -0
- huntkit-0.3.0/huntkit/ai/providers.py +200 -0
- huntkit-0.3.0/huntkit/app/__init__.py +13 -0
- huntkit-0.3.0/huntkit/app/config_cmd.py +65 -0
- huntkit-0.3.0/huntkit/app/context.py +50 -0
- huntkit-0.3.0/huntkit/app/main.py +1166 -0
- huntkit-0.3.0/huntkit/app/plugins_cmd.py +79 -0
- huntkit-0.3.0/huntkit/app/workspace_cmd.py +62 -0
- huntkit-0.3.0/huntkit/core/__init__.py +6 -0
- huntkit-0.3.0/huntkit/core/cache.py +67 -0
- huntkit-0.3.0/huntkit/core/config.py +272 -0
- huntkit-0.3.0/huntkit/core/logger.py +66 -0
- huntkit-0.3.0/huntkit/core/pacing.py +71 -0
- huntkit-0.3.0/huntkit/core/runner.py +117 -0
- huntkit-0.3.0/huntkit/core/state.py +154 -0
- huntkit-0.3.0/huntkit/core/workspace.py +145 -0
- huntkit-0.3.0/huntkit/enrich/__init__.py +39 -0
- huntkit-0.3.0/huntkit/enrich/asn.py +139 -0
- huntkit-0.3.0/huntkit/enrich/engine.py +167 -0
- huntkit-0.3.0/huntkit/enrich/favicon.py +91 -0
- huntkit-0.3.0/huntkit/enrich/mmh3.py +69 -0
- huntkit-0.3.0/huntkit/fingerprint/__init__.py +26 -0
- huntkit-0.3.0/huntkit/fingerprint/engine.py +83 -0
- huntkit-0.3.0/huntkit/fingerprint/rules.py +170 -0
- huntkit-0.3.0/huntkit/history/__init__.py +38 -0
- huntkit-0.3.0/huntkit/history/diff.py +95 -0
- huntkit-0.3.0/huntkit/history/store.py +133 -0
- huntkit-0.3.0/huntkit/intel/__init__.py +48 -0
- huntkit-0.3.0/huntkit/intel/engine.py +233 -0
- huntkit-0.3.0/huntkit/intel/signals.py +826 -0
- huntkit-0.3.0/huntkit/knowledge/__init__.py +27 -0
- huntkit-0.3.0/huntkit/knowledge/playbooks.py +452 -0
- huntkit-0.3.0/huntkit/monitor/__init__.py +24 -0
- huntkit-0.3.0/huntkit/monitor/runner.py +111 -0
- huntkit-0.3.0/huntkit/notify/__init__.py +16 -0
- huntkit-0.3.0/huntkit/notify/webhook.py +73 -0
- huntkit-0.3.0/huntkit/pipeline.py +302 -0
- huntkit-0.3.0/huntkit/plugins/__init__.py +36 -0
- huntkit-0.3.0/huntkit/plugins/amass.py +25 -0
- huntkit-0.3.0/huntkit/plugins/arjun.py +18 -0
- huntkit-0.3.0/huntkit/plugins/assetfinder.py +18 -0
- huntkit-0.3.0/huntkit/plugins/base.py +220 -0
- huntkit-0.3.0/huntkit/plugins/chaos.py +20 -0
- huntkit-0.3.0/huntkit/plugins/dalfox.py +24 -0
- huntkit-0.3.0/huntkit/plugins/dnsx.py +19 -0
- huntkit-0.3.0/huntkit/plugins/ffuf.py +34 -0
- huntkit-0.3.0/huntkit/plugins/findomain.py +18 -0
- huntkit-0.3.0/huntkit/plugins/gau.py +18 -0
- huntkit-0.3.0/huntkit/plugins/hakrawler.py +19 -0
- huntkit-0.3.0/huntkit/plugins/httpx.py +30 -0
- huntkit-0.3.0/huntkit/plugins/katana.py +23 -0
- huntkit-0.3.0/huntkit/plugins/naabu.py +22 -0
- huntkit-0.3.0/huntkit/plugins/nmap.py +39 -0
- huntkit-0.3.0/huntkit/plugins/nuclei.py +27 -0
- huntkit-0.3.0/huntkit/plugins/registry.py +117 -0
- huntkit-0.3.0/huntkit/plugins/subfinder.py +21 -0
- huntkit-0.3.0/huntkit/plugins/waybackurls.py +29 -0
- huntkit-0.3.0/huntkit/plugins/whatweb.py +19 -0
- huntkit-0.3.0/huntkit/py.typed +0 -0
- huntkit-0.3.0/huntkit/report/__init__.py +103 -0
- huntkit-0.3.0/huntkit/report/builder.py +145 -0
- huntkit-0.3.0/huntkit/report/render.py +323 -0
- huntkit-0.3.0/huntkit/scanner/__init__.py +28 -0
- huntkit-0.3.0/huntkit/scanner/runner.py +239 -0
- huntkit-0.3.0/huntkit/secrets/__init__.py +34 -0
- huntkit-0.3.0/huntkit/secrets/patterns.py +172 -0
- huntkit-0.3.0/huntkit/secrets/scanner.py +133 -0
- huntkit-0.3.0/huntkit/shots/__init__.py +29 -0
- huntkit-0.3.0/huntkit/shots/runner.py +186 -0
- huntkit-0.3.0/huntkit/tui/__init__.py +13 -0
- huntkit-0.3.0/huntkit/tui/dashboard.py +160 -0
- huntkit-0.3.0/huntkit/utils/__init__.py +6 -0
- huntkit-0.3.0/huntkit/utils/filesystem.py +109 -0
- huntkit-0.3.0/huntkit/utils/process.py +104 -0
- huntkit-0.3.0/huntkit/utils/severity.py +49 -0
- huntkit-0.3.0/huntkit/utils/terminal.py +88 -0
- huntkit-0.3.0/huntkit/utils/validators.py +99 -0
- huntkit-0.3.0/huntkit.egg-info/PKG-INFO +340 -0
- huntkit-0.3.0/huntkit.egg-info/SOURCES.txt +115 -0
- huntkit-0.3.0/huntkit.egg-info/dependency_links.txt +1 -0
- huntkit-0.3.0/huntkit.egg-info/entry_points.txt +2 -0
- huntkit-0.3.0/huntkit.egg-info/requires.txt +14 -0
- huntkit-0.3.0/huntkit.egg-info/top_level.txt +1 -0
- huntkit-0.3.0/pyproject.toml +84 -0
- huntkit-0.3.0/setup.cfg +4 -0
- huntkit-0.3.0/tests/test_ai.py +250 -0
- huntkit-0.3.0/tests/test_cache_state.py +84 -0
- huntkit-0.3.0/tests/test_cli.py +131 -0
- huntkit-0.3.0/tests/test_config.py +56 -0
- huntkit-0.3.0/tests/test_demo.py +43 -0
- huntkit-0.3.0/tests/test_docker.py +66 -0
- huntkit-0.3.0/tests/test_enrich.py +248 -0
- huntkit-0.3.0/tests/test_filesystem.py +51 -0
- huntkit-0.3.0/tests/test_fingerprint.py +115 -0
- huntkit-0.3.0/tests/test_history.py +180 -0
- huntkit-0.3.0/tests/test_intel.py +330 -0
- huntkit-0.3.0/tests/test_knowledge.py +154 -0
- huntkit-0.3.0/tests/test_monitor.py +233 -0
- huntkit-0.3.0/tests/test_notify.py +97 -0
- huntkit-0.3.0/tests/test_pacing.py +67 -0
- huntkit-0.3.0/tests/test_pipeline.py +226 -0
- huntkit-0.3.0/tests/test_plugins.py +274 -0
- huntkit-0.3.0/tests/test_process_runner.py +69 -0
- huntkit-0.3.0/tests/test_release.py +62 -0
- huntkit-0.3.0/tests/test_report.py +203 -0
- huntkit-0.3.0/tests/test_scan.py +197 -0
- huntkit-0.3.0/tests/test_secrets.py +141 -0
- huntkit-0.3.0/tests/test_shots.py +187 -0
- huntkit-0.3.0/tests/test_tui.py +115 -0
- huntkit-0.3.0/tests/test_validators.py +74 -0
- 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
|
+
[](https://github.com/Raresney/HuntKit/actions/workflows/ci.yml)
|
|
35
|
+

|
|
36
|
+

|
|
37
|
+

|
|
38
|
+
[](https://pypi.org/project/huntkit/)
|
|
39
|
+

|
|
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
|
+

|
|
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).
|
huntkit-0.3.0/README.md
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
# HuntKit
|
|
2
|
+
|
|
3
|
+
[](https://github.com/Raresney/HuntKit/actions/workflows/ci.yml)
|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
[](https://pypi.org/project/huntkit/)
|
|
8
|
+

|
|
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
|
+

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