blitzstrike 2.4.99 → 2.4.101
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 +23 -0
- package/dist/index.js +54 -51
- package/intelligence/attack_vectors.json +833 -830
- package/intelligence/techniques.json +1281 -1208
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,29 @@ 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.101] — 2026-09-17
|
|
9
|
+
|
|
10
|
+
### Added — three new hunting classes (techniques + attack vectors)
|
|
11
|
+
|
|
12
|
+
- Added `broken_link_hijacking` (expired-domain takeover), `padding_oracle`
|
|
13
|
+
(CBC PKCS#7 cookie/token decryption), and `dns_rebinding` (hostname
|
|
14
|
+
re-resolution to internal IP) to the technique base (53 → 56 classes) and the
|
|
15
|
+
attack-vector taxonomy (588 → 591 vectors). Each carries summary, objectives,
|
|
16
|
+
how-to-test steps, concrete techniques, and verify (marker + negative
|
|
17
|
+
control) — matching the existing per-class methodology shape.
|
|
18
|
+
|
|
19
|
+
## [2.4.100] — 2026-09-17
|
|
20
|
+
|
|
21
|
+
### Fixed — data-file resolution was `process.cwd()`-dependent (broke under npx)
|
|
22
|
+
|
|
23
|
+
- `watchlist()` / `watchlistCveMatches()` resolved `intelligence/watchlist.json`
|
|
24
|
+
via `process.cwd()`; `run_enterprise_benchmark()` resolved `bench/enterprise`
|
|
25
|
+
fixtures the same way. When the MCP server / compiled binary runs from any
|
|
26
|
+
directory other than the package root (the `npx blitzstrike` case), both threw
|
|
27
|
+
`ENOENT`. Now both resolve via `import.meta.url` (module-relative), matching
|
|
28
|
+
every other data loader (`patterns.ts`, `chains.json`, `tools-catalog.json`).
|
|
29
|
+
Verified: `watchlist()` and the enterprise fixtures load from an arbitrary cwd.
|
|
30
|
+
|
|
8
31
|
## [2.4.99] — 2026-09-17
|
|
9
32
|
|
|
10
33
|
### Fixed — grounding completeness for the CVE watchlist class tags
|
package/dist/index.js
CHANGED
|
@@ -17287,7 +17287,7 @@ document.getElementById('out').innerHTML = u;
|
|
|
17287
17287
|
// src/variants.ts
|
|
17288
17288
|
import { readFileSync as readFileSync21 } from "node:fs";
|
|
17289
17289
|
import { join as join21, dirname as dirname5 } from "node:path";
|
|
17290
|
-
import { fileURLToPath as
|
|
17290
|
+
import { fileURLToPath as fileURLToPath12 } from "node:url";
|
|
17291
17291
|
function loadVariants() {
|
|
17292
17292
|
try {
|
|
17293
17293
|
const doc = JSON.parse(readFileSync21(join21(__dirname5, "..", "intelligence", "variants.json"), "utf8"));
|
|
@@ -17344,7 +17344,7 @@ function variantCoverageText() {
|
|
|
17344
17344
|
var __dirname5, CROSS_FILE_ONLY;
|
|
17345
17345
|
var init_variants = __esm(() => {
|
|
17346
17346
|
init_complex_bugs();
|
|
17347
|
-
__dirname5 = dirname5(
|
|
17347
|
+
__dirname5 = dirname5(fileURLToPath12(import.meta.url));
|
|
17348
17348
|
CROSS_FILE_ONLY = new Set(["priv_esc"]);
|
|
17349
17349
|
});
|
|
17350
17350
|
|
|
@@ -17352,7 +17352,7 @@ var init_variants = __esm(() => {
|
|
|
17352
17352
|
import { mkdirSync as mkdirSync10, writeFileSync as writeFileSync9, readFileSync as readFileSync27, readdirSync as readdirSync7, statSync as statSync4, rmSync as rmSync5 } from "node:fs";
|
|
17353
17353
|
import { join as join26 } from "node:path";
|
|
17354
17354
|
import { homedir as homedir10 } from "node:os";
|
|
17355
|
-
import { fileURLToPath as
|
|
17355
|
+
import { fileURLToPath as fileURLToPath15 } from "node:url";
|
|
17356
17356
|
import { spawnSync as spawnSync4 } from "node:child_process";
|
|
17357
17357
|
function dirExists(p) {
|
|
17358
17358
|
try {
|
|
@@ -17392,8 +17392,8 @@ function syncData() {
|
|
|
17392
17392
|
data_root: DATA_ROOT2
|
|
17393
17393
|
};
|
|
17394
17394
|
}
|
|
17395
|
-
const localPayloads = join26(
|
|
17396
|
-
const localTemplates = join26(
|
|
17395
|
+
const localPayloads = join26(ROOT8, "payloads");
|
|
17396
|
+
const localTemplates = join26(ROOT8, "templates");
|
|
17397
17397
|
let payloadsSynced = false;
|
|
17398
17398
|
let templatesSynced = false;
|
|
17399
17399
|
if (!hasPayloads && dirExists(localPayloads)) {
|
|
@@ -17448,9 +17448,9 @@ function manualCopy(src, dst) {
|
|
|
17448
17448
|
writeFileSync9(d, readFileSync27(s));
|
|
17449
17449
|
}
|
|
17450
17450
|
}
|
|
17451
|
-
var
|
|
17451
|
+
var ROOT8, DATA_ROOT2, GITHUB_REPO = "https://github.com/shinthink/blitzstrike.git";
|
|
17452
17452
|
var init_sync = __esm(() => {
|
|
17453
|
-
|
|
17453
|
+
ROOT8 = join26(fileURLToPath15(new URL(".", import.meta.url)), "..");
|
|
17454
17454
|
DATA_ROOT2 = process.env.BLITZSTRIKE_DATA ?? join26(homedir10(), ".blitzstrike", "data");
|
|
17455
17455
|
});
|
|
17456
17456
|
|
|
@@ -17498,13 +17498,13 @@ var init_update = __esm(() => {
|
|
|
17498
17498
|
// src/release.ts
|
|
17499
17499
|
import { readFileSync as readFileSync29, existsSync as existsSync16 } from "node:fs";
|
|
17500
17500
|
import { join as join27 } from "node:path";
|
|
17501
|
-
import { fileURLToPath as
|
|
17501
|
+
import { fileURLToPath as fileURLToPath16 } from "node:url";
|
|
17502
17502
|
import { execSync as execSync4 } from "node:child_process";
|
|
17503
17503
|
function validateRelease() {
|
|
17504
17504
|
const checks = [];
|
|
17505
17505
|
checks.push({ name: "package.json version", ok: true, detail: VERSION });
|
|
17506
17506
|
try {
|
|
17507
|
-
const changelog = readFileSync29(join27(
|
|
17507
|
+
const changelog = readFileSync29(join27(ROOT9, "CHANGELOG.md"), "utf8");
|
|
17508
17508
|
const m = changelog.match(/^##\s+\[([0-9]+\.[0-9]+\.[0-9]+)\]/m);
|
|
17509
17509
|
const changelogVersion = m?.[1] ?? null;
|
|
17510
17510
|
checks.push({
|
|
@@ -17516,7 +17516,7 @@ function validateRelease() {
|
|
|
17516
17516
|
checks.push({ name: "CHANGELOG version", ok: false, detail: "CHANGELOG.md not found" });
|
|
17517
17517
|
}
|
|
17518
17518
|
try {
|
|
17519
|
-
const tag = execSync4("git describe --tags --abbrev=0", { cwd:
|
|
17519
|
+
const tag = execSync4("git describe --tags --abbrev=0", { cwd: ROOT9, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
|
|
17520
17520
|
checks.push({ name: "Git tag", ok: tag === `v${VERSION}`, detail: tag, soft: true });
|
|
17521
17521
|
} catch {
|
|
17522
17522
|
checks.push({ name: "Git tag", ok: true, detail: "unavailable (no git/tags)", soft: true });
|
|
@@ -17536,22 +17536,22 @@ function validateRelease() {
|
|
|
17536
17536
|
return { version: VERSION, checks, consistent: checks.filter((c) => !c.soft).every((c) => c.ok) };
|
|
17537
17537
|
}
|
|
17538
17538
|
function lockfilePresent() {
|
|
17539
|
-
return existsSync16(join27(
|
|
17539
|
+
return existsSync16(join27(ROOT9, "package-lock.json")) || existsSync16(join27(ROOT9, "bun.lock")) || existsSync16(join27(ROOT9, "bun.lockb"));
|
|
17540
17540
|
}
|
|
17541
|
-
var
|
|
17541
|
+
var ROOT9;
|
|
17542
17542
|
var init_release = __esm(() => {
|
|
17543
17543
|
init_version();
|
|
17544
|
-
|
|
17544
|
+
ROOT9 = join27(fileURLToPath16(new URL(".", import.meta.url)), "..");
|
|
17545
17545
|
});
|
|
17546
17546
|
|
|
17547
17547
|
// src/dependency.ts
|
|
17548
17548
|
import { readFileSync as readFileSync30 } from "node:fs";
|
|
17549
17549
|
import { join as join28 } from "node:path";
|
|
17550
|
-
import { fileURLToPath as
|
|
17550
|
+
import { fileURLToPath as fileURLToPath17 } from "node:url";
|
|
17551
17551
|
function checkDependencies() {
|
|
17552
17552
|
let pkg = {};
|
|
17553
17553
|
try {
|
|
17554
|
-
pkg = JSON.parse(readFileSync30(join28(
|
|
17554
|
+
pkg = JSON.parse(readFileSync30(join28(ROOT10, "package.json"), "utf8"));
|
|
17555
17555
|
} catch {
|
|
17556
17556
|
return { install_scripts: [], git_dependencies: [], total_dependencies: 0, safe: false };
|
|
17557
17557
|
}
|
|
@@ -17572,16 +17572,16 @@ function checkDependencies() {
|
|
|
17572
17572
|
safe: installScripts.length === 0 && gitDependencies.length === 0
|
|
17573
17573
|
};
|
|
17574
17574
|
}
|
|
17575
|
-
var
|
|
17575
|
+
var ROOT10;
|
|
17576
17576
|
var init_dependency = __esm(() => {
|
|
17577
|
-
|
|
17577
|
+
ROOT10 = join28(fileURLToPath17(new URL(".", import.meta.url)), "..");
|
|
17578
17578
|
});
|
|
17579
17579
|
|
|
17580
17580
|
// src/cli.ts
|
|
17581
17581
|
import { readFileSync as readFileSync31, existsSync as existsSync17, writeFileSync as writeFileSync10, mkdirSync as mkdirSync11 } from "node:fs";
|
|
17582
17582
|
import { join as join29, dirname as dirname6 } from "node:path";
|
|
17583
17583
|
import { homedir as homedir11 } from "node:os";
|
|
17584
|
-
import { fileURLToPath as
|
|
17584
|
+
import { fileURLToPath as fileURLToPath18 } from "node:url";
|
|
17585
17585
|
import { spawnSync as spawnSync5 } from "node:child_process";
|
|
17586
17586
|
function which(cmd) {
|
|
17587
17587
|
return spawnSync5("sh", ["-c", 'command -v "$1" >/dev/null 2>&1', "sh", cmd]).status === 0;
|
|
@@ -17624,7 +17624,7 @@ async function runDoctor() {
|
|
|
17624
17624
|
detail: h1 ? `X-HackerOne-Research: ${h1}` : "H1_USERNAME not set",
|
|
17625
17625
|
fix: h1 ? undefined : "export H1_USERNAME=<your-hackerone-username> (adds X-HackerOne-Research to outbound requests)"
|
|
17626
17626
|
});
|
|
17627
|
-
const dataOk = existsSync17(join29(
|
|
17627
|
+
const dataOk = existsSync17(join29(ROOT11, "chains.json")) && existsSync17(join29(ROOT11, "tools-catalog.json"));
|
|
17628
17628
|
issues.push({
|
|
17629
17629
|
name: "Data layers (chains + tools-catalog)",
|
|
17630
17630
|
status: dataOk ? "ok" : "fail",
|
|
@@ -17675,14 +17675,14 @@ BlitzStrike — ${verdict}`);
|
|
|
17675
17675
|
function resolveCommand() {
|
|
17676
17676
|
if (which("blitzstrike"))
|
|
17677
17677
|
return { command: "blitzstrike", args: ["serve", "--mcp"] };
|
|
17678
|
-
const src = join29(
|
|
17678
|
+
const src = join29(ROOT11, "src", "index.ts");
|
|
17679
17679
|
if (which("bun") && existsSync17(src))
|
|
17680
17680
|
return { command: "bun", args: ["run", src, "serve", "--mcp"] };
|
|
17681
17681
|
if (which("npx"))
|
|
17682
17682
|
return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
|
|
17683
17683
|
if (which("bunx"))
|
|
17684
17684
|
return { command: "bunx", args: ["blitzstrike", "serve", "--mcp"] };
|
|
17685
|
-
const dist = join29(
|
|
17685
|
+
const dist = join29(ROOT11, "dist", "index.js");
|
|
17686
17686
|
if (existsSync17(dist))
|
|
17687
17687
|
return { command: "bun", args: [dist, "serve", "--mcp"] };
|
|
17688
17688
|
return { command: "npx", args: ["-y", "blitzstrike", "serve", "--mcp"] };
|
|
@@ -17722,7 +17722,7 @@ function opencodeWrite(p) {
|
|
|
17722
17722
|
};
|
|
17723
17723
|
}
|
|
17724
17724
|
function copyOpenCodeAgents() {
|
|
17725
|
-
const srcDir = join29(
|
|
17725
|
+
const srcDir = join29(ROOT11, "opencode-agents");
|
|
17726
17726
|
const dstDir = join29(homedir11(), ".config", "opencode", "agents");
|
|
17727
17727
|
if (!existsSync17(srcDir))
|
|
17728
17728
|
return;
|
|
@@ -17966,13 +17966,13 @@ Failed (${failedList.length}) — reason per tool:`);
|
|
|
17966
17966
|
Common causes: missing toolchain, pip/git network failures, or very heavy builds. ` + `Re-run after installing the missing toolchain — failed tools are skipped, not fatal.`);
|
|
17967
17967
|
}
|
|
17968
17968
|
}
|
|
17969
|
-
var
|
|
17969
|
+
var ROOT11;
|
|
17970
17970
|
var init_cli = __esm(() => {
|
|
17971
17971
|
init_catalog();
|
|
17972
17972
|
init_release();
|
|
17973
17973
|
init_dependency();
|
|
17974
17974
|
init_mcp_status();
|
|
17975
|
-
|
|
17975
|
+
ROOT11 = join29(fileURLToPath18(new URL(".", import.meta.url)), "..");
|
|
17976
17976
|
});
|
|
17977
17977
|
|
|
17978
17978
|
// node_modules/zod/v3/helpers/util.js
|
|
@@ -32695,7 +32695,7 @@ async function nvdLookup(cveId) {
|
|
|
32695
32695
|
init_scanner();
|
|
32696
32696
|
import { readFileSync as readFileSync11, existsSync as existsSync8, statSync as statSync2 } from "node:fs";
|
|
32697
32697
|
import { join as join13 } from "node:path";
|
|
32698
|
-
import { fileURLToPath as
|
|
32698
|
+
import { fileURLToPath as fileURLToPath7 } from "node:url";
|
|
32699
32699
|
|
|
32700
32700
|
// src/memory.ts
|
|
32701
32701
|
import { readFileSync as readFileSync2, appendFileSync, mkdirSync, existsSync, writeFileSync } from "node:fs";
|
|
@@ -36080,6 +36080,8 @@ import { execFileSync } from "node:child_process";
|
|
|
36080
36080
|
import { resolve4, Resolver } from "node:dns/promises";
|
|
36081
36081
|
import { readFileSync as readFileSync10 } from "node:fs";
|
|
36082
36082
|
import { join as join12 } from "node:path";
|
|
36083
|
+
import { fileURLToPath as fileURLToPath6 } from "node:url";
|
|
36084
|
+
var ROOT4 = join12(fileURLToPath6(new URL(".", import.meta.url)), "..");
|
|
36083
36085
|
var BLOCKING_KEYWORDS = /internet positif|kominfo|\.go\.id\b|pemblokiran|ditutup|dilarang|akses dibatasi|blocked|restricted|illegal|advertencia|coljuegos|regulat|forbidden|this (site|website) has been (blocked|banned)/i;
|
|
36084
36086
|
var HOSTNAME_RE = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?(\.[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?)*$/i;
|
|
36085
36087
|
function isValidHostname(host) {
|
|
@@ -36153,7 +36155,7 @@ async function resolveCheck(host) {
|
|
|
36153
36155
|
};
|
|
36154
36156
|
}
|
|
36155
36157
|
function loadWatchlist() {
|
|
36156
|
-
const raw = readFileSync10(join12(
|
|
36158
|
+
const raw = readFileSync10(join12(ROOT4, "intelligence", "watchlist.json"), "utf8");
|
|
36157
36159
|
const data = JSON.parse(raw);
|
|
36158
36160
|
return { cwe_frequency: data.cwe_frequency ?? [], cve_watchlist: data.cve_watchlist ?? [] };
|
|
36159
36161
|
}
|
|
@@ -36776,7 +36778,7 @@ function loadChains() {
|
|
|
36776
36778
|
if (_chainsCache)
|
|
36777
36779
|
return _chainsCache;
|
|
36778
36780
|
try {
|
|
36779
|
-
const dir = join13(
|
|
36781
|
+
const dir = join13(fileURLToPath7(new URL(".", import.meta.url)), "..");
|
|
36780
36782
|
const path = join13(dir, "chains.json");
|
|
36781
36783
|
const raw = JSON.parse(readFileSync11(path, "utf8"));
|
|
36782
36784
|
_chainsCache = raw.chains ?? [];
|
|
@@ -37559,7 +37561,7 @@ var CHAIN_ID_TO_ESCALATION = {
|
|
|
37559
37561
|
};
|
|
37560
37562
|
function loadChainLinks() {
|
|
37561
37563
|
try {
|
|
37562
|
-
const dir = join13(
|
|
37564
|
+
const dir = join13(fileURLToPath7(new URL(".", import.meta.url)), "..");
|
|
37563
37565
|
const data = JSON.parse(readFileSync11(join13(dir, "intelligence", "chain_links.json"), "utf8"));
|
|
37564
37566
|
return data.links ?? [];
|
|
37565
37567
|
} catch {
|
|
@@ -37718,9 +37720,9 @@ function compactState(phase, findings) {
|
|
|
37718
37720
|
// src/tasks.ts
|
|
37719
37721
|
import { mkdirSync as mkdirSync6, readFileSync as readFileSync12, writeFileSync as writeFileSync3 } from "node:fs";
|
|
37720
37722
|
import { join as join14 } from "node:path";
|
|
37721
|
-
import { fileURLToPath as
|
|
37723
|
+
import { fileURLToPath as fileURLToPath8 } from "node:url";
|
|
37722
37724
|
function tasksDir() {
|
|
37723
|
-
return join14(
|
|
37725
|
+
return join14(fileURLToPath8(new URL(".", import.meta.url)), "..", ".blitzstrike", "tasks");
|
|
37724
37726
|
}
|
|
37725
37727
|
function taskPath(id) {
|
|
37726
37728
|
return join14(tasksDir(), `${id}.json`);
|
|
@@ -58386,9 +58388,9 @@ function analyzePatchFiles(oldPath, newPath, language) {
|
|
|
58386
58388
|
// src/frameworks.ts
|
|
58387
58389
|
import { readFileSync as readFileSync18, existsSync as existsSync9 } from "node:fs";
|
|
58388
58390
|
import { join as join17 } from "node:path";
|
|
58389
|
-
import { fileURLToPath as
|
|
58390
|
-
var
|
|
58391
|
-
var INTEL2 = join17(
|
|
58391
|
+
import { fileURLToPath as fileURLToPath9 } from "node:url";
|
|
58392
|
+
var ROOT5 = join17(fileURLToPath9(new URL(".", import.meta.url)), "..");
|
|
58393
|
+
var INTEL2 = join17(ROOT5, "intelligence");
|
|
58392
58394
|
var cache = null;
|
|
58393
58395
|
function load3() {
|
|
58394
58396
|
if (cache)
|
|
@@ -59087,8 +59089,8 @@ async function validateLeakedKey(input) {
|
|
|
59087
59089
|
// src/hackbot-arena.ts
|
|
59088
59090
|
import { readFileSync as readFileSync19 } from "node:fs";
|
|
59089
59091
|
import { join as join19, dirname as dirname3 } from "node:path";
|
|
59090
|
-
import { fileURLToPath as
|
|
59091
|
-
var __dirname3 = dirname3(
|
|
59092
|
+
import { fileURLToPath as fileURLToPath10 } from "node:url";
|
|
59093
|
+
var __dirname3 = dirname3(fileURLToPath10(import.meta.url));
|
|
59092
59094
|
function load4() {
|
|
59093
59095
|
try {
|
|
59094
59096
|
return JSON.parse(readFileSync19(join19(__dirname3, "..", "intelligence", "hackbot-arena.json"), "utf8"));
|
|
@@ -59255,8 +59257,8 @@ function listSeverityMap() {
|
|
|
59255
59257
|
// src/datarefresh.ts
|
|
59256
59258
|
import { readFileSync as readFileSync20 } from "node:fs";
|
|
59257
59259
|
import { join as join20, dirname as dirname4 } from "node:path";
|
|
59258
|
-
import { fileURLToPath as
|
|
59259
|
-
var __dirname4 = dirname4(
|
|
59260
|
+
import { fileURLToPath as fileURLToPath11 } from "node:url";
|
|
59261
|
+
var __dirname4 = dirname4(fileURLToPath11(import.meta.url));
|
|
59260
59262
|
function loadJson2(rel) {
|
|
59261
59263
|
try {
|
|
59262
59264
|
return JSON.parse(readFileSync20(join20(__dirname4, "..", rel), "utf8"));
|
|
@@ -59296,11 +59298,11 @@ init_variants();
|
|
|
59296
59298
|
// src/benchmark.ts
|
|
59297
59299
|
import { readFileSync as readFileSync22, readdirSync as readdirSync5, writeFileSync as writeFileSync6, rmSync as rmSync3, mkdirSync as mkdirSync7 } from "node:fs";
|
|
59298
59300
|
import { join as join22 } from "node:path";
|
|
59299
|
-
import { fileURLToPath as
|
|
59301
|
+
import { fileURLToPath as fileURLToPath13 } from "node:url";
|
|
59300
59302
|
import { tmpdir as tmpdir3, homedir as homedir8 } from "node:os";
|
|
59301
59303
|
init_complex_bugs();
|
|
59302
|
-
var
|
|
59303
|
-
var CORPUS = join22(
|
|
59304
|
+
var ROOT6 = join22(fileURLToPath13(new URL(".", import.meta.url)), "..");
|
|
59305
|
+
var CORPUS = join22(ROOT6, "bench", "corpus");
|
|
59304
59306
|
var CAPTURED_CORPUS_DIR = process.env.BLITZSTRIKE_CORPUS_DIR ?? join22(homedir8(), ".blitzstrike", "corpus");
|
|
59305
59307
|
function parseCorpusFile(path) {
|
|
59306
59308
|
let text;
|
|
@@ -61607,15 +61609,16 @@ solc = "0.8.20"
|
|
|
61607
61609
|
// src/enterprise-benchmark.ts
|
|
61608
61610
|
import { existsSync as existsSync15, readFileSync as readFileSync26, readdirSync as readdirSync6, statSync as statSync3 } from "node:fs";
|
|
61609
61611
|
import { join as join25, resolve } from "node:path";
|
|
61612
|
+
import { fileURLToPath as fileURLToPath14 } from "node:url";
|
|
61610
61613
|
init_complex_bugs();
|
|
61611
|
-
var
|
|
61614
|
+
var ROOT7 = resolve(fileURLToPath14(new URL(".", import.meta.url)), "..", "bench", "enterprise");
|
|
61612
61615
|
var ENTERPRISE_FIXTURES = [
|
|
61613
|
-
{ id: "php-laravel", dir: join25(
|
|
61614
|
-
{ id: "js-express", dir: join25(
|
|
61615
|
-
{ id: "py-django", dir: join25(
|
|
61616
|
-
{ id: "java-spring", dir: join25(
|
|
61617
|
-
{ id: "wp-batch-route", dir: join25(
|
|
61618
|
-
{ id: "php-complex", dir: join25(
|
|
61616
|
+
{ id: "php-laravel", dir: join25(ROOT7, "php-laravel"), expected_vulns: 4 },
|
|
61617
|
+
{ id: "js-express", dir: join25(ROOT7, "js-express"), expected_vulns: 2 },
|
|
61618
|
+
{ id: "py-django", dir: join25(ROOT7, "py-django"), expected_vulns: 2 },
|
|
61619
|
+
{ id: "java-spring", dir: join25(ROOT7, "java-spring"), expected_vulns: 2 },
|
|
61620
|
+
{ id: "wp-batch-route", dir: join25(ROOT7, "wp-batch-route"), expected_vulns: 3 },
|
|
61621
|
+
{ id: "php-complex", dir: join25(ROOT7, "php-complex"), expected_vulns: 4 }
|
|
61619
61622
|
];
|
|
61620
61623
|
function sourceFiles(root) {
|
|
61621
61624
|
const out = [];
|
|
@@ -63040,7 +63043,7 @@ ${statusLine}` : statusLine },
|
|
|
63040
63043
|
});
|
|
63041
63044
|
server.registerTool("technique_lookup", {
|
|
63042
63045
|
title: "Detailed bug-hunting technique base",
|
|
63043
|
-
description: "INTEL: return the DETAILED methodology + tricks for one vulnerability class (
|
|
63046
|
+
description: "INTEL: return the DETAILED methodology + tricks for one vulnerability class (56 classes: ssrf, request smuggling, cache poisoning, race conditions, ssti, deserialization, prototype pollution, mass assignment, sql/nosql injection, xss, cors, csrf, jwt, oauth, host header, open redirect, subdomain takeover, broken link hijacking, dns rebinding, padding oracle, idor, graphql, websocket, file upload, path traversal/LFI, command injection, xxe, crlf, ldap, xpath, xslt, ssi, xssi, email, formula/CSV, orm, rsql, unicode, dangling markup, account takeover, 2fa bypass, rate-limit, password reset, captcha, registration, payment bypass, timing, uuid, reverse tabnabbing, iframe traps, cookies, postMessage, ...). Each returns summary, objectives, how_to_test steps, concrete techniques, and verify (marker + negative control). Load before testing a class to hunt it in detail.",
|
|
63044
63047
|
inputSchema: {
|
|
63045
63048
|
cls: string2().optional().describe("Optional class id or name (e.g. 'ssrf', 'request smuggling', 'ssti').")
|
|
63046
63049
|
}
|
|
@@ -63857,11 +63860,11 @@ async function serve() {
|
|
|
63857
63860
|
init_cli();
|
|
63858
63861
|
import { readFileSync as readFileSync32, existsSync as existsSync18 } from "node:fs";
|
|
63859
63862
|
import { join as join30 } from "node:path";
|
|
63860
|
-
import { fileURLToPath as
|
|
63861
|
-
var
|
|
63863
|
+
import { fileURLToPath as fileURLToPath19 } from "node:url";
|
|
63864
|
+
var ROOT12 = join30(fileURLToPath19(new URL(".", import.meta.url)), "..");
|
|
63862
63865
|
function readVersion() {
|
|
63863
63866
|
try {
|
|
63864
|
-
const p = join30(
|
|
63867
|
+
const p = join30(ROOT12, "package.json");
|
|
63865
63868
|
if (existsSync18(p))
|
|
63866
63869
|
return JSON.parse(readFileSync32(p, "utf8")).version ?? "1.0.0";
|
|
63867
63870
|
} catch {}
|