Commit Graph
98 Commits
Author SHA1 Message Date
c4ch3c4d3 88d7141d45 feat(deauth,evilportal,capture): bulk deauth UX, Hak5-compatible Evil Portal, monitor capture fixes
- Recon AP focus sidebar: 'Deauth All Clients' with engagement-scope confirm
- Deauth Targeting card: 'Deauth All' behind the same scope confirmation
- New POST /api/attacks/deauth/bulk (max 32 targets, per-target results)
- Evil Portal tab: import EvilPortalNano-format portal zips into
  /mmc/mk8/portals, serve active portal on port 80 to unauthenticated
  clients via a minimal PHP shim, capture all form POSTs (.logs in stock
  MyPortal.php format + captures.jsonl), dnsmasq address=/#/ DNS hijack
- OpenAP: Evil Portal template dropdown (greyed when none), activated with
  the attack and stopped with it
- Monitor Capture fix: iface-less status now reports whichever monitor is
  actually capturing; pcap dir mkdir'd; tcpdump stderr surfaced instead of
  discarded
2026-08-23 19:50:41 -06:00
c4ch3c4d3 ed50cd7b5a fix(enterprise,deauth,filters): PineAP validation round fixes, live-verified on Pager 24.10.1
- deauth/kick: use full PINEAPPLE_DEAUTH_CLIENT hak5cmd app name (BUG 1)
- _allow_all_ssids: PINEAPPLE_NETWORK_FILTER_MODE deny so karma lets
  clients associate after deploy (BUG 2)
- enterprise inner EAP (BUG 3), two root causes found by live experiment:
  - hostapd never wildcard-matches a bare `*` identity for phase-2
    lookups; eap_users now uses quoted empty prefix `""* ... [2]`,
    which prefix-matches any inner identity
  - pineape_auth_pass=1 forwards inner EAP to pineapd, which has no
    standalone responder; deploy forces 0 and stop restores 1
  Residual: plaintext MSCHAPv2 capture is firmware-blocked on 24.10.1
  (MSG_DEBUG compiled out of the karma wpad; `-f` silently ignored);
  documented in code comments and the validation report.
- ISSUE 4: point pineapd.@hostapd[0].mgmtiface at wlan1wpa during 5 GHz
  WPA deploys so handshakes/loot populate; cleared on stop
- ISSUE 5: radio0 set_ap path polls 90 s across the wifi-reload window
  and retries set_ap once if the iface still has not appeared
- ISSUE 6: skills docs use `llc && eth.type == 0x888e` (firmware tcpdump
  matches 0 frames on `eapol`)
- ISSUE 7: capture state helper detects dead-pid / iface-down, cleans up,
  status reports {running:false, stale:true} instead of zombie running
- tests: fix global os.path monkeypatch leaks between test modules that
  broke test_mk8_events/test_reliability_api under discovery; add
  regression coverage for all fixes above (463 tests green)

Live validation evidence and newly discovered firmware quirks
(DEVICE_FILTER_DELETE no-op, dropbear rate limiting) recorded in
docs/validation/2026-08-23-pineap-validation-report.md.
2026-08-23 18:29:47 -06:00
bzuccaro a04319dfc8 feat(webui,recon): drop PineAP mode card, sort recon report APs by signal
- Remove the Passive/Active/Advanced mode card from the PineAP dashboard
  and move the RF Role (radio1) card into its slot, along with the now
  dead mode state machinery and mode-card-only CSS.
