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.
- exploitsynth-0.3.0/.gitignore +6 -0
- exploitsynth-0.3.0/PKG-INFO +163 -0
- exploitsynth-0.3.0/README.md +147 -0
- exploitsynth-0.3.0/exploitsynth/__init__.py +3 -0
- exploitsynth-0.3.0/exploitsynth/__main__.py +4 -0
- exploitsynth-0.3.0/exploitsynth/cli.py +436 -0
- exploitsynth-0.3.0/exploitsynth/client.py +128 -0
- exploitsynth-0.3.0/exploitsynth/config.py +53 -0
- exploitsynth-0.3.0/exploitsynth/discover.py +72 -0
- exploitsynth-0.3.0/exploitsynth/live.py +179 -0
- exploitsynth-0.3.0/exploitsynth/output.py +57 -0
- exploitsynth-0.3.0/exploitsynth/parsers/__init__.py +59 -0
- exploitsynth-0.3.0/exploitsynth/parsers/nessus.py +55 -0
- exploitsynth-0.3.0/exploitsynth/parsers/nmap.py +55 -0
- exploitsynth-0.3.0/exploitsynth/ports.py +63 -0
- exploitsynth-0.3.0/exploitsynth/targets.py +55 -0
- exploitsynth-0.3.0/exploitsynth/tunnel.py +158 -0
- exploitsynth-0.3.0/pyproject.toml +29 -0
|
@@ -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
|
+
```
|