Skip to content

Repository files navigation

Bullet

Bullet

Bullet is a browser-driven web recon and attack-validation tool that runs from your terminal. Point it at a target you’re allowed to test, connect it to a real Chromium browser over CDP, and it’ll pull apart the app the same way a human would: traffic, JS bundles, DOM state, storage, routes, endpoints, auth surfaces, secrets, and anything else that looks useful.

It opens the app, watches what happens, builds a graph of what it found, ranks the interesting leads, and can optionally push further with brute modules, external scanners, or an AI agent. Results land as JSON, markdown, and a local dashboard so you can come back later and understand what actually happened.

Use this only on systems you own or have explicit permission to test. Seriously.

Quick start

bun install
bun run tui

From there:

  1. Enter the target URL.
  2. Pick a Chromium-based browser with remote debugging support, or connect to one that is already exposing CDP.
  3. Choose a mode. If you’re just getting a feel for the app, start with Recon Bundle. If you want the whole thing, use Full Attack.
  4. Watch the run from the TUI, then open the generated dashboard/report from output/<runId>/.

AI mode defaults to OpenCode Zen's DeepSeek V4 Flash Free, with Ministral available as a fallback. You can swap models through config/env if you want a different provider or model chain:

# primary model
echo 'AGENT_MODEL=opencode-zen:deepseek-v4-flash-free' >> .env

# optional fallbacks, comma-separated
echo 'AGENT_FALLBACK_MODELS=mistral:ministral-8b-latest' >> .env

Use OPENCODE_API_KEY for OpenCode Zen and MISTRAL_API_KEY for Ministral fallback runs.

Requirements

Thing Why it matters
Bun Runtime + package manager
Chromium-based browser Bullet talks to the browser through CDP
AI provider key OPENCODE_API_KEY for the default OpenCode Zen path; MISTRAL_API_KEY for the Ministral fallback
nmap, nuclei, sqlmap Optional active scanners for port/service checks, CVE/misconfig templates, and deep SQLi validation
katana, ffuf, arjun Optional surface discovery for crawling, fuzzing, and hidden parameter discovery
subfinder, dnsx, httpx Optional subdomain, DNS, and HTTP probing stack
dalfox, wafw00f, jwt_tool, interactsh-client Optional focused tooling for XSS, WAF fingerprinting, JWT checks, and OAST callbacks

The app itself is OS-agnostic. Browser auto-detection has the most built-in paths on macOS, but you can connect to any Chromium-based browser as long as CDP is reachable.

What Bullet actually does

Bullet is built around one idea: the browser already knows a ton about the app, so start there instead of guessing blindly.

flowchart TD
  A[Chromium browser over CDP] --> B[Harvest network, JS, DOM, forms, cookies, storage]
  B --> C[Knowledge graph + asset inventory]
  C --> D[Lead scoring + attack-chain correlation]
  D --> E{Validation enabled?}
  E -->|No| F[Reports + dashboard]
  E -->|Yes| G[Brute modules, external tools, or AI agent]
  G --> H[Findings, evidence, chains]
  H --> F
Loading

Core pieces:

  • CDP harvesters capture network requests, responses, scripts, forms, cookies, local/session storage, and DOM hints.
  • JS analysis walks bundles and looks for secrets, routes, API clients, and interesting string usage.
  • Knowledge graph links endpoints, assets, secrets, findings, auth context, and attack chains instead of leaving you with disconnected logs.
  • Lead scoring tries to rank what is actually worth looking at by impact and exploitability.
  • Brute modules cover directories, params, APIs, credentials, subdomains, vhosts, and quick SQLi checks depending on config.
  • External tools can call katana, ffuf, arjun, subfinder, dnsx, httpx, nmap, nuclei, sqlmap, dalfox, and related helpers when installed and enabled.
  • AI Mode gives the graph and ranked leads to a model chain. DeepSeek V4 Flash Free through OpenCode Zen is the default path, with Ministral as a fallback.

Scan modes