- Sort recon HTML report access points by signal strength (strongest first).
2026-08-23 09:29:10 -06:00
bzuccaro 2ef07a28fc feat(reliability): PSK uplink security-mode fallback chain (sae-mixed/sae/psk2 with PMF) 2026-08-23 08:19:20 -06:00
bzuccaro 501fa455ce fix(reliability): resolve STA netdev by phy membership (netifd ignores ifname); sae-mixed for PSK uplinks 2026-08-22 20:37:11 -06:00
bzuccaro 132cf4d77a fix(reliability): explicit hop baseline restore, immune to stale pager snapshot 2026-08-22 19:37:57 -06:00
bzuccaro 712d381093 fix(reliability): supervisor restores hop baseline unless a role holds the pause 2026-08-22 19:31:15 -06:00
bzuccaro 107cf17611 fix(ui): sync role select to live role; mark RF chip unavailable on poll failure 2026-08-22 19:26:39 -06:00
bzuccaro 6b84665347 fix(deploy): no dangling symlink on first-deploy failure, deadline-capped health poll, release pruning, honest commit rc 2026-08-22 19:18:42 -06:00
bzuccaro 55d4beb9d4 fix(reliability): probe section existence via uci show, not an option key 2026-08-22 18:59:57 -06:00
bzuccaro 1133068a09 fix(reliability): recreate missing pineapd section; honest uci-set reporting 2026-08-22 18:45:44 -06:00
bzuccaro 23ca901e82 feat(reliability): supervisor continuously enforces known-good UCI set 2026-08-22 18:37:22 -06:00
bzuccaro b9a64c6560 fix(reliability): supervisor re-parks stock-resurrected dummy STA on interval 2026-08-22 18:31:06 -06:00
bzuccaro 5625310977 fix(reliability): converge runtime after profile restore (park dummy STA, re-raise monitors) 2026-08-22 18:26:21 -06:00
bzuccaro 60db235f0b fix(reliability): converge runtime on uplink revert; bound health endpoint cost (I3,I4) 2026-08-22 16:52:29 -06:00
bzuccaro b25c98b7c7 fix(reliability): hop governance belongs to rfplan, not boot reconciler (I2) 2026-08-22 16:51:52 -06:00
bzuccaro ba3e1b1ae0 fix(reliability): clear boot marker on graceful shutdown (I1) 2026-08-22 16:51:33 -06:00
bzuccaro 027646c905 fix(reliability): pool size counts any whitespace; deploy ZIP var remote-expands 2026-08-22 16:23:50 -06:00
bzuccaro eae47d99bf fix(reliability): encode str stdin in device_run; smoke drill path fixes + regression tests 2026-08-22 16:23:50 -06:00
bzuccaro 63528ff794 fix(deploy): unauth health poll, validate-before-gate, fullmatch names, reload-only-on-ok 2026-08-22 15:41:37 -06:00
bzuccaro 1bb15de258 feat(deploy): reliability API routes, atomic releases, version single-source 2026-08-22 15:20:39 -06:00
bzuccaro aba08e36c7 fix(ui): guard chip shows pending count, not raw list 2026-08-22 15:03:15 -06:00
bzuccaro 4c1144ab32 feat(ui): reliability panel events/counters, RF plan chip and controls 2026-08-22 14:55:49 -06:00
bzuccaro bace45d6e4 fix(reliability): rfplan review fixes — cli commit, assoc poll, ensure_attack wiring, idle reload 2026-08-22 14:35:12 -06:00
bzuccaro 15cd3c5eb8 feat(reliability): phy1 RF role manager with uplink-on-radio1 2026-08-22 14:20:05 -06:00
bzuccaro 78aab64af0 fix(reliability): watchdog max lifetime + serialized gate entry (review fixes) 2026-08-22 14:08:25 -06:00
bzuccaro a008bb9167 feat(reliability): risky-op preflight snapshots + detached rollback watchdog 2026-08-22 13:56:25 -06:00
bzuccaro 7a27218149 feat(reliability): supervisor sampling, event feed, boot marker 2026-08-22 13:41:49 -06:00
bzuccaro 7d1eb62d75 feat(reliability): START=49 boot guard installed by deploy 2026-08-22 13:26:09 -06:00
bzuccaro a05754f908 feat(reliability): boot-time UCI reconciler 2026-08-22 13:12:14 -06:00
bzuccaro 88e6471820 feat(reliability): UCI profile snapshot store 2026-08-22 13:00:59 -06:00
bzuccaro 1d17704f72 fix(reliability): journal fail-safe serialization, per-line parse, review hardening 2026-08-22 12:51:22 -06:00
bzuccaro 496f7c58e3 feat(reliability): JSONL event journal with rotation and counters 2026-08-22 12:39:19 -06:00
bzuccaro 86d26d8457 fix: show BSSID and sources in recon association tooltip 2026-08-21 08:46:19 -05:00
bzuccaro cd54402892 feat: show recon client identities and associations 2026-08-21 08:40:25 -05:00
bzuccaro 21e308386f feat: include recon identity in exports 2026-08-21 08:31:47 -05:00
bzuccaro a67faecee9 feat: associate recon clients with confirmed networks 2026-08-21 08:26:58 -05:00
bzuccaro 2c9fa8d137 fix: use live macchanger OUI path 2026-08-21 08:20:09 -05:00
bzuccaro 797db1816a feat: resolve recon device manufacturers locally 2026-08-21 08:15:21 -05:00
bzuccaroandCursor 7d48b7ad06 fix: harden UI actions and daemon calls for reliable control (v1.3.2)
Retry and serialize pineapd/hak5 calls, queue virtual-pager keys, and grey out buttons until the pager finishes. Deploy now installs python3-light after factory firmware. Bump version to 1.3.2.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-20 15:49:10 -05:00
bzuccaroandfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com> cd26553d21 fix: non-disruptive startup checks + clean service lifecycle (v1.3.1)
- Env check is read-only when state is sane: no pineapd command-socket
  writes, no live pool-list commits, no wifi reload; pineapd restarts only
  when a runtime-sensitive UCI value changed or the daemon was down
