pwn 0.5.617 → 0.5.620
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.
- checksums.yaml +4 -4
- data/Gemfile +2 -2
- data/README.md +101 -83
- data/bin/pwn_gqrx_scanner +25 -5
- data/documentation/AI-Integration.md +42 -26
- data/documentation/AWS.md +57 -0
- data/documentation/Agent-Tool-Registry.md +56 -0
- data/documentation/Banner.md +17 -0
- data/documentation/Blockchain.md +18 -0
- data/documentation/Bounty.md +21 -0
- data/documentation/BurpSuite.md +41 -16
- data/documentation/CLI-Drivers.md +58 -0
- data/documentation/Configuration.md +66 -0
- data/documentation/Contributing.md +33 -19
- data/documentation/Cron.md +47 -0
- data/documentation/Diagrams.md +6 -2
- data/documentation/Drivers.md +43 -16
- data/documentation/Extrospection.md +73 -0
- data/documentation/FFI.md +14 -0
- data/documentation/Fuzzing.md +36 -0
- data/documentation/Hardware.md +40 -0
- data/documentation/Home.md +5 -4
- data/documentation/How-PWN-Works.md +7 -4
- data/documentation/Metasploit.md +34 -0
- data/documentation/Mistakes.md +96 -0
- data/documentation/NmapIt.md +18 -12
- data/documentation/PWN.png +0 -0
- data/documentation/PWN_Contributors_and_Users.png +0 -0
- data/documentation/Persistence.md +40 -0
- data/documentation/Plugins.md +97 -47
- data/documentation/Reporting.md +25 -18
- data/documentation/SAST.md +39 -22
- data/documentation/SDR.md +58 -0
- data/documentation/Sessions.md +39 -0
- data/documentation/Skills-Memory-Learning.md +59 -29
- data/documentation/Swarm.md +71 -0
- data/documentation/Transparent-Browser.md +26 -22
- data/documentation/Troubleshooting.md +44 -25
- data/documentation/WWW.md +32 -0
- data/documentation/diagrams/agent-tool-registry.svg +286 -0
- data/documentation/diagrams/aws-cloud-security.svg +166 -0
- data/documentation/diagrams/cron-scheduling.svg +148 -0
- data/documentation/diagrams/dot/agent-tool-registry.dot +2 -2
- data/documentation/diagrams/dot/extrospection-world-awareness.dot +9 -7
- data/documentation/diagrams/dot/hardware-hacking.dot +48 -0
- data/documentation/diagrams/dot/memory-skills-detailed.dot +12 -5
- data/documentation/diagrams/dot/mistakes-negative-feedback.dot +93 -0
- data/documentation/diagrams/dot/overall-pwn-architecture.dot +7 -5
- data/documentation/diagrams/dot/persistence-filesystem.dot +30 -0
- data/documentation/diagrams/dot/pwn-ai-feedback-learning-loop.dot +19 -7
- data/documentation/diagrams/dot/sdr-radio-flow.dot +13 -11
- data/documentation/diagrams/extrospection-world-awareness.svg +203 -0
- data/documentation/diagrams/hardware-hacking.svg +163 -0
- data/documentation/diagrams/memory-skills-detailed.svg +146 -97
- data/documentation/diagrams/mistakes-negative-feedback.svg +266 -0
- data/documentation/diagrams/overall-pwn-architecture.svg +184 -173
- data/documentation/diagrams/persistence-filesystem.svg +189 -0
- data/documentation/diagrams/pwn-ai-feedback-learning-loop.svg +217 -149
- data/documentation/diagrams/sdr-radio-flow.svg +166 -0
- data/documentation/diagrams/swarm-multi-agent.svg +225 -0
- data/documentation/fax-spectrogram.png +0 -0
- data/documentation/fax-waveform.png +0 -0
- data/documentation/pwn-REPL.md +40 -24
- data/documentation/pwn-ai-Agent.md +72 -30
- data/documentation/pwn_android_war_dialer_session.png +0 -0
- data/documentation/pwn_install.png +0 -0
- data/documentation/pwn_wallpaper.jpg +0 -0
- data/documentation/ringing-spectrogram.png +0 -0
- data/documentation/ringing-waveform.png +0 -0
- data/lib/pwn/ai/agent/extrospection.rb +65 -6
- data/lib/pwn/ai/agent/learning.rb +67 -7
- data/lib/pwn/ai/agent/loop.rb +72 -6
- data/lib/pwn/ai/agent/mistakes.rb +369 -0
- data/lib/pwn/ai/agent/prompt_builder.rb +10 -1
- data/lib/pwn/ai/agent/tools/extrospection.rb +2 -2
- data/lib/pwn/ai/agent/tools/mistakes.rb +132 -0
- data/lib/pwn/ai/agent.rb +1 -0
- data/lib/pwn/plugins/jira_data_center.rb +2 -2
- data/lib/pwn/sdr/decoder/adsb.rb +101 -0
- data/lib/pwn/sdr/decoder/apt.rb +75 -0
- data/lib/pwn/sdr/decoder/bluetooth.rb +78 -0
- data/lib/pwn/sdr/decoder/dect.rb +84 -0
- data/lib/pwn/sdr/decoder/gps.rb +83 -0
- data/lib/pwn/sdr/decoder/gsm.rb +50 -29
- data/lib/pwn/sdr/decoder/iridium.rb +81 -0
- data/lib/pwn/sdr/decoder/lora.rb +87 -0
- data/lib/pwn/sdr/decoder/lte.rb +88 -0
- data/lib/pwn/sdr/decoder/morse.rb +64 -0
- data/lib/pwn/sdr/decoder/p25.rb +71 -0
- data/lib/pwn/sdr/decoder/pager.rb +77 -0
- data/lib/pwn/sdr/decoder/pocsag.rb +26 -11
- data/lib/pwn/sdr/decoder/rfid.rb +88 -0
- data/lib/pwn/sdr/decoder/rtl433.rb +95 -0
- data/lib/pwn/sdr/decoder/rtty.rb +66 -0
- data/lib/pwn/sdr/decoder/wifi.rb +98 -0
- data/lib/pwn/sdr/decoder/zigbee.rb +96 -0
- data/lib/pwn/sdr/decoder.rb +67 -7
- data/lib/pwn/sdr/frequency_allocation.rb +82 -41
- data/lib/pwn/sdr/gqrx.rb +186 -95
- data/lib/pwn/version.rb +1 -1
- data/spec/lib/pwn/ai/agent/mistakes_spec.rb +36 -0
- data/spec/lib/pwn/ai/agent/tools/mistakes_spec.rb +12 -0
- data/spec/lib/pwn/sdr/decoder/adsb_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/apt_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/bluetooth_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/dect_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/gps_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/iridium_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/lora_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/lte_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/morse_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/p25_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/pager_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/rfid_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/rtl433_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/rtty_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/wifi_spec.rb +15 -0
- data/spec/lib/pwn/sdr/decoder/zigbee_spec.rb +15 -0
- data/third_party/pwn_rdoc.jsonl +114 -8
- metadata +81 -5
|
@@ -1,44 +1,74 @@
|
|
|
1
|
-
# Skills
|
|
1
|
+
# Memory · Skills · Learning · Mistakes · Metrics — Introspection
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
The **inward-facing** half of the pwn-ai feedback loop: how the agent measures
|
|
4
|
+
its own performance, turns wins into permanent capability, and — critically —
|
|
5
|
+
**learns from its own mistakes so it does not repeat them**.
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+

