Skip to content
Strike48-publicPublic

About

Pick is a lightweight, headless penetration testing agent built with Dioxus, providing network reconnaissance, device discovery, and remote tool execution capabilities.

Resources

Code of conduct

Contributing

Security policy

Stars

33 stars

Watchers

2 watching

Forks

Latest commit

 

History

1,094 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Pick

A multiplatform penetration testing connector built with Dioxus and integrated with the Strike48 Connector SDK.

Pick connects Strike48 to local penetration testing tools, executing them securely on the machine where it runs.

Architecture

Each app IS a connector - it registers with Strike48 and executes tools locally on the machine where it runs:

┌─────────────────────────────────────────────────────────────────┐
│                     Strike48 Backend                             │
│                   (Routes tool requests)                        │
└───────┬─────────────────┬─────────────────┬─────────────────┬───┘
        │                 │                 │                 │
        ▼                 ▼                 ▼                 ▼
┌───────────────┐ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│   Desktop     │ │     Web       │ │    Mobile     │ │   Headless    │
│  (dioxus-     │ │  (dioxus-     │ │  (dioxus-     │ │  (dioxus-     │
│   desktop)    │ │   liveview)   │ │   mobile)     │ │   liveview)   │
├───────────────┤ ├───────────────┤ ├───────────────┤ ├───────────────┤
│ UI + Tools    │ │ UI + Tools    │ │ UI + Tools    │ │ Tools only    │
│ run locally   │ │ run on server │ │ run on device │ │ no local UI   │
└───────────────┘ └───────────────┘ └───────────────┘ └───────────────┘

Platforms

Platform Technology Tools Execute On
Headless dioxus-liveview + axum Server / StrikeHub IPC
Desktop dioxus-desktop Local machine
Web dioxus-liveview + axum Server hosting the app
Android dioxus-mobile Android device
iOS dioxus-mobile iOS device

Install

Features

UI Customization

  • 8 Built-in Themes: Dark, Light, Dracula, Gruvbox, Tokyo Night, Matrix, Cyberpunk, Nord
  • Custom Themes: Import your own CSS themes with security validation
  • Keyboard Shortcuts: Ctrl+Shift+1-8 for instant theme switching
  • Shape Customization: 5 border radius options (Sharp to Pill)
  • Density Control: Compact, Normal, or Comfortable spacing
  • Smooth Transitions: Animated theme changes with 300ms easing
  • Easter Eggs: Konami code (↑↑↓↓←→←→BA) activates Matrix rain animation

See docs/UI_FEATURES.md for complete customization guide.

Penetration Testing Tools

Pick integrates 100+ penetration testing tools across multiple categories:

Native Tools (24):

  • Network scanning (port_scan, arp_table, ssdp_discover, network_discover)
  • WiFi testing (wifi_scan, wifi_scan_detailed, autopwn suite)
  • Web vulnerability scanning
  • Credential testing and harvesting
  • Evidence collection (screenshot, traffic_capture)
  • System enumeration and command execution

External Tool Integrations (70+):

  • Network: nmap, masscan, rustscan, unicornscan
  • Web: nikto, sqlmap, nuclei, ffuf, feroxbuster, gobuster
  • WiFi: aircrack-ng, bettercap, responder
  • Enumeration: subfinder, amass, enum4linux, smbmap
  • Exploitation: hydra, john, hashcat, crackmapexec
  • And many more...

See docs/TOOLS.md for the complete tool catalog.

Three-Agent Validation Pipeline

Evidence quality assurance through specialized agents:

  • Red Team Agent - Tool execution and evidence generation
  • Validator Agent - Quality verification and validation
  • Report Agent - Finding synthesis and reporting

Why Agent Hardening (Attacks & Aislop)

Autonomous agents that execute attacker-influenced content need defense against two failure modes: attacks (adversarial content hijacking the agent) and aislop (AI-generated noise and decoys that grind an agent down, burning tokens on dead ends until it gets stuck in the mud).

We borrowed the defensive playbook from honeyslop: self-identifying markers that make forged output instantly triageable, layered defense-in-depth, provenance consistency checks, bounded iteration budgets, and a CI "doctor" that re-verifies every control on every PR. Pick adopts that playbook incrementally: each control below is marked shipped or planned, and the CI doctor (C4) is not shipped yet.

