skills/chromium-test/SKILL.md
Launch an isolated Chromium test browser on a free local CDP port for scoped web, desktop, or proxy-observed bug bounty workflows.
npx skillsauth add ghostonbutterbread/bug-bounty-harness chromium-testInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use when a task needs a fresh Chromium/Chrome instance with remote debugging enabled, an isolated profile, and MITM proxy observation.
Use this for live browser exploration, not as the default replay transport. When Ryushe says to look at a URL, application, or flow, launch Chromium/Playwright with the agent's local browser proxy attached so requests generated by the browser can be observed in the agent lane.
Also use this when a deep-map, URL-list, or raw replay run hits
Cloudflare/managed challenge pages, browser-only tokens, TLS/header fingerprint
issues, or other bot-defense behavior before app content is visible. A plain
403/401 is not enough by itself; classify normal app/server forbidden responses
with /403, /error-triage, auth, access-control, or header reasoning first.
For real challenge/fingerprint/browser-only cases, escalate into a proxied
browser context instead of treating raw HTTP as app-layer coverage.
The launcher prefers Playwright's bundled Chromium when Playwright is installed, then falls back to system Chromium/Chrome.
/chromium-test <program> <task> [--url <url>] [--port <port>] [--remote-allow-origins <value>]
/chromium-test superdrug pfp
/chromium-test canva upload-flow --account-label qa-primary --url https://www.canva.com/
The launcher should trust the proxy CA inside each isolated Chromium profile. Do not use blanket certificate-ignore mode as the normal path.
Default behavior:
--proxy-cert-mode auto: import the mitmproxy CA into the profile when possible; fall back to --ignore-certificate-errors only when certutil or the CA file is missing.--proxy-cert-mode import: require CA import and fail if it cannot be prepared.--proxy-cert-mode ignore: explicit disposable debugging mode.--proxy-cert-mode none: attach the proxy without CA setup or ignore flags.Standalone profile preparation:
bash "$HARNESS_ROOT/skills/chromium-test/scripts/install.sh"
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/mitm_chromium_profile.py" \
--profile-dir "$HARNESS_SHARED_BASE/<program>/ghost/chromium-test/profiles/<account>" \
--home-dir "$HARNESS_SHARED_BASE/<program>/ghost/chromium-test/profiles/<account>/home" \
--ca-cert ~/.mitmproxy/mitmproxy-ca-cert.pem
Hoster/default proxy model:
http://hoster:8080 is the default always-on capture proxy for generic
curl, httpx, and script traffic when no task-specific browser lane is
needed. Ensure it is running with:
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/hoster_mitm_lane.py" --json ensure-default
http://hoster:8081 through http://hoster:8090 are leased per-agent MITM
lanes. Acquire a lease before starting a task-specific proxy and release it
after indexing the lane into the central proxy store.abommie/ryushespc), prefer the local MITM proxy lane
unless the task explicitly asks for Hoster routing.Lease-backed mitmproxy lane smoke:
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/hoster_mitm_lane.py" --json acquire-start \
--agent-id <agent-id> \
--run-id <run-id> \
--program <program> \
--task "<task>" \
--account-label <account-label>
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/chromium_test.py" <program> "<task>" \
--proxy-server http://hoster:<leased-port> \
--ephemeral-profile \
--run-id <run-id> \
--agent-id <agent-id> \
--account-label <account-label> \
--proxy-cert-mode import \
--mitm-ca-cert ~/.local/state/ghost/mitm-lanes/<lane>/mitmproxy/mitmproxy-ca-cert.pem
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/hoster_mitm_lane.py" --json index-stop-release \
--lane <lane> \
--agent-id <agent-id> \
--run-id <run-id> \
--account-label <account-label> \
--proxy-port <leased-port> \
--transport browser
ssh -i /home/ryushe/.ssh/hoster -o BatchMode=yes -o ConnectTimeout=10 -o ControlMaster=no -T \
ryushe@hoster 'cd /home/ryushe/projects/bug_bounty_harness && python3 skills/chromium-test/scripts/proxy_store.py query --program <program> --method POST'
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/proxy_store.py" export-request --id <request_id> --output /tmp/request-packet.json
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/chromium_test.py" cleanup-profile --profile-dir <profile-dir> --json
$HARNESS_ROOT/prompts/chromium-test-playbook.md.$HARNESS_SHARED_BASE/{program}/.--auth-seed-file is not provided, --account <alias-or-color> or
--account-label <alias-or-color> may resolve
$HARNESS_SHARED_BASE/{program}/credentials/account_inventory.json.credential_ref or auth_seed_ref values such as
auth-seed:/absolute/path/to/seed.json, but never cookie/token/header
values.auth_refresh_source and auth_refresh_hint. For
auth_refresh_source=ryushe-proxy, load /ryushe-proxy, refresh only
that selected account's seed, and never print or persist the raw values
anywhere except the locked-down seed file.intercepted-proxy before launching the browser.--proxy-server or $CHROMIUM_TEST_PROXY_SERVER.ghostonbread, the default agent-lane browser proxy is http://hoster:8080; on hoster or ryushespc/Abommie, use http://localhost:8080.$HARNESS_ROOT/prompts/chromium-test-playbook.md$HARNESS_ROOT/skills/chromium-test/scripts/chromium_test.py$HARNESS_SHARED_BASE/{program}/ghost/chromium-test/profiles/$HARNESS_ROOT/skills/chromium-test/scripts/mitm_chromium_profile.py$HARNESS_ROOT/skills/chromium-test/scripts/mitm_lane.py$HARNESS_ROOT/skills/chromium-test/scripts/hoster_mitm_lane.py$HARNESS_ROOT/skills/chromium-test/scripts/proxy_store.py$HARNESS_ROOT/skills/chromium-test/scripts/install.sh$HARNESS_SHARED_BASE/{program}/ghost/chromium-test/python3 "$HARNESS_ROOT/skills/chromium-test/scripts/chromium_test.py" <program> "<task>"
The launcher resolves the runtime route and adds --proxy-server=<mitm-proxy> by default.python3 "$HARNESS_ROOT/skills/chromium-test/scripts/mitm_lane.py" --lane <lane> index-store
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/proxy_store.py" query --program <program> --method POST
python3 "$HARNESS_ROOT/skills/chromium-test/scripts/proxy_store.py" export-request --id <request_id> --output /tmp/request-packet.json
0600. The launcher may report safe metadata and which secret field names
exist, but must never print cookie, bearer, CSRF, or token values.--proxy-server=<browser-proxy> and that proxy_cert_status is trusted when proxy TLS interception is expected. If the launcher falls back to --ignore-certificate-errors, record that as debug/fallback behavior.auth_refresh_source=ryushe-proxy. Use Ryushe's proxy only to refresh the
seed for that account, then test through the agent MITM lane.curl -x <mitm-proxy> when request logging is desired.--proxy-server=<browser-proxy> value is known. Route to intercepted-proxy for the intercept on/off and temporary Tamper rule lifecycle.testing
Systematic live request mutation: flip booleans, field ops, headers, content-type, parser differentials, replay vs intercept, null/empty testing. Inherits live-testing-policy scope/rate/ownership rules.
development
Test password reset, forgot-password, reset-token, email reset, and account recovery flows for account takeover risks.
tools
Targeted param/field discovery using tech stack clues, naming conventions, and controlled-rate ffuf — then feeds findings into request-exploration for mutation. Not brute-force; informed and scoped.
testing
Ghost-only workflow for creating approved bug bounty test accounts and saving credential references.