summit-scanner 0.6.7__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.
- summit_scanner-0.6.7/LICENSE +21 -0
- summit_scanner-0.6.7/PKG-INFO +332 -0
- summit_scanner-0.6.7/README.md +318 -0
- summit_scanner-0.6.7/pyproject.toml +30 -0
- summit_scanner-0.6.7/setup.cfg +4 -0
- summit_scanner-0.6.7/summit/__init__.py +3 -0
- summit_scanner-0.6.7/summit/authorize.py +137 -0
- summit_scanner-0.6.7/summit/captcha.py +55 -0
- summit_scanner-0.6.7/summit/cli.py +366 -0
- summit_scanner-0.6.7/summit/crawl/__init__.py +0 -0
- summit_scanner-0.6.7/summit/crawl/js_endpoints.py +57 -0
- summit_scanner-0.6.7/summit/crawl/spider.py +154 -0
- summit_scanner-0.6.7/summit/cve.py +120 -0
- summit_scanner-0.6.7/summit/fuzz/__init__.py +0 -0
- summit_scanner-0.6.7/summit/fuzz/dirbuster.py +87 -0
- summit_scanner-0.6.7/summit/graphql.py +62 -0
- summit_scanner-0.6.7/summit/http/__init__.py +0 -0
- summit_scanner-0.6.7/summit/http/client.py +97 -0
- summit_scanner-0.6.7/summit/http/models.py +91 -0
- summit_scanner-0.6.7/summit/openapi.py +103 -0
- summit_scanner-0.6.7/summit/paramminer.py +99 -0
- summit_scanner-0.6.7/summit/proxy/__init__.py +0 -0
- summit_scanner-0.6.7/summit/proxy/server.py +168 -0
- summit_scanner-0.6.7/summit/ratelimit.py +40 -0
- summit_scanner-0.6.7/summit/recon.py +143 -0
- summit_scanner-0.6.7/summit/report/__init__.py +0 -0
- summit_scanner-0.6.7/summit/report/writer.py +124 -0
- summit_scanner-0.6.7/summit/scan/__init__.py +0 -0
- summit_scanner-0.6.7/summit/scan/core.py +125 -0
- summit_scanner-0.6.7/summit/scan/engine.py +159 -0
- summit_scanner-0.6.7/summit/scan/linkcheck.py +224 -0
- summit_scanner-0.6.7/summit/scan/modules/__init__.py +28 -0
- summit_scanner-0.6.7/summit/scan/modules/cacheable.py +52 -0
- summit_scanner-0.6.7/summit/scan/modules/cors_reflect.py +46 -0
- summit_scanner-0.6.7/summit/scan/modules/crlf.py +44 -0
- summit_scanner-0.6.7/summit/scan/modules/csrf.py +47 -0
- summit_scanner-0.6.7/summit/scan/modules/directory_listing.py +49 -0
- summit_scanner-0.6.7/summit/scan/modules/enumeration.py +55 -0
- summit_scanner-0.6.7/summit/scan/modules/headers_grade.py +58 -0
- summit_scanner-0.6.7/summit/scan/modules/host_header.py +51 -0
- summit_scanner-0.6.7/summit/scan/modules/open_redirect.py +66 -0
- summit_scanner-0.6.7/summit/scan/modules/os_command.py +84 -0
- summit_scanner-0.6.7/summit/scan/modules/path_traversal.py +45 -0
- summit_scanner-0.6.7/summit/scan/modules/sensitive_files.py +59 -0
- summit_scanner-0.6.7/summit/scan/modules/sqli.py +81 -0
- summit_scanner-0.6.7/summit/scan/modules/sqli_time.py +84 -0
- summit_scanner-0.6.7/summit/scan/modules/ssti.py +57 -0
- summit_scanner-0.6.7/summit/scan/modules/waf_bypass.py +64 -0
- summit_scanner-0.6.7/summit/scan/modules/xss.py +76 -0
- summit_scanner-0.6.7/summit/scan/passive.py +273 -0
- summit_scanner-0.6.7/summit/smart.py +45 -0
- summit_scanner-0.6.7/summit/takeover.py +65 -0
- summit_scanner-0.6.7/summit/tls.py +144 -0
- summit_scanner-0.6.7/summit/toolkit.py +71 -0
- summit_scanner-0.6.7/summit/updates.py +155 -0
- summit_scanner-0.6.7/summit/waf.py +54 -0
- summit_scanner-0.6.7/summit_scanner.egg-info/PKG-INFO +332 -0
- summit_scanner-0.6.7/summit_scanner.egg-info/SOURCES.txt +72 -0
- summit_scanner-0.6.7/summit_scanner.egg-info/dependency_links.txt +1 -0
- summit_scanner-0.6.7/summit_scanner.egg-info/entry_points.txt +2 -0
- summit_scanner-0.6.7/summit_scanner.egg-info/requires.txt +3 -0
- summit_scanner-0.6.7/summit_scanner.egg-info/top_level.txt +1 -0
- summit_scanner-0.6.7/tests/test_fp_guards.py +139 -0
- summit_scanner-0.6.7/tests/test_linkcheck.py +63 -0
- summit_scanner-0.6.7/tests/test_models.py +43 -0
- summit_scanner-0.6.7/tests/test_new_checks.py +128 -0
- summit_scanner-0.6.7/tests/test_passive.py +57 -0
- summit_scanner-0.6.7/tests/test_retries.py +66 -0
- summit_scanner-0.6.7/tests/test_severity.py +22 -0
- summit_scanner-0.6.7/tests/test_tls.py +46 -0
- summit_scanner-0.6.7/tests/test_v05.py +100 -0
- summit_scanner-0.6.7/tests/test_v06.py +168 -0
- summit_scanner-0.6.7/tests/test_v068.py +142 -0
- summit_scanner-0.6.7/tests/test_waf.py +145 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pennacle Security
|
|
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.
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: summit-scanner
|
|
3
|
+
Version: 0.6.7
|
|
4
|
+
Summary: Summit - open-source web security testing platform (proxy, scanner, fuzzer) by Pennacle Security
|
|
5
|
+
Author: Pennacle Security
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: requests>=2.31
|
|
11
|
+
Requires-Dist: pyyaml>=6.0
|
|
12
|
+
Requires-Dist: packaging>=23.0
|
|
13
|
+
Dynamic: license-file
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<img src="docs/assets/banner.png" alt="summit" width="760">
|
|
17
|
+
</p>
|
|
18
|
+
|
|
19
|
+
<p align="center">
|
|
20
|
+
<a href="https://github.com/pennacle-security/summit/actions/workflows/tests.yml"><img src="https://github.com/pennacle-security/summit/actions/workflows/tests.yml/badge.svg" alt="CI status"></a>
|
|
21
|
+
<a href="https://github.com/pennacle-security/summit/releases"><img src="https://img.shields.io/github/v/tag/pennacle-security/summit?label=release&color=2ea44f" alt="release"></a>
|
|
22
|
+
<a href="https://www.bestpractices.dev/projects/15532"><img src="https://www.bestpractices.dev/projects/15532/badge" alt="CII Best Practices"></a>
|
|
23
|
+
<a href="https://api.scorecard.dev/projects/github.com/pennacle-security/summit/badge"><img src="https://api.scorecard.dev/projects/github.com/pennacle-security/summit/badge" alt="OpenSSF Scorecard"></a>
|
|
24
|
+
<a href="https://pennacle-security.github.io/summit/"><img src="https://img.shields.io/badge/docs-live-2ea44f" alt="docs"></a>
|
|
25
|
+
<img src="https://img.shields.io/badge/python-3.10%2B-3776ab" alt="python 3.10+">
|
|
26
|
+
<img src="https://img.shields.io/github/license/pennacle-security/summit?color=8b949e" alt="MIT license">
|
|
27
|
+
<img src="https://img.shields.io/badge/dependencies-requests%20only-8b949e" alt="one dependency">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
<p align="center">One scriptable CLI for web security testing: scanner, proxy, fuzzer, authorization testing, WAF analysis, link-hijack detection and recon.<br>Free where the equivalents are paid - by <a href="https://github.com/pennacle-security">Pennacle Security</a>.</p>
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
We use Burp and ZAP every day. We also kept wanting three things they are not: a scanner we can script against in CI, findings that tell us how sure they are, and a codebase small enough to read in one sitting. Summit is that tool - v0.5, MIT, one dependency (`requests`), built in the open.
|
|
35
|
+
|
|
36
|
+
**Full documentation:** [pennacle-security.github.io/summit](https://pennacle-security.github.io/summit/)
|
|
37
|
+
|
|
38
|
+
## Contents
|
|
39
|
+
|
|
40
|
+
1. [At a glance](#at-a-glance)
|
|
41
|
+
2. [Quick start](#quick-start)
|
|
42
|
+
3. [Proof, not promises](#proof-not-promises)
|
|
43
|
+
4. [Commands](#commands)
|
|
44
|
+
5. [Feature notes](#feature-notes)
|
|
45
|
+
6. [Anti false positives and false negatives](#anti-false-positives-and-false-negatives)
|
|
46
|
+
7. [Check catalog](#check-catalog)
|
|
47
|
+
8. [How summit compares](#how-summit-compares)
|
|
48
|
+
9. [Roadmap](#roadmap)
|
|
49
|
+
10. [Community and contributors](#community-and-contributors)
|
|
50
|
+
11. [Contributing and security](#contributing-and-security)
|
|
51
|
+
12. [Legal and license](#legal-and-license)
|
|
52
|
+
|
|
53
|
+
## At a glance
|
|
54
|
+
|
|
55
|
+
Capabilities that usually sit behind paid tooling, plus the scanning core:
|
|
56
|
+
|
|
57
|
+
| Capability | Summit | The usual route |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| Broken access control testing (BOLA/IDOR) | `summit authorize` | Autorize-style add-on / paid workflows |
|
|
60
|
+
| Hidden parameter discovery | `summit mine` | Param Miner-style add-on |
|
|
61
|
+
| OpenAPI-driven scanning | `summit scan --openapi` | add-ons |
|
|
62
|
+
| WAF fingerprinting + bypass probing | built in | partial / add-ons |
|
|
63
|
+
| Broken-link hijack detection | built in | paid extension |
|
|
64
|
+
| SQLi, XSS, redirect, traversal, takeover, host header, CORS | built in | core scanners (free) |
|
|
65
|
+
| Recon chain: subfinder -> httpx -> nmap | `summit recon` | manual gluing |
|
|
66
|
+
| Rate limiting, retries, JWT/encoder toolkit | built in | add-ons / paid |
|
|
67
|
+
| CI-ready, confidence-labelled findings | the whole point | paid automation |
|
|
68
|
+
|
|
69
|
+
Every finding carries a confidence label: `confirmed` (an observed fact) or `potential` (a heuristic). That distinction runs through the entire tool.
|
|
70
|
+
|
|
71
|
+
## Quick start
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
git clone https://github.com/pennacle-security/summit.git
|
|
75
|
+
cd summit
|
|
76
|
+
pip install -e .
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Python 3.10+. Then watch it work against a deliberately vulnerable local target:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
python examples/vuln_app.py # terminal 1 - the target (127.0.0.1 only)
|
|
83
|
+
summit scan http://127.0.0.1:8765 # terminal 2 - the scan
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
A fuller pass on a real engagement looks like this:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
summit recon target.com --json recon.json # subdomains -> hosts -> ports
|
|
90
|
+
summit scan https://target.com --depth 2 --rate 10 # crawl + all checks
|
|
91
|
+
summit scan --openapi api-spec.json # API: scan what the spec admits to
|
|
92
|
+
summit authorize https://target.com/admin?user=1 \
|
|
93
|
+
--role 'admin=Cookie: session=abc' \
|
|
94
|
+
--role 'user=Cookie: session=xyz' # BOLA/IDOR testing
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Proof, not promises
|
|
98
|
+
|
|
99
|
+
Every claim on this page is reproduced by [`examples/evidence.py`](examples/evidence.py) - it runs the demo target live, measures each feature, and prints PASS/FAIL with the real numbers. CI executes it on every push; a claim that stops holding fails the build.
|
|
100
|
+
|
|
101
|
+
<details>
|
|
102
|
+
<summary>Latest measured run (<code>python examples/evidence.py</code>)</summary>
|
|
103
|
+
|
|
104
|
+
```text
|
|
105
|
+
[PASS] full scan: 16 seeded check families detected, zero false positives
|
|
106
|
+
53 findings in 22.9s (344 requests), missing=none, control link flagged=no, 19 finding(s) carry confidence=confirmed
|
|
107
|
+
[PASS] resource takeover fingerprint detected on the target's own 404
|
|
108
|
+
Possible AWS S3 resource takeover | AWS S3: 'nosuchbucket'
|
|
109
|
+
[PASS] host header injection: marker domain echoed back by the app
|
|
110
|
+
Host: summit-host-probe.example -> reflected (reset-link poisoning surface)
|
|
111
|
+
[PASS] CORS reflects an arbitrary origin with credentials allowed
|
|
112
|
+
ACAO: https://summit-cors-probe.example; ACAC: true
|
|
113
|
+
[PASS] WAF bypass: naive filter blocks, tampered payload lands decoded
|
|
114
|
+
raw payload -> HTTP 403 (blocked); URL-encoded once -> HTTP 200, payload reflected decoded: True
|
|
115
|
+
[PASS] CAPTCHA challenge detected (reported, not solved)
|
|
116
|
+
/login -> reCAPTCHA via marker 'recaptcha/api.js'
|
|
117
|
+
[PASS] rate limiting: --rate 5 paces 12 requests to ~2.2s; unlimited runs free
|
|
118
|
+
12 requests at rate 5 -> 2.20s (theoretical floor: 2.2s); 12 requests unlimited -> 0.02s
|
|
119
|
+
[PASS] concurrency on a latency-bearing target: 8 workers vs serial
|
|
120
|
+
40 requests x 25ms latency: serial 1.33s -> parallel 0.18s (7.3x speedup)
|
|
121
|
+
[PASS] smart prioritizer ranks known-injectable parameters first
|
|
122
|
+
probing starts with: [('query', 'search?query=laptop'), ('id', 'user?id=1'), ('url', 'example.com')]
|
|
123
|
+
[PASS] toolkit decodes JWT header/payload and states the signature is unverified
|
|
124
|
+
signature NOT verified - decoding only
|
|
125
|
+
[PASS] update check compares versions numerically (0.3 < 0.10)
|
|
126
|
+
is_outdated('0.3.0', '0.10.0') -> True; is_outdated('1.0.0', '0.9.9') -> False
|
|
127
|
+
[PASS] broken access control: admin panel served identically to a low-privilege role
|
|
128
|
+
verdict=broken; finding=Broken access control (BOLA/IDOR candidate)
|
|
129
|
+
[PASS] hidden parameter mining finds the undocumented debug parameter, zero noise
|
|
130
|
+
1 finding(s): ['debug'] (all confirmed reflections)
|
|
131
|
+
[PASS] openapi-driven scan: spec alone leads the engine to seeded SQLi and XSS
|
|
132
|
+
2 spec target(s) scanned -> 10 findings, sqli-error=yes, xss-reflection=yes
|
|
133
|
+
[PASS] OS command injection: marker executed and echoed by the server
|
|
134
|
+
semicolon: exec marker x2, control marker x1 | CWE-78
|
|
135
|
+
[PASS] server-side template injection: {{7*7}} came back as 49
|
|
136
|
+
Jinja2/Twig: {{7*7}} -> 49 | CWE-1336
|
|
137
|
+
[PASS] CRLF injection: X-Summit-CRLF header materialized in the response
|
|
138
|
+
X-Summit-CRLF: injected | CWE-113
|
|
139
|
+
[PASS] sensitive file exposure: /.env confirmed by content signature
|
|
140
|
+
content signature: 'APP_KEY=' | CWE-538
|
|
141
|
+
[PASS] CVE detection: Apache/2.4.49 banner maps to known CVEs
|
|
142
|
+
detect_cves('Apache/2.4.49') -> ['CVE-2021-41773', 'CVE-2021-42013']
|
|
143
|
+
|
|
144
|
+
evidence summary: 19/19 claims verified
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
</details>
|
|
148
|
+
|
|
149
|
+
A visual of a real scan against the demo target:
|
|
150
|
+
|
|
151
|
+
<p align="center">
|
|
152
|
+
<img src="docs/assets/demo.png" alt="real summit scan output against the local demo target" width="760">
|
|
153
|
+
</p>
|
|
154
|
+
|
|
155
|
+
Reproduce everything yourself:
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
python examples/vuln_app.py # terminal 1 - the target
|
|
159
|
+
summit scan http://127.0.0.1:8765
|
|
160
|
+
python examples/evidence.py # re-verify every claim above
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
The demo seeds a *healthy* outbound link (`https://example.com`) as a negative control - it must never be reported, and CI asserts that alongside the seeded detections. Found something wrong anyway? [Report it](https://github.com/pennacle-security/summit/issues/new?template=bug_report.yml).
|
|
164
|
+
|
|
165
|
+
## Commands
|
|
166
|
+
|
|
167
|
+
| Command | What it does |
|
|
168
|
+
|---|---|
|
|
169
|
+
| `summit scan <url>` | crawl, then passive + active checks, link health, WAF analysis. `--openapi` scans a spec instead of crawling. `--json` / `--html` reports. |
|
|
170
|
+
| `summit authorize <url...>` | BOLA/IDOR testing: compare responses between two roles. |
|
|
171
|
+
| `summit mine <url>` | hidden parameter discovery (~70 candidates, marker-based). |
|
|
172
|
+
| `summit fuzz <url>` | directory brute force with wildcard-baseline filtering. |
|
|
173
|
+
| `summit recon <domain>` | chain subfinder -> httpx -> nmap into one report. |
|
|
174
|
+
| `summit tls <host>` | certificate expiry / self-signed / legacy TLS version audit. |
|
|
175
|
+
| `summit proxy` | intercepting HTTP proxy with a SQLite site map. |
|
|
176
|
+
| `summit repeater <file>` | send a raw request file (Burp-style). |
|
|
177
|
+
| `summit encode` / `summit decode` | base64, URL, hex, JWT (decode-only, honestly unverified). |
|
|
178
|
+
| `summit --check-update` / `--auto-update` / `--install-tools` | versioning and recon tool installer. |
|
|
179
|
+
|
|
180
|
+
Shared flags on scanning commands: `--workers`, `--rate` (requests/second ceiling), `--retries` (with `Retry-After` support), `--timeout`, `--delay`.
|
|
181
|
+
|
|
182
|
+
## Feature notes
|
|
183
|
+
|
|
184
|
+
**Authorization testing.** Requests each URL as a privileged and a low-privilege role, then compares. Verdicts: `enforced` (roles differ), `broken` (identical response for the low-privilege role - critical, `confirmed`), `partial` (same status, different body - `potential`). Measured on the demo: the admin panel serves salaries to both roles, caught as `confirmed`.
|
|
185
|
+
|
|
186
|
+
**Hidden parameter mining.** Servers read parameters the HTML never mentions - debug switches, feature flags, internal overrides. ~70 candidate names are probed with unique markers; reflection findings are `confirmed`, status/size shifts are `potential`. Measured: the demo's undocumented `debug` switch found as `confirmed`, the other candidates silent - zero noise.
|
|
187
|
+
|
|
188
|
+
**OpenAPI-driven scanning.** Every documented endpoint becomes a target, with path params filled from examples and defaults - no crawling, no guessing. Measured: the spec alone leads the engine to the seeded SQLi and XSS. JSON specs natively; YAML needs converting first (the dependency list stays at exactly one).
|
|
189
|
+
|
|
190
|
+
**WAF detection and bypass.** Tight vendor signatures for Cloudflare, AWS WAF, Akamai, Imperva, ModSecurity, Sucuri, F5 and Wordfence. When a filter blocks standard payloads, tamper variants (single/double URL-encoding, comment splitting, case alternation) are tried - and a bypass is reported only when the original payload lands **decoded** in the response. Measured: raw payload -> HTTP 403; encoded once -> HTTP 200, decoded.
|
|
191
|
+
|
|
192
|
+
**OS command injection, SSTI, CRLF, sensitive files.** New in v0.6, each with a hard confirmation rule: OS command injection uses an exec marker plus a control probe (a server that merely reflects input shows both markers; a server that executes shows the exec marker more often - measured `x2 vs x1`), SSTI requires `{{7*7}}` to come back as `49`, CRLF requires our injected header to materialize, and sensitive files (`.env`, `.git/config`, backups) require a content signature - never just a 200. Every finding is tagged with its CWE automatically (CWE-78, CWE-1336, CWE-113, CWE-538), and version banners are matched against an offline CVE database (spoofable banners stay `potential`).
|
|
193
|
+
|
|
194
|
+
**CAPTCHA: detect, do not solve.** reCAPTCHA, hCaptcha, Cloudflare Turnstile and challenge pages are detected and reported. Solving them automatically is out of scope by design - that line does not move.
|
|
195
|
+
|
|
196
|
+
**Broken-link hijacking.** Every outbound link is health-checked: dead domains (DNS verified twice), parked domains (tight fingerprints), broken links (404/410), unreachable hosts, and private-target links - recorded but never fetched, so a hostile page cannot weaponize your scanner as an SSRF probe.
|
|
197
|
+
|
|
198
|
+
**Resource takeover fingerprints.** A 404 answered with a provider's unclaimed-resource page (AWS S3, GitHub Pages, Heroku, Azure, Shopify, Fastly, Pantheon, Tumblr, Surge, Bitbucket) is a takeover setup. Fingerprint-only: no DNS tricks, no active claiming, ever.
|
|
199
|
+
|
|
200
|
+
**Recon orchestration.** subfinder -> httpx -> nmap, whichever are installed, with defensive parsing: passive-DNS noise capped, per-tool timeouts degrade into notes, and a crashed nmap is reported as *failed* - never as "no open ports".
|
|
201
|
+
|
|
202
|
+
**Rate limiting and prioritization.** `--rate` is a thread-safe requests/second ceiling (measured: 12 requests paced to 2.20s at rate 5; 0.02s unlimited). A transparent scoring model orders high-signal parameters first - deterministic and auditable, deliberately not a "neural network" claim.
|
|
203
|
+
|
|
204
|
+
**Toolkit and updates.** JWT decode with an honest "signature NOT verified" note, base64/URL/hex both directions, numeric version comparison against GitHub releases (`0.3 < 0.10`), self-update from a git checkout.
|
|
205
|
+
|
|
206
|
+
## Anti false positives and false negatives
|
|
207
|
+
|
|
208
|
+
False positives waste your triage time. False negatives get clients breached. Summit engineers against both, and the evidence runner proves it:
|
|
209
|
+
|
|
210
|
+
| Mechanism | What it kills |
|
|
211
|
+
|---|---|
|
|
212
|
+
| **Two-stage XSS check** - a unique canary goes first; payloads only fire on parameters that actually reflect | payload noise on parameters that never reflect |
|
|
213
|
+
| **Baseline diffing** - every probe compared against the same request untouched | error strings already sitting in the page |
|
|
214
|
+
| **Divergence + baseline match** (boolean SQLi) - `AND 1=1` must match the baseline, `AND 1=2` must differ | pages that simply vary per request |
|
|
215
|
+
| **Wildcard baseline** (fuzzer) - a random nonexistent path is measured first | "everything returns 200" servers flooding the report |
|
|
216
|
+
| **DNS double-check** (linkcheck) - a host must fail to resolve twice | transient resolver hiccups becoming fake hijack reports |
|
|
217
|
+
| **SSRF guard** - private/link-local/metadata ranges recorded, never fetched | your scanner weaponized against internal networks |
|
|
218
|
+
| **Tamper honesty** (WAF bypass) - requires the payload decoded in the response | bypass reports that would not survive a browser |
|
|
219
|
+
| **Tracker/opaque param filter** - `utm_*`, `fbclid`, 40+ char tokens never probed | wasted requests and padded reports |
|
|
220
|
+
| **Negative control in CI** - a healthy link that must stay unreported, asserted every push | silent regressions into false-positive territory |
|
|
221
|
+
| **Scope lock** - the spider never leaves the target host | crawling half the internet, and legal exposure |
|
|
222
|
+
| **Confidence labels** - fact vs heuristic, on every finding | one flat "everything is critical" triage queue |
|
|
223
|
+
| **Unbreakable probe hosts** - `.example` cannot resolve | third-party callbacks and accidental DoS |
|
|
224
|
+
|
|
225
|
+
## Check catalog
|
|
226
|
+
|
|
227
|
+
| Check | Type | Severity | Confirmation basis |
|
|
228
|
+
|---|---|---|---|
|
|
229
|
+
| Missing security headers | passive | low | header absence |
|
|
230
|
+
| Cookie flags (Secure / HttpOnly / SameSite) | passive | low-medium | header parse |
|
|
231
|
+
| SQL error / stack-trace disclosure | passive | medium | baseline-diffed signatures |
|
|
232
|
+
| Server and tech version disclosure | passive | info | header parse |
|
|
233
|
+
| CORS wildcard with credentials | passive | low | header parse |
|
|
234
|
+
| Email exposure | passive | info | regex |
|
|
235
|
+
| WAF fingerprint | passive | info | tight vendor signatures |
|
|
236
|
+
| CAPTCHA / anti-bot challenge | passive | info | challenge markers, reported not solved |
|
|
237
|
+
| Resource takeover signature | passive | high | provider unclaimed-resource page on 404 -> `confirmed` |
|
|
238
|
+
| SQL injection, error-based | active | critical | fresh DB error vs baseline -> `confirmed` |
|
|
239
|
+
| SQL injection, boolean-based | active | critical | response divergence -> `potential` |
|
|
240
|
+
| SQL injection, time-based blind | active | critical | calibrated delay reproduced on every probe -> `potential` |
|
|
241
|
+
| GraphQL introspection enabled | passive-origin | low | real `__schema` payload -> `confirmed` |
|
|
242
|
+
| Reflected XSS | active | high | canary + raw payload reflection -> `confirmed` |
|
|
243
|
+
| WAF filter bypass | active | high | tampered payload lands decoded -> `confirmed` |
|
|
244
|
+
| Host header injection | active | high | marker domain echoed vs baseline -> `confirmed` |
|
|
245
|
+
| CORS origin reflection | active | high | arbitrary origin reflected + credentials -> `confirmed` |
|
|
246
|
+
| OS command injection | active | critical | exec marker outruns control marker -> `confirmed`, CWE-78 |
|
|
247
|
+
| Server-side template injection (RCE) | active | critical | `{{7*7}}` evaluates to 49 -> `confirmed`, CWE-1336 |
|
|
248
|
+
| CRLF injection / response splitting | active | high | injected header materializes -> `confirmed`, CWE-113 |
|
|
249
|
+
| Sensitive file exposure (.env, .git) | passive-origin | high | content signature, not just a 200 -> `confirmed`, CWE-538 |
|
|
250
|
+
| Known CVE in version banner | passive | high | offline CVE database match -> `potential` (banners spoof) |
|
|
251
|
+
| Open redirect | active | medium | 3xx Location to probe host -> `confirmed` |
|
|
252
|
+
| Path traversal | active | high | OS file indicators -> `confirmed` |
|
|
253
|
+
| Broken access control (BOLA/IDOR) | authorize | critical | identical response for low-privilege role -> `confirmed` |
|
|
254
|
+
| Hidden parameter (reflected) | mine | medium | unique marker reflected -> `confirmed` |
|
|
255
|
+
| Hidden parameter (behavior) | mine | low | status/size shift -> `potential` |
|
|
256
|
+
| Link to dead domain (hijack) | linkcheck | high | DNS failure, verified twice -> `confirmed` |
|
|
257
|
+
| Link to parked domain (hijack) | linkcheck | high | tight parking fingerprints -> `confirmed` |
|
|
258
|
+
| Broken outbound link | linkcheck | medium | HTTP 404/410 -> `confirmed` |
|
|
259
|
+
| Unreachable outbound link | linkcheck | low | fails after retry -> `potential` |
|
|
260
|
+
| Outbound link to private IP | linkcheck | info | DNS resolution -> `confirmed`, never fetched |
|
|
261
|
+
| TLS certificate expired / self-signed | tls | high-medium | certificate dates and issuer -> `confirmed` |
|
|
262
|
+
| Legacy TLS versions accepted | tls | medium | handshake completed with TLSv1.0/1.1 -> `confirmed` |
|
|
263
|
+
| Directory fuzz | fuzz | info | status + wildcard baseline |
|
|
264
|
+
|
|
265
|
+
## How summit compares
|
|
266
|
+
|
|
267
|
+
| | summit | ZAP | Burp Suite |
|
|
268
|
+
|---|---|---|---|
|
|
269
|
+
| Price | free, MIT | free | paid core |
|
|
270
|
+
| UI | CLI + HTML/JSON reports | full GUI | full GUI |
|
|
271
|
+
| Scriptable in CI | yes, that is the point | add-ons | paid automation |
|
|
272
|
+
| Confidence-labelled findings | yes | partial | partial |
|
|
273
|
+
| Authorization testing (Autorize-style) | built in, scriptable | add-on | paid workflows |
|
|
274
|
+
| Hidden parameter mining (Param Miner-style) | built in | add-on | add-on |
|
|
275
|
+
| OpenAPI-driven scanning | built in | add-on | add-on |
|
|
276
|
+
| WAF detection + bypass probing | built in | partial | partial |
|
|
277
|
+
| Broken-link hijacking | built in | add-on | paid extension |
|
|
278
|
+
| Rate limiting | built in, thread-safe | add-on | paid |
|
|
279
|
+
| JWT/encoder toolkit | built in | add-on | built in |
|
|
280
|
+
| Takeover fingerprints, host header, CORS | built in | add-ons | add-ons |
|
|
281
|
+
| Codebase you can audit in an afternoon | ~3.6k lines | large | closed source |
|
|
282
|
+
| TLS-intercepting proxy | on the roadmap | yes | yes |
|
|
283
|
+
|
|
284
|
+
We are not trying to replace either of them. Summit is the small tool you drop into a pipeline or onto a VPS box, and the codebase you can actually read line by line.
|
|
285
|
+
|
|
286
|
+
## Roadmap
|
|
287
|
+
|
|
288
|
+
- [ ] TLS interception in the proxy (generated CA)
|
|
289
|
+
- [ ] POST form and JSON body injection points
|
|
290
|
+
- [ ] Authenticated scanning (cookies, headers)
|
|
291
|
+
- [ ] CNAME-level subdomain takeover (DNS resolution + service verification)
|
|
292
|
+
- [ ] Plugin API for custom checks
|
|
293
|
+
- [ ] Request interception UI
|
|
294
|
+
|
|
295
|
+
## Community and contributors
|
|
296
|
+
|
|
297
|
+
A repository that helps people back grows through word-of-mouth:
|
|
298
|
+
|
|
299
|
+
- **Questions** -> [Q&A discussion](https://github.com/pennacle-security/summit/discussions/categories/q-a) - beginner questions welcome, answered gladly
|
|
300
|
+
- **Ideas & roadmap votes** -> [Ideas](https://github.com/pennacle-security/summit/discussions/categories/ideas)
|
|
301
|
+
- **Show what you scanned** -> [Show and tell](https://github.com/pennacle-security/summit/discussions/categories/show-and-tell)
|
|
302
|
+
- **Your first contribution** -> [good first issues](https://github.com/pennacle-security/summit/labels/good%20first%20issue) come with step-by-step instructions
|
|
303
|
+
- First issues and PRs get a personal review and a spot below; the welcome bot says hello too
|
|
304
|
+
|
|
305
|
+
If summit saved you time on an engagement, a star helps the next person find it.
|
|
306
|
+
|
|
307
|
+
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
|
308
|
+
<!-- prettier-ignore-start -->
|
|
309
|
+
<!-- markdownlint-disable -->
|
|
310
|
+
|
|
311
|
+
<table>
|
|
312
|
+
<tbody>
|
|
313
|
+
<tr>
|
|
314
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/SakarPaisen"><img src="https://avatars.githubusercontent.com/u/141169555?v=4?s=100" width="100px;" alt="SakarPaisen"/><br /><sub><b>SakarPaisen</b></sub></a><br /><a href="https://github.com/pennacle-security/summit/commits?author=SakarPaisen" title="Code">💻</a></td>
|
|
315
|
+
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mrvi0"><img src="https://avatars.githubusercontent.com/u/196581611?v=4?s=100" width="100px;" alt="mrvi0"/><br /><sub><b>mrvi0</b></sub></a><br /><a href="https://github.com/pennacle-security/summit/commits?author=mrvi0" title="Code">💻</a></td>
|
|
316
|
+
</tr>
|
|
317
|
+
</tbody>
|
|
318
|
+
</table>
|
|
319
|
+
|
|
320
|
+
<!-- markdownlint-enable -->
|
|
321
|
+
<!-- prettier-ignore-end -->
|
|
322
|
+
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
|
323
|
+
|
|
324
|
+
## Contributing and security
|
|
325
|
+
|
|
326
|
+
PRs welcome - the [contributing guide](https://github.com/pennacle-security/.github/blob/main/CONTRIBUTING.md) covers the process, and adding a scan check is roughly thirty lines if you follow the pattern. [examples/vuln_app.py](examples/vuln_app.py) gives you a live target to test against.
|
|
327
|
+
|
|
328
|
+
Security issues go through private disclosure only. Details in the [security policy](https://github.com/pennacle-security/.github/blob/main/SECURITY.md).
|
|
329
|
+
|
|
330
|
+
## Legal and license
|
|
331
|
+
|
|
332
|
+
Summit is built for authorized security testing: your own systems, or systems you have written permission to test. We are not responsible for misuse. Licensed under [MIT](LICENSE).
|