In short: agent output must be triageable, agent context must be sanitized, agent work must be budgeted, and agent controls must be CI-verified.

  • C1: Seed-channel fail-closed sanitization - neutralize injection before Validator/Report seeds (shipped in v0.1.11)
  • C2: Injection-flag publish gate - findings flagged for injected-instruction markers at ingestion are refused at the report boundary; webwright severity hygiene (explicit info stays Info, unlabeled descends to Low, same-title duplicates merge) (provenance-consistency checking is planned, not shipped)
  • C3: Session budget envelope + stall detector - per-engagement tool-spend cap with a wind-down refusal, advisory stall detection, and a bounded begin_scan reset so an agent cannot restart its own envelope (advisory only - the stall detector warns, it does not yet kill dead-end loops)
  • C4: Doctor-style CI validator - re-verify every control on every PR (planned; tracked in pick#453, not shipped in v0.1.11)
  • C5: Canary markers + triage gate - per-engagement nonces make forged output self-identify (planned)
  • C6-C8: Handoff hygiene, target scope fence, persona distrust boundary (P1)
  • C9-C10: Marker rotation, evidence flood control + loop breaker (P2)

Full rationale, the attack-surface analysis behind these choices, and the trade-off decisions are in docs/AGENT_HARDENING_REVIEW.md.

Recent Features

  • Android Root Detection (PR #123) - Detect rooted Android devices
  • Agent ERROR Status Detection (PR #134) - Surface token limit notices
  • Strike48 Default Theme (PR #120) - Professional default theme
  • Chat Panel Routing (PR #132) - Fixed LiveView event handling

Project Structure

pick/
├── crates/
│   ├── core/          # Core types, state management, SDK integration
│   ├── platform/      # Platform abstraction (desktop, android, ios)
│   ├── ui/            # Shared Dioxus UI components + LiveView server
│   └── tools/         # Tool implementations
├── apps/
│   ├── headless/      # Headless agent (pentest-agent binary)
│   ├── desktop/       # Desktop app (dioxus-desktop)
│   ├── web/           # Web app (dioxus-liveview + axum)
│   └── mobile/        # Mobile app (dioxus-mobile)

Building

Prerequisites

  • Rust 1.92+ (with cargo)
  • For desktop: Native development tools for your OS
  • For mobile: cargo-mobile2 and platform SDKs
  • Linux builds target glibc >= 2.35 (Ubuntu 22.04 / Debian 12+).

Linux runtime requirements (release binaries)

The Linux release tarballs are self-contained for their shared-library dependencies: every shared library a binary links other than the desktop's webkit stack is bundled inside the tarball under lib/ and resolved through an $ORIGIN/lib rpath baked into the binaries at link time. That includes the transitive closure of each bundled library, not just the direct links — libpcap (agent, web, desktop), OpenSSL 3 (libssl/libcrypto; agent, web, desktop), libxcb (agent, web, desktop) and libxdo (desktop) drag along the libdbus → libsystemd → lzma/zstd/lz4/gcrypt/gpg-error/cap stack and libXau/libXdmcp → libbsd/libmd. The closure is the difference between "resolves on the release runner" and "resolves on NixOS or in a minimal container". The release pipeline enforces this with scripts/check-linux-deps.sh (every ldd resolution must land in lib/ or be a base-system/allowed library, whole-entry rpath present, glibc floor held). What a host must still provide:

Requirement Applies to Where it comes from
glibc >= 2.35 (Ubuntu 22.04 / Debian 12+) plus the libgcc runtime All Linux binaries Host base system (floor enforced by scripts/check-glibc-floor.sh)
libwebkit2gtk-4.1-0 and its package dependencies Desktop app only — the web engine behind the UI plus the GTK/X11 stack it pulls (libgtk-3, libX11, …); intentionally not bundled (50MB+ with helper processes) sudo apt install libwebkit2gtk-4.1-0 (Fedora: sudo dnf install webkit2gtk4.1) — one package pulls the whole closure
everything else — Bundled in the tarball's lib/ (the desktop's X11 libraries are carried by the libwebkit2gtk-4.1-0 closure, so no second copy is bundled — except libXtst, which libxdo needs but the closure does not ship, so it is bundled)

License attribution for the redistributed libraries (BSD-3-clause, Apache-2.0/OpenSSL dual, MIT/X11) ships inside each Linux tarball as THIRD-PARTY-NOTICES.md.

The headless agent (pick-agent-linux-x86_64.tar.gz) has no host library dependencies beyond the glibc/libgcc base system — the binary and the bundled lib/ are enough on any glibc-2.35+ host, including NixOS and minimal containers. One caveat for consumers: StrikeHub's fetch path currently stages only the binary and drops the sibling lib/, so a strikehub-fetched agent is still affected on minimal hosts until Strike48-public/strikehub#108 lands; extract the tarball directly in the meantime.

The desktop tarball's entry point is the pentest-connector launcher (next to the real pentest-connector-bin). Because the binary links WebKit2GTK as a NEEDED library, a host without it used to die inside the dynamic loader before any of Pick's own code could print an error. The launcher probes for that gap up front and turns it into an actionable message with the exact package line. The failure mode it replaces, verbatim from the field (released agent, NixOS host, stderr discarded by its supervisor):

error while loading shared libraries: libpcap.so.0.8

libpcap is now bundled; the only remaining host gap on the desktop app is the WebKit2GTK stack (the web engine plus its GTK/X11 package closure), which the launcher names by its exact apt package.

Two notes about the bundled OpenSSL: the $ORIGIN/lib rpath makes the bundled libcrypto/libssl win over any host copy (rpath is searched before LD_LIBRARY_PATH and the default directories), so OpenSSL security fixes reach users through Pick releases rather than host package updates. And legacy OpenSSL provider operations (e.g. legacy PKCS#12/RC4 paths) are dlopen'd from the host's compiled-in ossl-modules directory; a host that needs them must ship the libssl3/openssl package's module directory alongside.

Headless Agent (Pick)

The headless agent (pentest-agent) runs without a GUI and serves its workspace app via Dioxus LiveView over a Unix socket. It can run standalone or be managed by StrikeHub as the "Pick" connector app.

# Standalone — connects to Strike48 directly
STRIKE48_HOST=grpc://connectors-studio.example.com:80 \
    STRIKE48_TENANT=non-prod \
    STRIKE48_INSTANCE_ID=pick-local \
    STRIKE48_TLS=false \
    MATRIX_TLS_INSECURE=true \
    cargo run --package pentest-headless

# StrikeHub IPC mode — launched automatically by StrikeHub with
# STRIKEHUB_SOCKET set. No STRIKE48_HOST required (liveview-only).

Environment variables (standalone):

Variable Description
STRIKE48_HOST / STRIKE48_URL gRPC/WebSocket endpoint
STRIKE48_TENANT / TENANT_ID Tenant identifier
STRIKE48_INSTANCE_ID / INSTANCE_ID Connector instance ID
STRIKE48_TOKEN JWT auth token (optional)
STRIKE48_TLS true or false
CONNECTOR_NAME Gateway identity name (default: pentest-connector). Set a unique name per host to get a dedicated agent view instead of round-robin.
MATRIX_TLS_INSECURE Accept self-signed certs
STRIKEHUB_SOCKET Unix socket path (set by StrikeHub)

Desktop

# Development (requires sudo for WiFi hardware access)
sudo cargo run --package pentest-desktop

# Release build
cargo build --release --package pentest-desktop
sudo ./target/release/pentest-desktop

Why sudo? WiFi penetration testing tools (autopwn, wifi_scan, airmon-ng) require direct hardware access to wireless adapters, which needs real root privileges. See docs/BWRAP_SUDO_EXPLAINED.md for details.

Web (Liveview)

# Development (starts server on http://localhost:3000)
cargo run --package pentest-web

# Release build
cargo build --release --package pentest-web

Mobile (requires additional setup)

# Install cargo-mobile2
cargo install cargo-mobile2

# Initialize mobile project (first time)
cd apps/mobile
cargo mobile init

# Build for Android
cargo mobile android build

# Build for iOS
cargo mobile ios build

Configuration

The connector connects to a Strike48 backend server. Configuration options:

  • Strike48 Host: gRPC or WebSocket endpoint (e.g., grpc://localhost:50061)
  • Tenant ID: Strike48 tenant identifier
  • Auth Token: JWT or One-Time Token (OTT) for authentication

Environment variables:

  • STRIKE48_HOST / STRIKE48_URL - Strike48 server URL
  • STRIKE48_TENANT / TENANT_ID - Tenant ID
  • STRIKE48_INSTANCE_ID / INSTANCE_ID - Connector instance ID
  • CONNECTOR_NAME - Gateway identity name (default: pentest-connector)
  • RUST_LOG - Logging level (e.g., pentest=debug)

How It Works

  1. You run one of the apps (desktop, web, headless, mobile)
  2. The app connects to the Strike48 backend and registers as a connector
  3. Apps with a UI (desktop, web, mobile) present it for manual tool execution; headless has no local UI
  4. Tools can also be triggered remotely via the Strike48 API (e.g., by an AI agent)
  5. All tool execution happens locally on the machine running the app

Pick is a native app that is both a UI and a connector - the same architecture proven in production environments.

Development

Adding a New Tool

  1. Create tool file in crates/tools/src/
  2. Implement PentestTool trait
  3. Add to create_tool_registry() in lib.rs
  4. Implement platform-specific functionality in crates/platform/

Adding Platform Support

  1. Create platform module in crates/platform/src/
  2. Implement all platform traits (NetworkOps, SystemInfo, CaptureOps, CommandExec)
  3. Add feature flag to Cargo.toml
  4. Update get_platform() function

Recommended WiFi Adapters

For WiFi scanning and pentesting features, we recommend using a dedicated external WiFi adapter. This prevents disconnection issues when your primary adapter enters monitor mode.

Important: Avoid Connection Loss

If you're connected to the internet via WiFi and try to scan with your built-in adapter:

  1. Your adapter enters monitor mode
  2. You lose your internet connection
  3. Pick disconnects from the Strike48 backend
  4. The scan fails

Solution: Use an external adapter for scanning while keeping your internet connection active via built-in WiFi or Ethernet.

Top Recommendations (2025–2026)

Best Overall

Alfa AWUS036ACHM (MT7610U / MediaTek chipset)

  • Dual-band (2.4 & 5 GHz)
  • Excellent range/sensitivity
  • Reliable monitor mode + packet injection
  • Native Linux driver support (mt76 series)
  • Plug-and-play on modern Kali
  • Compact/mini form factor
  • ~$40-50 range

Future-Proof Option

Alfa AWUS036AXML (MT7921AU / MediaTek WiFi 6E chipset)

  • WiFi 6E support (adds 6 GHz)
  • Very strong 2025 performance
  • Good drivers in recent kernels
  • Excellent range on 2.4/5 GHz
  • Reliable injection
  • ~$60-70 range

Budget Dual-Band

Alfa AWUS036ACS or AWUS036AC (Realtek RTL8811AU / RTL8812AU)

  • Budget-friendly (~$30 range)
  • Dual-band (2.4 & 5 GHz)
  • Solid out-of-the-box Kali support
  • Good for beginners
  • Reliable for basic-intermediate aircrack-ng tasks

Maximum Range

Alfa AWUS1900 (Realtek RTL8814AU)

  • 4 antennas, very long range
  • High power output
  • Great for wardriving or distant targets
  • Slightly bulkier and more expensive (~$80-100)

Classic / Budget Options (Still Work Well)

  • Alfa AWUS036NHA (Atheros AR9271) - Gold standard for years, rock-solid injection, 2.4 GHz only
  • Panda PAU05 / PAU09 - Low-profile, cheap, reliable 2.4 GHz injection
  • TP-Link TL-WN722N v1 (Atheros AR9271) - Very cheap and effective (avoid v2/v3)

Security Notes

This tool is designed for authorized penetration testing and security research. Features include:

  • Network reconnaissance capabilities
  • System information gathering
  • Traffic interception (requires elevated privileges)
  • Command execution

Always ensure you have proper authorization before using these tools on any system or network.

License

Mozilla Public License 2.0 (MPL-2.0) - See the LICENSE file for details. The vendored strike48-connector and strike48-proto SDK crates are Strike48 proprietary components distributed under their own license (vendor/strike48-connector/LICENSE) and are outside the MPL-2.0 grant.

Credits

About

Pick is a lightweight, headless penetration testing agent built with Dioxus, providing network reconnaissance, device discovery, and remote tool execution capabilities.

Resources

Code of conduct

Contributing

Security policy

Stars

33 stars

Watchers

2 watching

Forks

Releases

Packages

Used by

Contributors

Languages