blitzstrike 1.0.77 → 1.0.82

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.
@@ -0,0 +1,53 @@
1
+ {
2
+ "_comment": "Bypass techniques for when a probe is blocked by a defense (WAF, filter/sanitizer, auth gate, rate-limit). Look up the matching defense and apply the technique instead of giving up.",
3
+ "categories": [
4
+ {
5
+ "id": "waf",
6
+ "defense": "WAF / web application firewall",
7
+ "techniques": [
8
+ {"id": "encoding", "name": "Encoding", "how": "URL-encode, double-encode, or unicode-escape the payload so the signature never matches.", "example": "%2527%2520OR%25201%253D1"},
9
+ {"id": "case", "name": "Case variation", "how": "Alternate keyword case to evade case-sensitive signatures.", "example": "SeLeCt * FrOm users"},
10
+ {"id": "comment", "name": "Inline comments", "how": "Insert inline comments inside keywords to split the signature.", "example": "UN/**/ION SE/**/LECT"},
11
+ {"id": "separator", "name": "Separator variation", "how": "Swap spaces for tabs/newlines/alternative separators.", "example": "SELECT%0a*%0aFROM"},
12
+ {"id": "concat", "name": "String concatenation", "how": "Break the payload into concatenated fragments.", "example": "se'||'lect"},
13
+ {"id": "chunked", "name": "Chunked / HTTP smuggling", "how": "Split the payload across chunked-encoding or HTTP/2 boundaries to bypass inspection."},
14
+ {"id": "param_pollution", "name": "Parameter pollution", "how": "Send duplicate parameters; the WAF checks one, the app uses the other.", "example": "id=1&id=1' OR '1'='1"}
15
+ ]
16
+ },
17
+ {
18
+ "id": "filter",
19
+ "defense": "Input filter / sanitizer / blacklist",
20
+ "techniques": [
21
+ {"id": "null_byte", "name": "Null byte", "how": "Insert a null byte to truncate validation while the sink reads past it.", "example": "file.php%00.jpg"},
22
+ {"id": "double_encode", "name": "Double encoding", "how": "Encode twice; the filter decodes once, the sink decodes again.", "example": "%252e%252e%252f"},
23
+ {"id": "unicode", "name": "Unicode / normalization", "how": "Use fullwidth, overlong UTF-8, or unicode lookalikes the filter misses.", "example": "<script> or %c0%af"},
24
+ {"id": "case_mix", "name": "Case mixing", "how": "Bypass blacklists with mixed case when the filter is case-sensitive.", "example": "<ScRiPt>"},
25
+ {"id": "whitespace", "name": "Whitespace / padding", "how": "Insert spaces/tabs/newlines the filter strips or ignores.", "example": "<scr ipt>"},
26
+ {"id": "nested", "name": "Nested / recursive", "how": "Nest a blocked token inside an allowed one so the filter strips one layer.", "example": "<scr<script>ipt>"},
27
+ {"id": "cast_truncate", "name": "Cast / length truncation", "how": "Exploit int cast or length truncation that drops the dangerous tail.", "example": "1e99 (loose comparison to 1)"}
28
+ ]
29
+ },
30
+ {
31
+ "id": "auth",
32
+ "defense": "Authentication / authorization (401/403)",
33
+ "techniques": [
34
+ {"id": "path_traversal", "name": "Path normalization", "how": "Bypass path-based ACL with traversal or encoding.", "example": "/admin/../admin, /admin%2f, /admin/.;/"},
35
+ {"id": "verb", "name": "HTTP verb tampering", "how": "Switch the method (GET->POST, add X-HTTP-Method-Override).", "example": "GET /admin -> POST /admin"},
36
+ {"id": "header", "name": "Header spoofing", "how": "Spoof X-Forwarded-For / X-Real-IP / X-Original-URL to appear internal.", "example": "X-Original-URL: /admin"},
37
+ {"id": "case_path", "name": "Case / suffix", "how": "Vary case or append suffix to dodge exact-match rules.", "example": "/Admin, /admin/.json, /admin/."},
38
+ {"id": "param", "name": "Parameter override", "how": "Override auth via a second parameter or body field the backend trusts.", "example": "user=guest&user=admin"}
39
+ ]
40
+ },
41
+ {
42
+ "id": "rate_limit",
43
+ "defense": "Rate limit / captcha / bot protection",
44
+ "techniques": [
45
+ {"id": "rotation", "name": "IP / header rotation", "how": "Rotate source IP or spoof client headers to evade per-IP limits.", "example": "X-Forwarded-For: 1.2.3.4"},
46
+ {"id": "slow", "name": "Low-and-slow", "how": "Stay under the threshold with pacing + jitter."},
47
+ {"id": "header_spoof", "name": "Header spoofing", "how": "Spoof User-Agent / Referer to look like a real browser."},
48
+ {"id": "token_reuse", "name": "Token/session reuse", "how": "Reuse a valid session/token across requests to skip per-request checks."},
49
+ {"id": "burst", "name": "Burst vs window", "how": "Exploit the difference between per-second and per-window limits."}
50
+ ]
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "_comment": "Chain-to-chain composition: which escalation chains naturally follow another. A complex bug chains several of these. Each link: from -> to (via the pivot primitive).",
3
+ "links": [
4
+ {"from": "ssrf_cloud_metadata", "to": ["default_creds_to_internal_pivot", "docker_container_breakout"], "via": "stolen IAM/cloud credentials"},
5
+ {"from": "xxe_to_ssrf_and_file_read", "to": ["ssrf_cloud_metadata", "ssrf_to_redis_rce"], "via": "SSRF primitive gained from XXE"},
6
+ {"from": "ssrf_to_redis_rce", "to": ["default_creds_to_internal_pivot"], "via": "OS shell on internal service"},
7
+ {"from": "sqli_to_rce", "to": ["sqli_to_hash_dump_and_crack", "path_traversal_to_credential_theft"], "via": "OS shell / DB access"},
8
+ {"from": "file_upload_to_rce", "to": ["path_traversal_to_credential_theft", "default_creds_to_internal_pivot"], "via": "web shell on host"},
9
+ {"from": "lfi_to_rce_via_log_poisoning", "to": ["path_traversal_to_credential_theft"], "via": "code execution on host"},
10
+ {"from": "ssti_to_full_rce", "to": ["path_traversal_to_credential_theft"], "via": "code execution on host"},
11
+ {"from": "deserialization_to_rce", "to": ["path_traversal_to_credential_theft", "docker_container_breakout"], "via": "code execution on host"},
12
+ {"from": "xss_to_account_takeover", "to": ["idor_to_admin_takeover", "api_key_leak_to_account_takeover"], "via": "session/account control"},
13
+ {"from": "idor_to_admin_takeover", "to": ["api_key_leak_to_account_takeover"], "via": "admin access"},
14
+ {"from": "api_key_leak_to_account_takeover", "to": ["idor_to_admin_takeover"], "via": "account takeover"},
15
+ {"from": "default_creds_to_internal_pivot", "to": ["docker_container_breakout", "kubernetes_pod_escape"], "via": "internal foothold"},
16
+ {"from": "docker_container_breakout", "to": ["kubernetes_pod_escape"], "via": "host access"},
17
+ {"from": "open_redirect_to_oauth_theft", "to": ["xss_to_account_takeover"], "via": "stolen OAuth token"},
18
+ {"from": "subdomain_takeover_to_cookie_theft", "to": ["xss_to_account_takeover"], "via": "cookie scope control"},
19
+ {"from": "cache_poison_to_stored_xss", "to": ["xss_to_account_takeover"], "via": "persistent XSS"},
20
+ {"from": "graphql_idor_to_data_theft", "to": ["idor_to_admin_takeover"], "via": "admin identifier leaked"},
21
+ {"from": "path_traversal_to_credential_theft", "to": ["default_creds_to_internal_pivot", "docker_container_breakout"], "via": "credentials/hashes recovered"}
22
+ ]
23
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "1.0.77",
3
+ "version": "1.0.82",
4
4
  "description": "Blitz Strike — a universal MCP security-audit toolbelt. BLITZ sweeps the attack surface, EAGLE-EYE traces source-to-sink, STRIKE verifies live. 57 attack chains, 130-tool catalog, intelligence data layer. One server, every agent.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,6 +8,32 @@ description: Use when the user asks for a full security engagement ("fullscan",
8
8
  You are the brain. Blitz Strike is the hands. Drive the full cycle with the
9
9
  deterministic MCP tools; never guess a finding — produce it from tool output.
10
10
 
11
+ ## Target routing (auto-detect first — no need to ask)
12
+
13
+ Classify the target before any tool call. This is automatic, driven by the
14
+ shape of what the user gave you. A URL often has NO `http://`/`https://` prefix
15
+ — a bare domain, IP, or host:port is still a live target:
16
+
17
+ | Target shape | Flow |
18
+ |---|---|
19
+ | URL — with or without scheme (`https://x.com`, `x.com`, `sub.x.com/path`, `x.com:8080`, `192.168.1.1`) | **Live** — `scope_check` (authorization) → `live_recon` → `active_scan` → `strike_verify` → report |
20
+ | Filesystem path (exists on disk, or starts `/` `./` `../` `~`, or ends in a code extension `.php` `.py` `.js` `.ts` `.java` …) | **Source** — `blitz_scan` → `eagle_eye2` → `complex_scan`/`route_scan` → report |
21
+
22
+ Rule of thumb: check "is it a filesystem path?" FIRST (exists on disk, or a
23
+ code extension). If it is NOT a path, treat it as a live host — prepend
24
+ `https://` when the scheme is missing (`example.com` → `https://example.com`)
25
+ and confirm scope before any request.
26
+
27
+ `run_engagement` auto-detects both internally (path on disk → source pipeline;
28
+ anything else → live, scope-gated). For the granular sub-agent flow, route the
29
+ workstreams yourself: URL → live workstreams, path → source workstreams.
30
+
31
+ After routing, read the matching playbook (`read_playbook`) for the target type
32
+ — `web-application`, `api-security`, `source-code-audit`, `active-directory`,
33
+ `mobile-application`, `external-attack-surface` — it is the campaign plan for
34
+ that type. Load the phase skill (`source-audit`, `verify-finding`, …) for the
35
+ step you are on. Do not improvise a plan the playbook already spells out.
36
+
11
37
  ## The cycle
12
38
 
13
39
  1. **Scope gate (always first).** Call `scope_check` before any live action.
@@ -78,6 +104,11 @@ user sees you working, not a silent tool call.
78
104
 
79
105
  ## Rules
80
106
 
107
+ - **Persist — complex bugs do not give up.** A failed probe is not "not
108
+ vulnerable" (vary sinks, params, encodings); empty output is not "no
109
+ findings" (re-run or escalate to `route_scan`/`complex_scan`); a "sanitized"
110
+ sink is not safe until you challenge the sanitizer (loose `==`, missing
111
+ `EXTR_SKIP`, cast truncation). Keep unconfirmed work as hypotheses.
81
112
  - One hypothesis per finding; `finding_create` + `finding_transition` for the
82
113
  strict lifecycle (candidate → confirmed → rejected).
83
114
  - `dedup_findings` before reporting — collapse shared-root duplicates.