Mode Best for What happens
Recon Bundle Safe first pass Harvest, explore, intel, no active attacks
Investigate High-signal review Graph-driven phases with less noise
Attack Bundle Focused active testing Harvest + brute modules from Brute Config
Full Attack End-to-end run Harvest, explore, brute, scanners, intel
AI Mode Agent-assisted testing DeepSeek V4 Flash Free/Ministral model chain reads context, forms hypotheses, and drives tools
Harvest modes Debugging specific surfaces Run JS/network/DOM/storage collection individually
Single tools One-off checks Run nmap, nuclei, sqlmap, sqli-quick, etc.

Brute force behavior, concurrency, scope, CAPTCHA handling, and external tool toggles live under Brute Config in the TUI.

Output

Every run gets its own output/<runId>/ directory. The main things you’ll care about are:

  • dashboard/index.html for the local visual report
  • report.md when you want a clean markdown writeup
  • findings.json for normalized findings
  • intel/chains.json and intel/leads.json for correlated paths and ranked leads
  • harvest/ for raw-ish browser evidence: network, DOM, JS, storage
  • agent/ for AI session artifacts when AI Mode was used

The dashboard is usually the easiest place to start: severity charts, ranked leads, chains, asset inventory, network logs, auth matrix data, rendered markdown, and a collapsible JSON explorer in one place.

Inside the TUI you also get views for Findings, Attack Chains, Asset Inventory, Security Report, Network Log, Auth Matrix, Job Queue, Output Files, Tool Status, and scan History.

Scripts

bun run tui        # start the terminal UI
bun run dev        # TUI with watch reload
bun run web        # build web UI and start HTTP API on port 3001
bun run dev:web    # API + Vite dev server for the web UI
bun run build:web  # build the web UI
bun run lint       # oxlint over src/
bun run fmt        # oxfmt over src/

Configuration

Environment variables go in .env:

Variable Purpose
OPENCODE_API_KEY API key for the default OpenCode Zen agent path
MISTRAL_API_KEY API key for the Ministral fallback model
AGENT_MODEL Primary agent model, defaults to opencode-zen:deepseek-v4-flash-free
AGENT_FALLBACK_MODELS Comma-separated fallback chain, defaults to mistral:ministral-8b-latest
PLANNER auto (default), llm, or rule — hybrid LLM planner refines the rule plan when a model key is set
PLANNER_MODEL Optional model override for the LLM planner
BULLET_INVENTORY / BBOT_OUTPUT Path to BBOT ndjson/JSON or plain host list to seed hosts/URLs before scan

See BBOT Collaboration for full details on running BBOT actively or ingesting reports.

Wordlists live in wordlists/. Runtime scan settings are mostly handled in the TUI so you don’t have to keep editing config files mid-run.

Project layout

Path What’s in there
src/tui/ OpenTUI interface, screens, and state
src/server.ts HTTP/WebSocket API for the web dashboard flow
src/engine.ts Main scan orchestration
src/harvesters/ Browser/CDP harvest modules
src/explore/ Crawling, links, sitemap, SPA route discovery
src/knowledge/ API surface enrichment, graph linking, lead scoring
src/graph/ Graph store, builder, correlation types
src/intel/ Analysis, enrichment, gates, usage tracing
src/classify/ vendored sklearn form_model/page_model weights + form/page/field classification inference
src/agent/ AI agent runtime, model routing, prompts, tools, policy, compaction
src/brute/ Brute modules, checkpoints, wordlists, registry
src/external-tools/ Wrappers for external recon/security tools
src/report/ Dashboard payload/template and markdown report generation
src/tools/ Tool manifest, schemas, and invocation layer
wordlists/ Default wordlists used by brute modules
output/ Generated run artifacts
checkpoints/ Resume data for interrupted scans

Gotchas

  • CDP has to be reachable. If the browser is not running with remote debugging, Bullet will prompt you to launch/connect one.
  • AI Mode can get active. It may ask for approval to use browser fetches, brute actions, or scanner tools. Keep scope tight.
  • Missing external tools are fine. Bullet will skip those phases instead of exploding, but check Tool Status if a run feels too quiet.
  • Large apps get noisy fast. Lead scoring and context compaction help, but you still want sane scope/rate limits.
  • This is not a magic vulnerability printer. It gives you structured evidence and good leads; you still need to verify impact like a normal human.

License

Apache-2.0. License

About

AI and CDP driven web recon and attack terminal tool

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Contributors

Languages