exploitsynth 0.3.0__tar.gz

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.
@@ -0,0 +1,6 @@
1
+ .venv/
2
+ dist/
3
+ build/
4
+ *.egg-info/
5
+ __pycache__/
6
+ *.pyc
@@ -0,0 +1,163 @@
1
+ Metadata-Version: 2.4
2
+ Name: exploitsynth
3
+ Version: 0.3.0
4
+ Summary: ExploitSynth scanner CLI — AI port-identification from your terminal
5
+ Project-URL: Homepage, https://scan.exploitsynth.com
6
+ Project-URL: Documentation, https://scan.exploitsynth.com/docs
7
+ Project-URL: Issues, https://github.com/exploitsynth/cli/issues
8
+ Author: ExploitSynth
9
+ License: MIT
10
+ Requires-Python: >=3.9
11
+ Requires-Dist: defusedxml>=0.7
12
+ Requires-Dist: httpx>=0.27
13
+ Requires-Dist: rich>=13.7
14
+ Requires-Dist: typer>=0.12
15
+ Description-Content-Type: text/markdown
16
+
17
+ # ExploitSynth CLI
18
+
19
+ AI port identification from your terminal — for the open ports your scanner
20
+ (nmap, Nessus) couldn't fingerprint. The CLI talks to the same engine as
21
+ [scan.exploitsynth.com](https://scan.exploitsynth.com); your scans, projects,
22
+ and credits are shared.
23
+
24
+ ## Install
25
+
26
+ ```bash
27
+ pipx install exploitsynth # recommended — isolated, on your PATH
28
+ # or
29
+ pip install exploitsynth
30
+ ```
31
+
32
+ Optional tab-completion for your shell:
33
+
34
+ ```bash
35
+ exploitsynth --install-completion # bash | zsh | fish | powershell
36
+ ```
37
+
38
+ ## Authenticate
39
+
40
+ Grab an API key from **Settings → API keys** in the web app, then:
41
+
42
+ ```bash
43
+ exploitsynth login # prompts for the key, verifies, stores it
44
+ ```
45
+
46
+ The key lives in `~/.config/exploitsynth/config.json` (chmod 600). You can also
47
+ skip the file and export it per-shell:
48
+
49
+ ```bash
50
+ export EXPLOITSYNTH_API_KEY=sk_...
51
+ ```
52
+
53
+ ## Scan
54
+
55
+ ```bash
56
+ # Known-open ports — identify them directly
57
+ exploitsynth scan 45.33.32.156 --ports 22,80,9929
58
+
59
+ # Discovery — find open ports first, then identify
60
+ exploitsynth scan 10.0.0.0/28 --scope top1000
61
+
62
+ # Import — feed the ports your scanner left unidentified
63
+ exploitsynth scan --nessus engagement.nessus --project acme
64
+ exploitsynth scan --nmap recon.xml --project acme
65
+ ```
66
+
67
+ ### Chain it after your scanner
68
+
69
+ `exploitsynth` reads targets from **stdin** (`-`) or a file (`-iL`), so it drops
70
+ straight into a recon pipeline — point a fast scanner at the network, then let
71
+ ExploitSynth identify what it couldn't:
72
+
73
+ ```bash
74
+ # pipe targets in
75
+ rustscan -a 10.0.0.5 --ports-only | exploitsynth scan - --ports 22,80,9929
76
+
77
+ # or a host list
78
+ exploitsynth scan -iL hosts.txt --scope top100
79
+ ```
80
+
81
+ Live per-port progress streams into your terminal, with the same per-port
82
+ timeout countdown you see in the web app. Each scan costs **1 credit per port**;
83
+ the cost is previewed (and confirmed in an interactive shell) before it runs.
84
+
85
+ ### Scan a private network (`--via local`)
86
+
87
+ Targets on an internal network (`10.x`, `192.168.x`) or behind a firewall that
88
+ only allows *your* source IP aren't reachable from the cloud. `--via local` solves
89
+ this: discovery runs on **your** machine, and a reverse tunnel routes the engine's
90
+ probes back out through **your** machine — so the scan reaches anything *you* can
91
+ reach. Typical HTB / internal-pentest flow:
92
+
93
+ ```bash
94
+ # 1. get on the network (client VPN, on-site LAN, HTB, …)
95
+ sudo openvpn engagement.ovpn # you can now reach 10.129.45.12
96
+
97
+ # 2. one command
98
+ exploitsynth scan 10.129.45.12 --via local --scope top1000
99
+ ```
100
+
101
+ What happens: local `nmap` finds the open ports, the CLI opens an outbound tunnel
102
+ (no inbound ports needed), and the cloud identifies each service *through* that
103
+ tunnel. The agent, prompts, and LLM stay in the cloud — only network egress is
104
+ borrowed from your box.
105
+
106
+ Requirements & notes:
107
+
108
+ - You must be on a network that can reach the target (the CLI says so if you're not).
109
+ - `nmap` must be installed; `chisel` is fetched automatically if it isn't on PATH.
110
+ - The tunnel only lives while the command runs, so `--via local` streams live and
111
+ can't be combined with `--no-follow`. Ctrl-C tears the tunnel down.
112
+ - Cost is the number of open ports found (discovery is free — it's your nmap).
113
+
114
+ ### Options
115
+
116
+ | Flag | Meaning |
117
+ |------|---------|
118
+ | `--ports 22,80,9929` | Known-open ports to identify directly (skips discovery) |
119
+ | `--scope top100\|top1000\|all` | Discovery scope (or a range like `1-1000`) |
120
+ | `--via local` | Scan a private/firewalled target through a tunnel out of this machine |
121
+ | `-iL FILE` | Read newline/comma-separated targets from a file |
122
+ | `-` (as TARGET) | Read targets from stdin |
123
+ | `--nessus FILE` / `--nmap FILE` | Import unidentified ports from a scan export |
124
+ | `--project NAME` | Engagement to file the scan under (created if missing) |
125
+ | `--label TEXT` | Optional scan label |
126
+ | `--timeout 300` | Per-port agent budget in seconds (30–600) |
127
+ | `--slow` | Run one agent at a time instead of three |
128
+ | `--no-follow` | Fire-and-forget; don't stream progress |
129
+ | `--yes` | Skip the credit-cost confirmation |
130
+ | `--json` | Emit machine-readable JSON on stdout |
131
+
132
+ ## Inspect
133
+
134
+ ```bash
135
+ exploitsynth scans # recent scans
136
+ exploitsynth scans --project acme
137
+ exploitsynth show <scan_id> # full result table
138
+ exploitsynth show <scan_id> --reasoning # include the agent's reasoning
139
+ exploitsynth credits # your credit balance
140
+ exploitsynth cancel <scan_id> # cancel a queued/running scan
141
+ ```
142
+
143
+ ### Scripting
144
+
145
+ Every read command supports `--json` (printed to stdout; progress and notes go to
146
+ stderr, so pipes stay clean):
147
+
148
+ ```bash
149
+ exploitsynth scans --json | jq '.[] | {id, status}'
150
+ exploitsynth show <scan_id> --json | jq '.results[] | {port, service, version}'
151
+ ```
152
+
153
+ Exit codes: `0` success, `1` error, `3` insufficient credits.
154
+
155
+ ## Self-hosting
156
+
157
+ Point the CLI at your own deployment:
158
+
159
+ ```bash
160
+ exploitsynth login --url https://scan.example.com
161
+ # or
162
+ export EXPLOITSYNTH_API_URL=https://scan.example.com
163
+ ```
@@ -0,0 +1,147 @@
1
+ # ExploitSynth CLI
2
+
3
+ AI port identification from your terminal — for the open ports your scanner
4
+ (nmap, Nessus) couldn't fingerprint. The CLI talks to the same engine as
5
+ [scan.exploitsynth.com](https://scan.exploitsynth.com); your scans, projects,
6
+ and credits are shared.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ pipx install exploitsynth # recommended — isolated, on your PATH
12
+ # or
13
+ pip install exploitsynth
14
+ ```
15
+
16
+ Optional tab-completion for your shell:
17
+
18
+ ```bash
19
+ exploitsynth --install-completion # bash | zsh | fish | powershell
20
+ ```
21
+
22
+ ## Authenticate
23
+
24
+ Grab an API key from **Settings → API keys** in the web app, then:
25
+
26
+ ```bash
27
+ exploitsynth login # prompts for the key, verifies, stores it
28
+ ```
29
+
30
+ The key lives in `~/.config/exploitsynth/config.json` (chmod 600). You can also
31
+ skip the file and export it per-shell:
32
+
33
+ ```bash
34
+ export EXPLOITSYNTH_API_KEY=sk_...
35
+ ```
36
+
37
+ ## Scan
38
+
39
+ ```bash
40
+ # Known-open ports — identify them directly
41
+ exploitsynth scan 45.33.32.156 --ports 22,80,9929
42
+
43
+ # Discovery — find open ports first, then identify
44
+ exploitsynth scan 10.0.0.0/28 --scope top1000
45
+
46
+ # Import — feed the ports your scanner left unidentified
47
+ exploitsynth scan --nessus engagement.nessus --project acme
48
+ exploitsynth scan --nmap recon.xml --project acme
49
+ ```
50
+
51
+ ### Chain it after your scanner
52
+
53
+ `exploitsynth` reads targets from **stdin** (`-`) or a file (`-iL`), so it drops
54
+ straight into a recon pipeline — point a fast scanner at the network, then let
55
+ ExploitSynth identify what it couldn't:
56
+
57
+ ```bash
58
+ # pipe targets in
59
+ rustscan -a 10.0.0.5 --ports-only | exploitsynth scan - --ports 22,80,9929
60
+
61
+ # or a host list
62
+ exploitsynth scan -iL hosts.txt --scope top100
63
+ ```
64
+
65
+ Live per-port progress streams into your terminal, with the same per-port
66
+ timeout countdown you see in the web app. Each scan costs **1 credit per port**;
67
+ the cost is previewed (and confirmed in an interactive shell) before it runs.
68
+
69
+ ### Scan a private network (`--via local`)
70
+
71
+ Targets on an internal network (`10.x`, `192.168.x`) or behind a firewall that
72
+ only allows *your* source IP aren't reachable from the cloud. `--via local` solves
73
+ this: discovery runs on **your** machine, and a reverse tunnel routes the engine's
74
+ probes back out through **your** machine — so the scan reaches anything *you* can
75
+ reach. Typical HTB / internal-pentest flow:
76
+
77
+ ```bash
78
+ # 1. get on the network (client VPN, on-site LAN, HTB, …)
79
+ sudo openvpn engagement.ovpn # you can now reach 10.129.45.12
80
+
81
+ # 2. one command
82
+ exploitsynth scan 10.129.45.12 --via local --scope top1000
83
+ ```
84
+
85
+ What happens: local `nmap` finds the open ports, the CLI opens an outbound tunnel
86
+ (no inbound ports needed), and the cloud identifies each service *through* that
87
+ tunnel. The agent, prompts, and LLM stay in the cloud — only network egress is
88
+ borrowed from your box.
89
+
90
+ Requirements & notes:
91
+
92
+ - You must be on a network that can reach the target (the CLI says so if you're not).
93
+ - `nmap` must be installed; `chisel` is fetched automatically if it isn't on PATH.
94
+ - The tunnel only lives while the command runs, so `--via local` streams live and
95
+ can't be combined with `--no-follow`. Ctrl-C tears the tunnel down.
96
+ - Cost is the number of open ports found (discovery is free — it's your nmap).
97
+
98
+ ### Options
99
+
100
+ | Flag | Meaning |
101
+ |------|---------|
102
+ | `--ports 22,80,9929` | Known-open ports to identify directly (skips discovery) |
103
+ | `--scope top100\|top1000\|all` | Discovery scope (or a range like `1-1000`) |
104
+ | `--via local` | Scan a private/firewalled target through a tunnel out of this machine |
105
+ | `-iL FILE` | Read newline/comma-separated targets from a file |
106
+ | `-` (as TARGET) | Read targets from stdin |
107
+ | `--nessus FILE` / `--nmap FILE` | Import unidentified ports from a scan export |
108
+ | `--project NAME` | Engagement to file the scan under (created if missing) |
109
+ | `--label TEXT` | Optional scan label |
110
+ | `--timeout 300` | Per-port agent budget in seconds (30–600) |
111
+ | `--slow` | Run one agent at a time instead of three |
112
+ | `--no-follow` | Fire-and-forget; don't stream progress |
113
+ | `--yes` | Skip the credit-cost confirmation |
114
+ | `--json` | Emit machine-readable JSON on stdout |
115
+
116
+ ## Inspect
117
+
118
+ ```bash
119
+ exploitsynth scans # recent scans
120
+ exploitsynth scans --project acme
121
+ exploitsynth show <scan_id> # full result table
122
+ exploitsynth show <scan_id> --reasoning # include the agent's reasoning
123
+ exploitsynth credits # your credit balance
124
+ exploitsynth cancel <scan_id> # cancel a queued/running scan
125
+ ```
126
+
127
+ ### Scripting
128
+
129
+ Every read command supports `--json` (printed to stdout; progress and notes go to
130
+ stderr, so pipes stay clean):
131
+
132
+ ```bash
133
+ exploitsynth scans --json | jq '.[] | {id, status}'
134
+ exploitsynth show <scan_id> --json | jq '.results[] | {port, service, version}'
135
+ ```
136
+
137
+ Exit codes: `0` success, `1` error, `3` insufficient credits.
138
+
139
+ ## Self-hosting
140
+
141
+ Point the CLI at your own deployment:
142
+
143
+ ```bash
144
+ exploitsynth login --url https://scan.example.com
145
+ # or
146
+ export EXPLOITSYNTH_API_URL=https://scan.example.com
147
+ ```
@@ -0,0 +1,3 @@
1
+ """ExploitSynth scanner CLI."""
2
+
3
+ __version__ = "0.3.0"
@@ -0,0 +1,4 @@
1
+ from exploitsynth.cli import app
2
+
3
+ if __name__ == "__main__":
4
+ app()