- Failed monitor repairs now fail the startup contract instead of being
  reported as fixed; runtime pool state is read from active config
- Enterprise AP recovery runs only on device boot (PAGER_WEBUI_BOOT), not
  on every web-service restart
- serve() gates the HTTP port on startup checks with bounded retries and
  shuts down cleanly on SIGTERM/SIGINT; the recon watchdog waits
  interruptibly
- Recon uses a bounded userspace channel scheduler that drives both
  monitor radios over non-DFS channels, with preflight verification,
  serialized starts, and per-cycle error reporting
- payload.sh waits for real readiness on start, fully removes the boot
  service (stop + disable + delete) on stop, and surfaces a
  stopped-but-enabled boot service; deploy.sh refreshes the installed
  init script even when the service is stopped
- Bump version to 1.3.1

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-19 12:03:11 -05:00
bzuccaro 6e3968c19a fix: non-disruptive env check — drop wifi reload + misleading hop warning
- STA uplink disable now uses uci commit + ip link set wlan0 down instead of
  wifi reload, so the env check never bounces radios/APs/drops monitors
- Removed the wlan0mon 'hop is off' warning: field-verified hop=0 is normal
  (wlan1mon also reports 0 while scanning both bands); the STA/AP pinning
  checks are the real signals
- recon/status drops wlan0_hopping; UI keeps wlan0_sta + wlan0_pinned pills
2026-08-19 10:55:26 -05:00
bzuccaro 5a72566381 feat: env check auto-disables dummy_radio0 STA (2.4GHz recon root cause)
The stock STA client interface (wlan0) holds phy0's channel, pinning wlan0mon
so 2.4GHz recon captures nothing (verified: iw set channel -> Resource busy
until wlan0 is down). env_check now disables it (uci wireless.dummy_radio0
disabled=1 + wifi reload) at startup and /api/recon/status exposes wlan0_sta
so the recon page can warn if it regresses.
2026-08-19 10:42:26 -05:00
bzuccaro 5eb81b90f1 fix: recon env-check verifies runtime wlan0mon hopping (2.4GHz starvation)
The band UCI config looked correct but pineapd was not hopping wlan0mon at
runtime, so 2.4GHz recon results were entirely absent. env_check now parses
_pineap INTERFACE LIST and warns when wlan0mon hop is off; /api/recon/status
exposes wlan0_hopping and the recon scan bar surfaces it.
2026-08-19 10:29:50 -05:00
bzuccaro 904843307e feat: startup environment check + self-heal (v1.3)
- env_check(): verifies daemon/pineapd/UCI/monitors/recon DB, auto-fixes
  fixable issues and re-verifies; forces runtime SSID-pool broadcast off to
  match the UI (kills the 'pool on but UI shows off' gap)
