blitzstrike 2.4.73 → 2.4.74

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 CHANGED
@@ -5,6 +5,21 @@ 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.74] — 2026-09-17
9
+
10
+ ### Fixed — live_recon tech fingerprint false-positive (benchmark-driven)
11
+
12
+ - Tech detection now uses header + cookie signals FIRST (authoritative), then
13
+ body regex as fallback, via a new `detectTech(headers, body)`:
14
+ - `x-powered-by: Express` / `connect.sid` cookie → nodejs (was missed).
15
+ - `laravel_session` / `XSRF-TOKEN` cookie → laravel.
16
+ - `PHPSESSID` → php, `csrftoken`+`sessionid` → django, `rack.session` → rails.
17
+ - Removed the over-broad `_token` / `csrf-token` → laravel body signature (those
18
+ are generic CSRF tokens, present in Node/Express apps too) — this caused the
19
+ Hackbot Arena labs03 (Node/Express) to be mis-flagged as "laravel".
20
+ - `gunicorn` no longer implies "flask" (it's a generic WSGI server shared by
21
+ Flask/Django/FastAPI); only `werkzeug` maps to flask.
22
+
8
23
  ## [2.4.73] — 2026-09-17
9
24
 
10
25
  ### Changed — crack_hash wordlist support (benchmark-driven fix)
package/dist/index.js CHANGED
@@ -35884,6 +35884,59 @@ function extractVersion(headers, body) {
35884
35884
  }
35885
35885
  return out;
35886
35886
  }
35887
+ function detectTech(headers, body) {
35888
+ const techs = new Set;
35889
+ const low = (s) => (s ?? "").toLowerCase();
35890
+ const powered = low(headers["x-powered-by"]);
35891
+ const server = low(headers["server"]);
35892
+ const cookies = low(headers["set-cookie"]);
35893
+ const generator = low(headers["x-generator"]);
35894
+ if (/express|node\b|nodejs/i.test(powered))
35895
+ techs.add("nodejs");
35896
+ if (/^php\b|^php\//i.test(powered))
35897
+ techs.add("php");
35898
+ if (/asp\.net/i.test(powered) || (headers["x-aspnet-version"] ?? ""))
35899
+ techs.add("aspnet");
35900
+ if (/werkzeug/i.test(server))
35901
+ techs.add("flask");
35902
+ if (/drupal/i.test(generator))
35903
+ techs.add("drupal");
35904
+ if (/laravel_session|xsrf-token/i.test(cookies))
35905
+ techs.add("laravel");
35906
+ if (/phpsessid/i.test(cookies))
35907
+ techs.add("php");
35908
+ if (/connect\.sid/i.test(cookies))
35909
+ techs.add("nodejs");
35910
+ if (/csrftoken/i.test(cookies) && /sessionid/i.test(cookies))
35911
+ techs.add("django");
35912
+ if (/rack\.session/i.test(cookies))
35913
+ techs.add("rails");
35914
+ const bodySig = [
35915
+ [/wp-content|wp-includes|wp-json/i, "wordpress"],
35916
+ [/wp-login\.php|wp-admin/i, "wordpress"],
35917
+ [/powered by joomla|com_content/i, "joomla"],
35918
+ [/laravel_session|xsrf-token|\blaravel\b/i, "laravel"],
35919
+ [/react|__NEXT_DATA__|next\/static/i, "nextjs"],
35920
+ [/angular|ng-version/i, "angular"],
35921
+ [/vue|__vue__|v-data/i, "vue"],
35922
+ [/django|csrftoken|__debug__/i, "django"],
35923
+ [/ruby on rails|rails/i, "rails"],
35924
+ [/asp\.net|__VIEWSTATE|__EVENTVALIDATION/i, "aspnet"],
35925
+ [/phpBB|phpbb/i, "phpbb"],
35926
+ [/mybb|mybb/i, "mybb"],
35927
+ [/drupal|Drupal\.settings/i, "drupal"],
35928
+ [/magento|Mage\./i, "magento"],
35929
+ [/shopify|cdn\.shopify/i, "shopify"],
35930
+ [/grafana|kibana|elastic/i, "grafana-kibana"],
35931
+ [/node\.js|express/i, "nodejs"],
35932
+ [/flask|werkzeug/i, "flask"],
35933
+ [/spring|actuator/i, "spring"]
35934
+ ];
35935
+ for (const [re, t] of bodySig)
35936
+ if (re.test(body))
35937
+ techs.add(t);
35938
+ return [...techs];
35939
+ }
35887
35940
  function correlateIntel(techs, versionList, portList) {
35888
35941
  const tech = techs.map((t) => ({ tech: t, ...techCorrelation(t) }));
35889
35942
  const versions = versionList.map((v) => ({
@@ -35919,28 +35972,7 @@ async function liveRecon(target, includeActive = false) {
35919
35972
  body_size: root.body.length
35920
35973
  };
35921
35974
  const waf = detectWaf(root.headers, root.body);
35922
- const techSig = [
35923
- [/wp-content|wp-includes|wp-json/i, "wordpress"],
35924
- [/wp-login\.php|wp-admin/i, "wordpress"],
35925
- [/powered by joomla|com_content/i, "joomla"],
35926
- [/laravel|_token|csrf-token/i, "laravel"],
35927
- [/react|__NEXT_DATA__|next\/static/i, "nextjs"],
35928
- [/angular|ng-version/i, "angular"],
35929
- [/vue|__vue__|v-data/i, "vue"],
35930
- [/django|csrftoken|__debug__/i, "django"],
35931
- [/ruby on rails|rails/i, "rails"],
35932
- [/asp\.net|__VIEWSTATE|__EVENTVALIDATION/i, "aspnet"],
35933
- [/phpBB|phpbb/i, "phpbb"],
35934
- [/mybb|mybb/i, "mybb"],
35935
- [/drupal|Drupal\.settings/i, "drupal"],
35936
- [/magento|Mage\./i, "magento"],
35937
- [/shopify|cdn\.shopify/i, "shopify"],
35938
- [/grafana|kibana|elastic/i, "grafana-kibana"],
35939
- [/node\.js|express/i, "nodejs"],
35940
- [/flask|werkzeug/i, "flask"],
35941
- [/spring|actuator/i, "spring"]
35942
- ];
35943
- const techs = [...new Set(techSig.filter(([re]) => re.test(root.body)).map(([, t]) => t))];
35975
+ const techs = detectTech(root.headers, root.body);
35944
35976
  const versions = extractVersion(root.headers, root.body);
35945
35977
  const { links, scripts } = crawlLinks(base, root.body);
35946
35978
  const { robots, sitemap } = await fetchRobotsAndSitemap(base);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blitzstrike",
3
- "version": "2.4.73",
3
+ "version": "2.4.74",
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": {