blitzstrike 2.4.180 → 2.4.182
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.
- package/CHANGELOG.md +13 -3
- package/dist/index.js +100 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,7 +5,15 @@ All notable changes to Blitz Strike are documented here.
|
|
|
5
5
|
The format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
-
## [2.4.
|
|
8
|
+
## [2.4.182] — 2026-10-11
|
|
9
|
+
|
|
10
|
+
### Added — HTTP-level asset fingerprinting (Shodan-style MMH3)
|
|
11
|
+
|
|
12
|
+
- New `favicon_hash` tool + `src/fingerprint.ts`: MurmurHash3 (x86 32-bit) favicon
|
|
13
|
+
fingerprint — the Shodan-compatible `http.favicon.hash` (verified against the
|
|
14
|
+
python `mmh3` reference: 9/9 vectors match) — plus body SHA-256 for content dedup
|
|
15
|
+
and the base64 `mmh3:` form. The same favicon hash means the same product/tech
|
|
16
|
+
even across unrelated hosts, so it is the strongest web-asset pivoting signal.
|
|
9
17
|
|
|
10
18
|
### Changed — goal decomposition corrected (goal = deliverable, not process)
|
|
11
19
|
|
|
@@ -20,12 +28,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
|
20
28
|
a new target discovered outside the constraints is recorded as an out-of-scope
|
|
21
29
|
fact and skipped, never authorized.
|
|
22
30
|
|
|
23
|
-
### Added —
|
|
31
|
+
### Added — 6 doctrine rules
|
|
24
32
|
|
|
25
33
|
- `constraint_self_contained`, `record_is_memory` (write-back is anti-compaction
|
|
26
34
|
long-term memory — record immediately, only increments), `wrapup_highest_priority`
|
|
27
35
|
(land conclusions then stop), `high_value_surface` (parsing/charset, upload,
|
|
28
|
-
(de)serialization, cache race, TOCTOU, type confusion, mass assignment)
|
|
36
|
+
(de)serialization, cache race, TOCTOU, type confusion, mass assignment),
|
|
37
|
+
`serial_chain_discipline` (each chain step consumes the prior step's REAL output),
|
|
38
|
+
`compression_discipline` (synthesize causally, preserve observed/inferred + source ids).
|
|
29
39
|
|
|
30
40
|
## [2.4.179] — 2026-10-11
|
|
31
41
|
|
package/dist/index.js
CHANGED
|
@@ -63794,6 +63794,16 @@ var HUNTING_DOCTRINE = [
|
|
|
63794
63794
|
id: "high_value_surface",
|
|
63795
63795
|
title: "High-Value Attack Surface — The Often-Overlooked Faces",
|
|
63796
63796
|
rule: "When mapping the attack surface, prioritize these often-overlooked high-value faces (pick what applies, not a checklist obligation): input parsing / encoding / charset boundaries; file upload; (de)serialization; built-in routing + pre-auth-reachable handlers; error-handling leaks; cache poisoning / cache race; race conditions (TOCTOU); type confusion (scalar vs array); and mass assignment. These are where the highest-impact bugs hide when the obvious endpoints come up clean — before declaring a surface exhausted, confirm none of these faces remain untested."
|
|
63797
|
+
},
|
|
63798
|
+
{
|
|
63799
|
+
id: "serial_chain_discipline",
|
|
63800
|
+
title: "Serial Chain — Each Step Depends on the Prior Step's REAL Output",
|
|
63801
|
+
rule: "For a serial exploitation chain (①→②→③, where each later step consumes the PRIOR step's actual output — a leaked key, an auth cookie, a session id, a written file, a generated nonce): drive it ONE STEP AT A TIME. Execute step ① and capture its REAL output first; only then design and run step ② against that concrete output; never imagine or assume the output of a step you have not actually run, and never plan/execute step ③ while step ②'s prerequisite still does not exist. Across codebases/interfaces, actively pull the FULL detail of every known clue into the current session to chain gadgets together — do not stop at the summary. A chain is only as real as the weakest link you actually produced."
|
|
63802
|
+
},
|
|
63803
|
+
{
|
|
63804
|
+
id: "compression_discipline",
|
|
63805
|
+
title: "Compression — Synthesize Causally, Preserve Confidence + Provenance",
|
|
63806
|
+
rule: "When summarizing or compressing a set of related exploration nodes (facts/intents/findings), do NOT enumerate — synthesize: trace the causality (which fact birthed which intent, which intent produced which conclusion) and state what this region of the exploration CONCLUDED. Preserve distinctions between different conclusions (do not merge them into one vague sentence). Preserve evidence strength: mark observed vs inferred, and flag an inferred NEGATIVE/doubtful conclusion as inference-that-can-be-rechecked, never as a settled fact. Tag each conclusion with its source id(s) (e.g. #12, #28) so it can be traced back. State only what the inputs contain — never introduce a judgment the inputs do not support. Let length follow content: short when the conclusions are few, long only when they are many and genuinely distinct — always well under the sum of the inputs."
|
|
63797
63807
|
}
|
|
63798
63808
|
];
|
|
63799
63809
|
var DOMAIN_EXHAUSTION_CHECKLIST = [
|
|
@@ -64109,6 +64119,81 @@ function coverageSummary() {
|
|
|
64109
64119
|
};
|
|
64110
64120
|
}
|
|
64111
64121
|
|
|
64122
|
+
// src/fingerprint.ts
|
|
64123
|
+
function mmh3(data, seed = 0) {
|
|
64124
|
+
const c1 = 3432918353;
|
|
64125
|
+
const c2 = 461845907;
|
|
64126
|
+
let h1 = seed | 0;
|
|
64127
|
+
const len = data.length;
|
|
64128
|
+
const nblocks = len >> 2;
|
|
64129
|
+
for (let i = 0;i < nblocks; i++) {
|
|
64130
|
+
const o = i << 2;
|
|
64131
|
+
let k1 = data[o] | data[o + 1] << 8 | data[o + 2] << 16 | data[o + 3] << 24 | 0;
|
|
64132
|
+
k1 = Math.imul(k1, c1) | 0;
|
|
64133
|
+
k1 = k1 << 15 | k1 >>> 17;
|
|
64134
|
+
k1 = Math.imul(k1, c2) | 0;
|
|
64135
|
+
h1 ^= k1;
|
|
64136
|
+
h1 = h1 << 13 | h1 >>> 19;
|
|
64137
|
+
h1 = Math.imul(h1, 5) + 3864292196 | 0;
|
|
64138
|
+
}
|
|
64139
|
+
let k1 = 0;
|
|
64140
|
+
const tail = nblocks << 2;
|
|
64141
|
+
switch (len & 3) {
|
|
64142
|
+
case 3:
|
|
64143
|
+
k1 ^= data[tail + 2] << 16;
|
|
64144
|
+
case 2:
|
|
64145
|
+
k1 ^= data[tail + 1] << 8;
|
|
64146
|
+
case 1:
|
|
64147
|
+
k1 ^= data[tail];
|
|
64148
|
+
k1 = Math.imul(k1, c1) | 0;
|
|
64149
|
+
k1 = k1 << 15 | k1 >>> 17;
|
|
64150
|
+
k1 = Math.imul(k1, c2) | 0;
|
|
64151
|
+
h1 ^= k1;
|
|
64152
|
+
}
|
|
64153
|
+
h1 ^= len;
|
|
64154
|
+
h1 ^= h1 >>> 16;
|
|
64155
|
+
h1 = Math.imul(h1, 2246822507) | 0;
|
|
64156
|
+
h1 ^= h1 >>> 13;
|
|
64157
|
+
h1 = Math.imul(h1, 3266489909) | 0;
|
|
64158
|
+
h1 ^= h1 >>> 16;
|
|
64159
|
+
return h1 | 0;
|
|
64160
|
+
}
|
|
64161
|
+
function faviconHash(bytes) {
|
|
64162
|
+
return mmh3(bytes, 0);
|
|
64163
|
+
}
|
|
64164
|
+
function fingerprintBundle(faviconBytes, body) {
|
|
64165
|
+
let favicon_mmh3 = null;
|
|
64166
|
+
let favicon_mmh3_b64 = null;
|
|
64167
|
+
if (faviconBytes && faviconBytes.length > 0) {
|
|
64168
|
+
favicon_mmh3 = faviconHash(faviconBytes);
|
|
64169
|
+
const buf = new ArrayBuffer(4);
|
|
64170
|
+
const dv = new DataView(buf);
|
|
64171
|
+
dv.setInt32(0, favicon_mmh3, false);
|
|
64172
|
+
favicon_mmh3_b64 = btoa(String.fromCharCode(...new Uint8Array(buf)));
|
|
64173
|
+
}
|
|
64174
|
+
return { favicon_mmh3, favicon_mmh3_b64, body_sha256: sha256(body) };
|
|
64175
|
+
}
|
|
64176
|
+
function decodeFavicon(data, encoding = "base64") {
|
|
64177
|
+
try {
|
|
64178
|
+
if (encoding === "hex") {
|
|
64179
|
+
const s = data.replace(/[^0-9a-fA-F]/g, "");
|
|
64180
|
+
if (s.length % 2 !== 0 || s.length === 0)
|
|
64181
|
+
return null;
|
|
64182
|
+
const out = new Uint8Array(s.length / 2);
|
|
64183
|
+
for (let i = 0;i < out.length; i++)
|
|
64184
|
+
out[i] = parseInt(s.slice(i * 2, i * 2 + 2), 16);
|
|
64185
|
+
return out;
|
|
64186
|
+
}
|
|
64187
|
+
const bin = atob(data);
|
|
64188
|
+
const out = new Uint8Array(bin.length);
|
|
64189
|
+
for (let i = 0;i < bin.length; i++)
|
|
64190
|
+
out[i] = bin.charCodeAt(i);
|
|
64191
|
+
return out;
|
|
64192
|
+
} catch {
|
|
64193
|
+
return null;
|
|
64194
|
+
}
|
|
64195
|
+
}
|
|
64196
|
+
|
|
64112
64197
|
// src/sibling-scan.ts
|
|
64113
64198
|
var SIBLING_SUFFIXES = [
|
|
64114
64199
|
"export",
|
|
@@ -67220,6 +67305,21 @@ ${statusLine}` : statusLine },
|
|
|
67220
67305
|
}]
|
|
67221
67306
|
};
|
|
67222
67307
|
});
|
|
67308
|
+
server.registerTool("favicon_hash", {
|
|
67309
|
+
title: "Favicon MMH3 hash (Shodan-style asset fingerprint)",
|
|
67310
|
+
description: "RECON: compute the Shodan-compatible MurmurHash3 (MMH3) fingerprint of a favicon (or any raw bytes) — the strongest pivoting signal for web assets: the SAME favicon hash means the SAME product/tech even across unrelated hosts. Pass base64/hex-encoded favicon bytes (or the response body to also get its SHA-256 for content dedup). Use to fingerprint a live target, dedup assets by body hash, and pivot to every host serving the same favicon.",
|
|
67311
|
+
inputSchema: {
|
|
67312
|
+
data: string2().describe("Favicon bytes as base64 (default) or hex"),
|
|
67313
|
+
encoding: _enum(["base64", "hex"]).optional().describe("How `data` is encoded (default base64)"),
|
|
67314
|
+
body: string2().optional().describe("Optional response body — returns its SHA-256 for content-based asset dedup")
|
|
67315
|
+
}
|
|
67316
|
+
}, async ({ data, encoding, body }) => {
|
|
67317
|
+
const bytes = decodeFavicon(data, encoding ?? "base64");
|
|
67318
|
+
if (!bytes)
|
|
67319
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: "invalid favicon data" }) }] };
|
|
67320
|
+
const bundle = fingerprintBundle(bytes, body ?? "");
|
|
67321
|
+
return { content: [{ type: "text", text: JSON.stringify(bundle) }] };
|
|
67322
|
+
});
|
|
67223
67323
|
server.registerTool("framework_intel", {
|
|
67224
67324
|
title: "Framework security knowledge",
|
|
67225
67325
|
description: "PHASE 5: return a framework's security knowledge (sources, sinks, sanitizers, auth gates, routing, ORM, middleware, and — for WordPress — the P1-P6 vulnerability pattern taxonomy: RCE / upload / ATO / reset / priv-esc / AJAX-REST-authz, each with signals, detect, fixed, and anchor WPVDB ids) and optionally scan code with those patterns.",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "blitzstrike",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.182",
|
|
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": {
|