|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
## The five stores
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
| Store | File | Write tool | Read tool | Injected as |
|
|
12
|
+
|---|---|---|---|---|
|
|
13
|
+
| **Memory** | `memory.json` | `memory_remember` | `memory_recall` | `MEMORY` block — durable facts / prefs / lessons / env |
|
|
14
|
+
| **Skills** | `skills/*.md` | `skill_create` · `learning_distill_skill` | `skill_list` · `skill_view` | `SKILLS` list — reusable procedures + `references:` (CWE/CVE/ATT&CK/NIST/URL) |
|
|
15
|
+
| **Learning** | `learning.jsonl` | `learning_note_outcome` · `learning_reflect` | `learning_outcomes` · `learning_stats` | `LEARNING` block — recent outcomes + success_rate |
|
|
16
|
+
| **Mistakes** | `mistakes.json` | `mistakes_record` · `mistakes_resolve` · *auto on failure* | `mistakes_list` | `KNOWN MISTAKES` + `KNOWN FIXES` blocks — do-NOT-repeat + do-THIS-instead |
|
|
17
|
+
| **Metrics** | `metrics.json` | *automatic* (every Dispatch) | `metrics_summary` | `TOOL EFFECTIVENESS` block — steer tool choice |
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
## The lifecycle of a lesson
|
|
14
20
|
|
|
15
|
-
|
|
21
|
+
```text
|
|
22
|
+
1. Dispatch runs a tool → Metrics.record(tool, ok?, ms)
|
|
23
|
+
↳ tool FAILED? → Mistakes.record(tool, error) (count++, cross-session)
|
|
24
|
+
↳ same sig ≥3×? → guard_repeated_failure + inline correction_hint
|
|
25
|
+
2. Final answer produced → Learning.auto_reflect(session_id)
|
|
26
|
+
3. Reflect finds a durable insight → Memory.remember(lesson_xxxx, …)
|
|
27
|
+
4. A whole workflow succeeded → Learning.distill_skill(name, session_id, references:)
|
|
28
|
+
5. Found a fix for a mistake → mistakes_resolve(sig, fix) → Memory :lesson "AVOID X — FIX: Y"
|
|
29
|
+
6. Next launch: PromptBuilder injects all five blocks → the model already knows.
|
|
30
|
+
```
|
|
16
31
|
|
|
17
|
-
|
|
32
|
+
See **[Mistakes](Mistakes.md)** for the full negative-feedback mechanics
|
|
33
|
+
(fingerprinting, `[REPEATING]`, `[REGRESSED]`, user-correction detection).
|
|
18
34
|
|
|
19
|
-
|
|
20
|
-
- Manually via `skill_create` or editing YAML+markdown files.
|
|
21
|
-
- Contain front-matter `references:` (CWE, CVE, ATT&CK, NIST, URLs).
|
|
22
|
-
- Exposed to the agent and listed via `skill_list` / `skill_view`.
|
|
35
|
+
## Skill file format
|
|
23
36
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
-
|
|
37
|
+
```markdown
|
|
38
|
+
---
|
|
39
|
+
references:
|
|
40
|
+
- CWE-89
|
|
41
|
+
- T1190
|
|
42
|
+
- https://portswigger.net/web-security/sql-injection
|
|
43
|
+
---
|
|
44
|
+
# sqli_union_enum
|
|
28
45
|
|
|
29
|
-
|
|
46
|
+
1. Confirm injection with `' AND 1=1 --`.
|
|
47
|
+
2. Find column count with `ORDER BY n`.
|
|
48
|
+
3. …
|
|
30
49
|
|
|
31
|
-
|
|
32
|
-
-
|
|
33
|
-
-
|
|
50
|
+
## References
|
|
51
|
+
- CWE-89
|
|
52
|
+
- T1190
|
|
53
|
+
```
|
|
34
54
|
|
|
35
|
-
|
|
55
|
+
`PWN::Config.parse_skill_references` reads both the YAML front-matter **and**
|
|
56
|
+
the `## References` section, deduplicates, and exposes them via
|
|
57
|
+
`skill_view(name)[:references]`.
|
|
36
58
|
|
|
37
|
-
|
|
38
|
-
- `pwn-ai-sessions`
|
|
39
|
-
- `pwn-ai-cron`
|
|
40
|
-
- `skill_list`, `skill_view`, `skill_create`, `skill_add_reference`
|
|
59
|
+
## Housekeeping
|
|
41
60
|
|
|
42
|
-
|
|
61
|
+
| Tool | When |
|
|
62
|
+
|---|---|
|
|
63
|
+
| `learning_consolidate(max_entries: 200)` | MEMORY block getting long/noisy |
|
|
64
|
+
| `learning_reset(confirm: true)` | dev-experiment noise polluted success_rate |
|
|
65
|
+
| `mistakes_reset(confirm: true)` | new host/engagement — prior failure patterns no longer apply |
|
|
66
|
+
| `metrics_reset(confirm: true)` | fixed a broken tool; stale 0 % is misleading |
|
|
67
|
+
| `skill_delete(name)` | auto-distilled skill turned out low-quality |
|
|
68
|
+
| `learning_auto_reflect_toggle(enabled: false)` | during noisy fuzz loops |
|
|
43
69
|
|
|
44
|
-
[
|
|
70
|
+
**See also:** [Mistakes](Mistakes.md) — the negative-feedback half ·
|
|
71
|
+
[Extrospection](Extrospection.md) — the outward-facing half ·
|
|
72
|
+
[Sessions](Sessions.md) · [Persistence](Persistence.md)
|
|
73
|
+
|
|
74
|
+
[← Home](Home.md)
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Swarm — Native Multi-Agent Orchestration
|
|
2
|
+
|
|
3
|
+
`PWN::AI::Agent::Swarm` replaces the legacy `pwn-irc` (inspircd + weechat +
|
|
4
|
+
PRIVMSG) transport with **first-class sub-agents** built directly on
|
|
5
|
+
`PWN::AI::Agent::Loop`. Each persona is a *full* tool-calling agent — Memory,
|
|
6
|
+
Skills, Learning, Metrics and Extrospection all apply — so the
|
|
7
|
+
self-improvement loop covers the whole swarm.
|
|
8
|
+
|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
## Files
|
|
12
|
+
|
|
13
|
+
| Path | Contains |
|
|
14
|
+
|---|---|
|
|
15
|
+
| `~/.pwn/agents.yml` | Persona registry (name → role/engine/toolsets/max_iters) |
|
|
16
|
+
| `~/.pwn/swarm/<id>/bus.jsonl` | Append-only chat every persona reads/writes |
|
|
17
|
+
| `~/.pwn/swarm/<id>/personas.json` | persona name → `PWN::Sessions` id |
|
|
18
|
+
|
|
19
|
+
No daemon. Cross-session / cross-process communication == another `pwn-ai` (or
|
|
20
|
+
a `PWN::Cron` job) calling `Swarm.ask` with the same `swarm_id`.
|
|
21
|
+
|
|
22
|
+
## Define personas
|
|
23
|
+
|
|
24
|
+
```ruby
|
|
25
|
+
agent_spawn(name: 'red_team',
|
|
26
|
+
role: 'Offensive operator. Propose the most aggressive next step.',
|
|
27
|
+
engine: 'grok',
|
|
28
|
+
toolsets: %w[terminal pwn memory skills extrospection])
|
|
29
|
+
|
|
30
|
+
agent_spawn(name: 'blue_team',
|
|
31
|
+
role: 'Defender. Critique red_team, flag detection risk & OPSEC.',
|
|
32
|
+
engine: 'anthropic',
|
|
33
|
+
toolsets: %w[pwn memory extrospection])
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
> Omit `swarm` from a persona's toolsets to stop it recursively spawning
|
|
37
|
+
> further sub-agents. Recursion is also hard-capped by
|
|
38
|
+
> `PWN::Env[:ai][:agent][:max_depth]` (default 3).
|
|
39
|
+
|
|
40
|
+
## Verbs
|
|
41
|
+
|
|
42
|
+
| Tool | Use for |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `agent_list` | See who's defined |
|
|
45
|
+
| `agent_spawn` | Define / overwrite a persona |
|
|
46
|
+
| `agent_ask(name, request)` | One turn of one persona → reply comes back to *you* |
|
|
47
|
+
| `agent_debate(names, topic, rounds:)` | Round-robin critique — each sees the bus tail |
|
|
48
|
+
| `agent_broadcast(request)` | Fan-out; returns `{name => reply}` for voting |
|
|
49
|
+
| `swarm_bus(swarm_id)` | Tail a bus to inspect a prior/concurrent conversation |
|
|
50
|
+
| `swarm_list` | Find a `swarm_id` to resume |
|
|
51
|
+
|
|
52
|
+
## Example: adversarial exploit review
|
|
53
|
+
|
|
54
|
+
```ruby
|
|
55
|
+
tx = agent_debate(
|
|
56
|
+
names: %w[red_team blue_team exploit_dev],
|
|
57
|
+
topic: 'Target runs Jenkins 2.426.2 on :8080 — plan initial access.',
|
|
58
|
+
rounds: 3
|
|
59
|
+
)
|
|
60
|
+
# later, in a different pwn-ai process:
|
|
61
|
+
agent_ask(name: 'red_team', swarm_id: tx[:swarm_id],
|
|
62
|
+
request: 'blue_team raised WAF concerns — revise the payload.')
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Because each persona can pin a **different engine**, the debate is real model
|
|
66
|
+
diversity, not one model role-playing.
|
|
67
|
+
|
|
68
|
+
**See also:** [pwn-ai Agent](pwn-ai-Agent.md) ·
|
|
69
|
+
[Agent Tool Registry](Agent-Tool-Registry.md) · [Sessions](Sessions.md)
|
|
70
|
+
|
|
71
|
+
[← Home](Home.md)
|
|
@@ -1,32 +1,36 @@
|
|
|
1
|
-
#
|
|
1
|
+
# `PWN::Plugins::TransparentBrowser`
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Watir + Selenium wrapper that gives you a real Chrome/Firefox — headless or
|
|
4
|
+
visible — with proxy support, DevTools protocol access, and cookie/console
|
|
5
|
+
capture. It's the traffic source for [BurpSuite](BurpSuite.md), the engine
|
|
6
|
+
under every [`PWN::WWW`](WWW.md) driver, and the agent's go-to for anything
|
|
7
|
+
JS-heavy.
|
|
4
8
|
|
|
5
|
-
##
|
|
6
|
-
|
|
7
|
-
- Web spidering / crawling
|
|
8
|
-
- JavaScript-heavy application interaction
|
|
9
|
-
- Automated form submission, auth flows
|
|
10
|
-
- Screenshotting, DOM inspection
|
|
11
|
-
- Proxied browsing (pairs excellently with BurpSuite)
|
|
12
|
-
|
|
13
|
-
## Example Calls
|
|
9
|
+
## Open
|
|
14
10
|
|
|
15
11
|
```ruby
|
|
16
|
-
|
|
17
|
-
browser_type: :chrome
|
|
18
|
-
proxy:
|
|
12
|
+
b = PWN::Plugins::TransparentBrowser.open(
|
|
13
|
+
browser_type: :headless, # :chrome | :firefox | :headless | :rest
|
|
14
|
+
proxy: 'http://127.0.0.1:8080',
|
|
15
|
+
with_devtools: true
|
|
19
16
|
)
|
|
20
|
-
browser.goto 'https://target
|
|
21
|
-
|
|
22
|
-
browser.close
|
|
17
|
+
b[:browser].goto 'https://target'
|
|
18
|
+
b[:browser].text_field(name: 'q').set 'pwn'
|
|
23
19
|
```
|
|
24
20
|
|
|
25
|
-
|
|
21
|
+
## Useful bits
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
b[:browser].cookies.to_a
|
|
25
|
+
b[:browser].execute_script('return document.title')
|
|
26
|
+
b[:devtools].send_cmd('Network.enable')
|
|
27
|
+
PWN::Plugins::TransparentBrowser.dump_links(browser_obj: b)
|
|
28
|
+
PWN::Plugins::TransparentBrowser.close(browser_obj: b)
|
|
29
|
+
```
|
|
26
30
|
|
|
27
|
-
##
|
|
31
|
+
## `:rest` mode
|
|
28
32
|
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
`browser_type: :rest` returns a `RestClient`-backed object with the same proxy
|
|
34
|
+
plumbing — for APIs where a full browser is overkill.
|
|
31
35
|
|
|
32
|
-
[[
|
|
36
|
+
[← Home](Home.md) · [BurpSuite](BurpSuite.md) · [WWW](WWW.md)
|
|
@@ -1,38 +1,57 @@
|
|
|
1
1
|
# Troubleshooting
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## SHIFT+ENTER submits instead of newline
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
-
|
|
7
|
-
- 502 errors usually mean upstream proxy not listening or crashed. Check with `ps`, `ss -tlnp`, restart via plugin methods.
|
|
5
|
+
`pwn-ai` / `pwn-asm` need the terminal to send a *distinct* code for
|
|
6
|
+
Shift-Enter. Under **tmux** both sides must be configured:
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
- Grok uses OAuth device flow (public client) — see `xai_grok_oauth_device_flow` skill.
|
|
15
|
-
- Store credentials via `PWN::Config` or environment as documented.
|
|
8
|
+
```tmux
|
|
9
|
+
# ~/.tmux.conf
|
|
10
|
+
set -s extended-keys on
|
|
11
|
+
set -as terminal-features 'xterm*:extkeys' # replace xterm* with your $TERM
|
|
12
|
+
```
|
|
16
13
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
Then fully **detach and re-attach** (a `source-file` isn't enough for
|
|
15
|
+
`terminal-features`). Verify with `tmux display -p '#{client_termfeatures}'`
|
|
16
|
+
— it must include `extkeys`.
|
|
20
17
|
|
|
21
|
-
|
|
22
|
-
- Run `sudo chown -R $USER:$USER /opt/pwn` if permission issues after install.
|
|
18
|
+
## `502 Bad Gateway` from a proxy plugin
|
|
23
19
|
|
|
24
|
-
|
|
20
|
+
The upstream (Burp/ZAP) isn't listening. Check:
|
|
25
21
|
|
|
26
22
|
```bash
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
# Inside REPL:
|
|
30
|
-
PWN::Config
|
|
31
|
-
PWN::Plugins::PWNLogger
|
|
23
|
+
ps aux | grep -E 'burp|zap'
|
|
24
|
+
ss -tlnp | grep -E ':8080|:1337'
|
|
32
25
|
```
|
|
33
26
|
|
|
34
|
-
|
|
27
|
+
Restart via `PWN::Plugins::BurpSuite.start` / `PWN::Plugins::Zaproxy.start` or
|
|
28
|
+
fix the port in `~/.pwn/config.yml`.
|
|
29
|
+
|
|
30
|
+
## `Psych::DisallowedClass` on cron/agents YAML
|
|
31
|
+
|
|
32
|
+
Fixed in current `PWN::Cron` / `Swarm` — both loaders now pass
|
|
33
|
+
`permitted_classes: [Symbol]`. If you see it, `git pull && rake install`.
|
|
34
|
+
|
|
35
|
+
## Agent stops early ("max iterations")
|
|
36
|
+
|
|
37
|
+
Raise `ai.agent.max_iters` in `~/.pwn/config.yml`, or split the request.
|
|
38
|
+
|
|
39
|
+
## A tool is stuck at 0 % success
|
|
40
|
+
|
|
41
|
+
If you've since fixed the tool, wipe the stale telemetry so it stops steering
|
|
42
|
+
the agent away: `metrics_reset(confirm: true)`.
|
|
43
|
+
|
|
44
|
+
## LLM auth
|
|
45
|
+
|
|
46
|
+
| Engine | Fix |
|
|
47
|
+
|---|---|
|
|
48
|
+
| grok `oauth: true` | first run prints a `https://accounts.x.ai/…` URL — open it, approve, token is cached |
|
|
49
|
+
| ollama | ensure `ollama serve` is running and `base_url:` matches |
|
|
50
|
+
| others | check `key:` under `ai.<engine>` in `~/.pwn/config.yml` |
|
|
51
|
+
|
|
52
|
+
## Diagrams won't rebuild
|
|
35
53
|
|
|
36
|
-
|
|
54
|
+
`sudo apt install graphviz` (need `dot` on `$PATH`), then
|
|
55
|
+
`cd documentation/diagrams && ./build.sh`.
|
|
37
56
|
|
|
38
|
-
[
|
|
57
|
+
[← Home](Home.md)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# `PWN::WWW` — Site-Specific Browser Automations
|
|
2
|
+
|
|
3
|
+
21 modules, each a scripted [`TransparentBrowser`](Transparent-Browser.md)
|
|
4
|
+
session against a real site: log in, navigate, scrape, submit.
|
|
5
|
+
Source: `lib/pwn/www/*.rb`.
|
|
6
|
+
|
|
7
|
+
## Modules
|
|
8
|
+
|
|
9
|
+
| Category | Modules |
|
|
10
|
+
|---|---|
|
|
11
|
+
| **Bug bounty** | `HackerOne` · `BugCrowd` · `Synack` · `AppCobaltIO` |
|
|
12
|
+
| **Search / OSINT** | `Google` · `Bing` · `DuckDuckGo` · `Torch` · `WaybackMachine` · `Pastebin` · `Checkip` |
|
|
13
|
+
| **Social** | `Twitter` · `Facebook` · `LinkedIn` · `Youtube` · `Pandora` |
|
|
14
|
+
| **Finance / Work** | `CoinbasePro` · `Paypal` · `TradingView` · `Uber` · `Upwork` |
|
|
15
|
+
|
|
16
|
+
## Pattern
|
|
17
|
+
|
|
18
|
+
```ruby
|
|
19
|
+
b = PWN::WWW::HackerOne.open(browser_type: :headless,
|
|
20
|
+
proxy: 'http://127.0.0.1:8080')
|
|
21
|
+
PWN::WWW::HackerOne.login(browser_obj: b, username: '…', mfa: '…')
|
|
22
|
+
# ... scripted navigation ...
|
|
23
|
+
PWN::WWW::HackerOne.logout(browser_obj: b)
|
|
24
|
+
PWN::Plugins::TransparentBrowser.close(browser_obj: b)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Because traffic goes through TransparentBrowser, you can point `proxy:` at
|
|
28
|
+
[BurpSuite](BurpSuite.md) and passively capture every request the automation
|
|
29
|
+
makes.
|
|
30
|
+
|
|
31
|
+
[← Home](Home.md) · [Transparent-Browser](Transparent-Browser.md) ·
|
|
32
|
+
[Bounty](Bounty.md)
|