- server.py --env-check CLI; payload.sh runs it verbosely before starting,
  aborts on core failure
- serve() runs the check at every startup (boot + procd respawn)
- /api/health exposes env report + pool_runtime; /api/recon/status exposes
  wlan0_pinned (2.4GHz under-sampling warning); recon page warns when a
  radio0 AP pins wlan0mon
- recon start failures now include the daemon reason in the UI error
- shared stabilization refactor (_stabilize_uci/PINEAPD_SAFE_UCI/_raise_monitors)
- tests: test_env_check.py (18) + health/recon updates
2026-08-19 10:25:02 -05:00
bzuccaro 52f9f6ecd5 chore: bump version to 1.2; scrub personal details from docs
- Version 1.1 -> 1.2 in the hak5 manifest and MCP serverInfo.
- Removed leaked personal details from process docs: device root password,
  the user's personal iPhone SSID (authorized-test target), the local
  /Users/... checkout path, and the device IP where it appeared alongside
  the password. Replaced with <device-password>, <authorized-test-ssid>,
  <repo>, and <device-ip> placeholders.
2026-08-19 08:21:28 -05:00
bzuccaro 32282af1d8 ui: wireless landscape card — ring + legend, fix handshake toggle wrap
- Landscape card mirrors Encryption: headline text removed; square 112px
  ring (drawn height 112, CSS fixed square, no more ellipse) + HTML legend
  (dot + label + count) for Access Points / Clients / Unassociated. The
  canvas previously had no legend and the '90' headline never matched the
  dominant arc; the legend makes every count visible and labeled.
- Legend markup generalized: .recon-enc-* -> .recon-chart-* shared by both
  cards; shared chartLegendEntry() builder; landscape skips zero slices.
- .recon-toggle now flex-wraps (was overflowing 'Auto-collect handshakes'
  past the card edge at narrow widths; card min-width inner is ~142px vs a
  233px label).

Verified on device via CDP at 1200px and 860px viewports: landscape ring
112x112 square with Access Points 92 / Clients 291 / Unassociated 760;
encryption card intact; toggle label stays inside the 184px card (wraps to
2 lines, no card overflow); zero JS exceptions.
2026-08-19 08:07:46 -05:00
bzuccaro 6927baf51f fix: encryption ring renders as a true circle, not a squashed ellipse
The enc canvas was drawn at 233x120 internally but .recon-chart-box canvas
forced width:100%/height:100% onto a ~233x115 box, scaling the bitmap and
flattening the ring. #recon-encryption is now a static 112px square with the
doughnut drawn at height 112, so internal and CSS pixels match (1:1) and the
circle stays circular. Verified on device: box and bitmap both 112x112,
card fits without overflow, legend intact, no JS exceptions.
2026-08-19 07:34:09 -05:00
bzuccaro 8befe45de5 fix: encryption landscape card — real family buckets + legend id
- Ring and legend now derive from reconEncBucket's actual family keys
  (WPA2-PSK, WPA3-Personal, WPA2-Enterprise, ...) instead of the six
  nominal buckets that never matched encCounts, so the ring drew an
  empty ring and the legend was always blank on WPA2-dominated data.
  Ordering via RECON_ENC_ORDER; colors cycle RECON_ENC_COLORS.
- Legend div had class but no id while drawCharts looked it up with
  getElementById — the population block silently never ran. Added the id.

Verified on device via CDP: legend lists Open 9, WEP 1, WPA2-PSK 44,
WPA3-Personal 20, WPA3-Enterprise 5 with per-family dot colors; no JS
exceptions.
2026-08-19 07:24:00 -05:00
bzuccaro 53e995d5a7 ui: encryption landscape card — ring + HTML legend with counts 2026-08-19 06:53:35 -05:00