@integsec/agentic-pentest-proxy 0.2.4 → 0.2.6
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.
- package/LICENSE +201 -0
- package/README.md +250 -54
- package/dist/bin/integsec-agentic-pentest-manifest.d.ts +3 -0
- package/dist/bin/integsec-agentic-pentest-manifest.d.ts.map +1 -0
- package/dist/bin/integsec-agentic-pentest-manifest.js +180 -0
- package/dist/bin/integsec-agentic-pentest-manifest.js.map +1 -0
- package/dist/bin/integsec-agentic-pentest-proxy.d.ts +1 -1
- package/dist/bin/integsec-agentic-pentest-proxy.d.ts.map +1 -1
- package/dist/bin/integsec-agentic-pentest-proxy.js +16 -4
- package/dist/bin/integsec-agentic-pentest-proxy.js.map +1 -1
- package/dist/src/audit/azure-monitor.d.ts +2 -2
- package/dist/src/audit/azure-monitor.d.ts.map +1 -1
- package/dist/src/audit/azure-monitor.js +8 -5
- package/dist/src/audit/azure-monitor.js.map +1 -1
- package/dist/src/audit/cloudwatch.d.ts.map +1 -1
- package/dist/src/audit/cloudwatch.js.map +1 -1
- package/dist/src/audit/gcp-logging.d.ts.map +1 -1
- package/dist/src/audit/gcp-logging.js +4 -6
- package/dist/src/audit/gcp-logging.js.map +1 -1
- package/dist/src/audit/index.d.ts +7 -0
- package/dist/src/audit/index.d.ts.map +1 -1
- package/dist/src/audit/index.js +11 -1
- package/dist/src/audit/index.js.map +1 -1
- package/dist/src/audit/local.d.ts.map +1 -1
- package/dist/src/audit/local.js +2 -1
- package/dist/src/audit/local.js.map +1 -1
- package/dist/src/builder/dry-run.d.ts +12 -0
- package/dist/src/builder/dry-run.d.ts.map +1 -0
- package/dist/src/builder/dry-run.js +103 -0
- package/dist/src/builder/dry-run.js.map +1 -0
- package/dist/src/builder/manifest-writer.d.ts +7 -0
- package/dist/src/builder/manifest-writer.d.ts.map +1 -0
- package/dist/src/builder/manifest-writer.js +17 -0
- package/dist/src/builder/manifest-writer.js.map +1 -0
- package/dist/src/builder/review-display.d.ts +10 -0
- package/dist/src/builder/review-display.d.ts.map +1 -0
- package/dist/src/builder/review-display.js +55 -0
- package/dist/src/builder/review-display.js.map +1 -0
- package/dist/src/builder/smart-validator.d.ts +39 -0
- package/dist/src/builder/smart-validator.d.ts.map +1 -0
- package/dist/src/builder/smart-validator.js +157 -0
- package/dist/src/builder/smart-validator.js.map +1 -0
- package/dist/src/builder/steps/domains.d.ts +10 -0
- package/dist/src/builder/steps/domains.d.ts.map +1 -0
- package/dist/src/builder/steps/domains.js +71 -0
- package/dist/src/builder/steps/domains.js.map +1 -0
- package/dist/src/builder/steps/engagement-info.d.ts +17 -0
- package/dist/src/builder/steps/engagement-info.d.ts.map +1 -0
- package/dist/src/builder/steps/engagement-info.js +49 -0
- package/dist/src/builder/steps/engagement-info.js.map +1 -0
- package/dist/src/builder/steps/engagement-window.d.ts +15 -0
- package/dist/src/builder/steps/engagement-window.d.ts.map +1 -0
- package/dist/src/builder/steps/engagement-window.js +57 -0
- package/dist/src/builder/steps/engagement-window.js.map +1 -0
- package/dist/src/builder/steps/exclusions.d.ts +13 -0
- package/dist/src/builder/steps/exclusions.d.ts.map +1 -0
- package/dist/src/builder/steps/exclusions.js +57 -0
- package/dist/src/builder/steps/exclusions.js.map +1 -0
- package/dist/src/builder/steps/ip-ranges.d.ts +10 -0
- package/dist/src/builder/steps/ip-ranges.d.ts.map +1 -0
- package/dist/src/builder/steps/ip-ranges.js +64 -0
- package/dist/src/builder/steps/ip-ranges.js.map +1 -0
- package/dist/src/builder/steps/review.d.ts +10 -0
- package/dist/src/builder/steps/review.d.ts.map +1 -0
- package/dist/src/builder/steps/review.js +29 -0
- package/dist/src/builder/steps/review.js.map +1 -0
- package/dist/src/builder/steps/techniques.d.ts +13 -0
- package/dist/src/builder/steps/techniques.d.ts.map +1 -0
- package/dist/src/builder/steps/techniques.js +68 -0
- package/dist/src/builder/steps/techniques.js.map +1 -0
- package/dist/src/builder/steps/urls-and-cloud.d.ts +15 -0
- package/dist/src/builder/steps/urls-and-cloud.d.ts.map +1 -0
- package/dist/src/builder/steps/urls-and-cloud.js +53 -0
- package/dist/src/builder/steps/urls-and-cloud.js.map +1 -0
- package/dist/src/builder/web/api.d.ts +9 -0
- package/dist/src/builder/web/api.d.ts.map +1 -0
- package/dist/src/builder/web/api.js +40 -0
- package/dist/src/builder/web/api.js.map +1 -0
- package/dist/src/builder/web/client-form.html +222 -0
- package/dist/src/builder/web/server.d.ts +14 -0
- package/dist/src/builder/web/server.d.ts.map +1 -0
- package/dist/src/builder/web/server.js +85 -0
- package/dist/src/builder/web/server.js.map +1 -0
- package/dist/src/builder/wizard.d.ts +9 -0
- package/dist/src/builder/wizard.d.ts.map +1 -0
- package/dist/src/builder/wizard.js +49 -0
- package/dist/src/builder/wizard.js.map +1 -0
- package/dist/src/config.d.ts +11 -1
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js +15 -2
- package/dist/src/config.js.map +1 -1
- package/dist/src/dns-resolver.d.ts +10 -1
- package/dist/src/dns-resolver.d.ts.map +1 -1
- package/dist/src/dns-resolver.js +41 -3
- package/dist/src/dns-resolver.js.map +1 -1
- package/dist/src/extractor.d.ts +12 -0
- package/dist/src/extractor.d.ts.map +1 -1
- package/dist/src/extractor.js +386 -0
- package/dist/src/extractor.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/ip-matcher.d.ts +23 -0
- package/dist/src/ip-matcher.d.ts.map +1 -1
- package/dist/src/ip-matcher.js +96 -23
- package/dist/src/ip-matcher.js.map +1 -1
- package/dist/src/manifest-schema.d.ts +12 -62
- package/dist/src/manifest-schema.d.ts.map +1 -1
- package/dist/src/manifest.d.ts +6 -0
- package/dist/src/manifest.d.ts.map +1 -1
- package/dist/src/manifest.js +21 -6
- package/dist/src/manifest.js.map +1 -1
- package/dist/src/proxy.d.ts +19 -4
- package/dist/src/proxy.d.ts.map +1 -1
- package/dist/src/proxy.js +111 -33
- package/dist/src/proxy.js.map +1 -1
- package/dist/src/safe-filename.d.ts +3 -0
- package/dist/src/safe-filename.d.ts.map +1 -0
- package/dist/src/safe-filename.js +8 -0
- package/dist/src/safe-filename.js.map +1 -0
- package/dist/src/sanitizer.d.ts.map +1 -1
- package/dist/src/sanitizer.js +36 -10
- package/dist/src/sanitizer.js.map +1 -1
- package/dist/src/technique-checker.d.ts +14 -0
- package/dist/src/technique-checker.d.ts.map +1 -1
- package/dist/src/technique-checker.js +123 -2
- package/dist/src/technique-checker.js.map +1 -1
- package/dist/src/transports/http.d.ts +6 -2
- package/dist/src/transports/http.d.ts.map +1 -1
- package/dist/src/transports/http.js +101 -13
- package/dist/src/transports/http.js.map +1 -1
- package/dist/src/transports/sse.d.ts +13 -0
- package/dist/src/transports/sse.d.ts.map +1 -0
- package/dist/src/transports/sse.js +161 -0
- package/dist/src/transports/sse.js.map +1 -0
- package/dist/src/transports/stdio.d.ts +2 -2
- package/dist/src/transports/stdio.d.ts.map +1 -1
- package/dist/src/transports/stdio.js +77 -48
- package/dist/src/transports/stdio.js.map +1 -1
- package/dist/src/types.d.ts +1 -1
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/validator.d.ts +19 -28
- package/dist/src/validator.d.ts.map +1 -1
- package/dist/src/validator.js +315 -113
- package/dist/src/validator.js.map +1 -1
- package/examples/claude-desktop-burp-config.json +6 -6
- package/package.json +21 -11
package/README.md
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# IntegSec Agentic Pentest
|
|
1
|
+
# IntegSec Agentic Pentest Proxy
|
|
2
2
|
|
|
3
3
|
**Scope enforcement proxy for AI-driven penetration testing.**
|
|
4
4
|
|
|
5
|
-
The IntegSec Agentic Pentest MCP Proxy sits between an AI agent (Claude, GPT, etc.) and an MCP tool server ([TurboPentest](https://turbopentest.com), Nuclei MCP, etc.),
|
|
5
|
+
The IntegSec Agentic Pentest MCP Proxy sits between an AI agent (Claude, GPT, etc.) and an MCP tool server ([TurboPentest](https://turbopentest.com), Nuclei MCP, etc.), checking MCP `tools/call` requests against a scope manifest before forwarding them. It blocks targets, techniques, and engagement times it can identify as unauthorized and writes audit decisions locally.
|
|
6
6
|
|
|
7
7
|
Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testing and threat simulation for modern organizations moving at AI speed.
|
|
8
8
|
|
|
@@ -21,14 +21,16 @@ Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testin
|
|
|
21
21
|
+-----------+
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
> **Using AI agents for pentesting?** [TurboPentest](https://turbopentest.com) delivers agentic penetration testing powered by Claude — 15 orchestrated security tools, OWASP Top 10 coverage, results in under 4 hours, blockchain-attested reports. Starting at $99/domain.
|
|
24
|
+
> **Using AI agents for pentesting?** [TurboPentest](https://turbopentest.com) delivers agentic penetration testing powered by Claude — 15 orchestrated security tools, OWASP Top 10 coverage, results in under 4 hours, blockchain-attested reports. Starting at $99/domain. Use this proxy with MCP servers like Burp Suite, Kali MCP, Nmap, and more for scope-safe autonomous testing.
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
28
28
|
## Table of Contents
|
|
29
29
|
|
|
30
30
|
- [Why This Exists](#why-this-exists)
|
|
31
|
+
- [Security Boundaries](#security-boundaries)
|
|
31
32
|
- [Features](#features)
|
|
33
|
+
- [Supported MCP Servers](#supported-mcp-servers)
|
|
32
34
|
- [Quick Start](#quick-start)
|
|
33
35
|
- [Installation](#installation)
|
|
34
36
|
- [Configuration](#configuration)
|
|
@@ -39,12 +41,14 @@ Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testin
|
|
|
39
41
|
- [CLI](#cli)
|
|
40
42
|
- [Claude Desktop Integration](#claude-desktop-integration)
|
|
41
43
|
- [Claude Code Integration](#claude-code-integration)
|
|
44
|
+
- [Burp Suite Integration](#burp-suite-integration)
|
|
42
45
|
- [Docker](#docker)
|
|
43
46
|
- [HTTP Mode](#http-mode)
|
|
44
47
|
- [TUI Monitor](#tui-monitor)
|
|
45
48
|
- [How Validation Works](#how-validation-works)
|
|
46
49
|
- [Audit Logging](#audit-logging)
|
|
47
50
|
- [Examples](#examples)
|
|
51
|
+
- [Manifest Builder](#manifest-builder)
|
|
48
52
|
- [Contributing](#contributing)
|
|
49
53
|
- [Architecture](#architecture)
|
|
50
54
|
- [Development Setup](#development-setup)
|
|
@@ -63,17 +67,24 @@ Built by **[IntegSec](https://integsec.com)** — offensive cybersecurity testin
|
|
|
63
67
|
|
|
64
68
|
AI agents equipped with offensive security tools (nmap, sqlmap, Metasploit, etc.) can cause serious harm if they stray outside an authorized engagement scope. A misconfigured prompt or hallucinated target can turn a legitimate pentest into an unauthorized attack.
|
|
65
69
|
|
|
66
|
-
The IntegSec Agentic Pentest MCP Proxy
|
|
70
|
+
The IntegSec Agentic Pentest MCP Proxy enforces scope at the protocol layer. Every tool invocation is checked against a scope manifest before it reaches the upstream MCP server. If the target, technique, or timing is wrong, the call is blocked and logged.
|
|
67
71
|
|
|
68
72
|
**No prompt engineering. No honor system. Enforcement.**
|
|
69
73
|
|
|
74
|
+
## Security Boundaries
|
|
75
|
+
|
|
76
|
+
The proxy checks the arguments it can see in MCP `tools/call` requests. It cannot control destinations chosen inside an upstream tool, HTTP redirects, DNS changes between validation and execution, targets read from files or encoded payloads, or traffic that bypasses MCP. Use network egress controls and review each upstream tool's schema before relying on this proxy for an engagement. Keep free-form commands disabled with the default `ALLOW_UNSTRUCTURED_COMMANDS=false`.
|
|
77
|
+
|
|
78
|
+
Cloud logging failures do not stop tool calls. Monitor the writable local audit directory and alert on logging errors. For remote HTTP clients, place the proxy behind TLS and set `PROXY_AUTH_TOKEN`.
|
|
79
|
+
|
|
70
80
|
|
|
71
81
|
---
|
|
72
82
|
|
|
73
83
|
## Features
|
|
74
84
|
|
|
75
|
-
- **
|
|
76
|
-
- **
|
|
85
|
+
- **Multi-stage validation pipeline** — request shape, technique, time window, target extraction, CIDR containment, DNS resolution, exclusion, authorization, default deny
|
|
86
|
+
- **Every target checked** — arrays, comma/space-separated lists, nested option objects, and `host:port` values are checked; free-form commands are blocked by default
|
|
87
|
+
- **Fail-closed design** — DNS failures, malformed requests, unparseable JSON, internal errors and expired windows all result in blocks; JSON-RPC batches are checked element by element
|
|
77
88
|
- **19 tool extractors + smart fallback** — built-in parameter extraction for nmap, sqlmap, burp, curl, metasploit, nuclei, gobuster, ffuf, nikto, and more, with generic fallback for unknown tools
|
|
78
89
|
- **Wildcard domain matching** — `*.acme.com` matches `app.acme.com` but not `deep.sub.acme.com`
|
|
79
90
|
- **CIDR + IPv6 support** — authorize by IP range, detect RFC-1918 private ranges and cloud metadata endpoints
|
|
@@ -81,13 +92,61 @@ The IntegSec Agentic Pentest MCP Proxy solves this by enforcing scope at the pro
|
|
|
81
92
|
- **Technique blocking** — categorize tools into `dos`, `destructive`, `social_engineering`, etc., with custom mappings
|
|
82
93
|
- **Parameter sanitization** — passwords, tokens, API keys, and secrets are redacted before logging
|
|
83
94
|
- **Multi-backend audit logging** — local JSONL, AWS CloudWatch, Azure Monitor, GCP Cloud Logging
|
|
84
|
-
- **
|
|
95
|
+
- **Three transport modes** — stdio (child process), SSE (stdio-to-SSE bridge, e.g. Burp) and HTTP (reverse proxy)
|
|
85
96
|
- **Cloud-native manifest loading** — load scope from file, env var, AWS Secrets Manager, Azure Key Vault, or GCP Secret Manager
|
|
86
97
|
- **Docker-ready** — multi-stage build, runs as non-root user
|
|
87
98
|
- **Zero runtime config files** — everything via environment variables
|
|
88
99
|
|
|
89
100
|
---
|
|
90
101
|
|
|
102
|
+
## Supported MCP Servers
|
|
103
|
+
|
|
104
|
+
Built-in target extraction and technique categorization for the following tools and MCP servers. Unlisted tools still receive scope enforcement via the generic parameter fallback (`target`, `url`, `host`, `domain`, etc.).
|
|
105
|
+
|
|
106
|
+
### Subdomain Enumeration
|
|
107
|
+
[amass](https://github.com/owasp-amass/amass) · [alterx](https://github.com/projectdiscovery/alterx) · [assetfinder](https://github.com/tomnomnom/assetfinder) · [subfinder](https://github.com/projectdiscovery/subfinder) · [shuffledns](https://github.com/projectdiscovery/shuffledns) · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
|
|
108
|
+
|
|
109
|
+
### DNS & Certificate
|
|
110
|
+
[dnsx](https://github.com/projectdiscovery/dnsx) · [cero](https://github.com/glebarez/cero) · [crtsh](https://crt.sh) · [Shodan MCP](https://github.com/BurtTheCoder/mcp-shodan) (BurtTheCoder) · [Shodan MCP](https://github.com/Vorota-ai/shodan-mcp) (Vorota-ai)
|
|
111
|
+
|
|
112
|
+
### HTTP Probing
|
|
113
|
+
[httpx](https://github.com/projectdiscovery/httpx) · [katana](https://github.com/projectdiscovery/katana) · [gowitness](https://github.com/sensepost/gowitness) · [Burp Suite MCP](https://github.com/PortSwigger/mcp-server) · [Postman MCP](https://github.com/postmanlabs/postman-mcp-server)
|
|
114
|
+
|
|
115
|
+
### Port Scanning
|
|
116
|
+
[nmap](https://github.com/nmap/nmap) · [nmap_scan](https://github.com/nmap/nmap) · [masscan](https://github.com/robertdavidgraham/masscan) · [Nmap MCP Server](https://github.com/mohdhaji87/nmap-mcp-server) · [Awesome Kali MCP Servers](https://github.com/ccq1/awsome_kali_MCPServers) · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
|
|
117
|
+
|
|
118
|
+
### Web App Testing
|
|
119
|
+
[nuclei](https://github.com/projectdiscovery/nuclei) · [ffuf](https://github.com/ffuf/ffuf) · [gobuster](https://github.com/OJ/gobuster) · [dirb](https://sourceforge.net/projects/dirb) · [arjun](https://github.com/s0md3v/Arjun) · [sqlmap](https://github.com/sqlmapproject/sqlmap) · [dalfox](https://github.com/hahwul/dalfox) · [smuggler](https://github.com/defparam/smuggler) · [nikto](https://github.com/sullo/nikto) · [wpscan](https://github.com/wpscanteam/wpscan) · [nessus](https://www.tenable.com/products/nessus) · [zap](https://github.com/zaproxy/zaproxy) · [burpsuite](https://portswigger.net/burp) · [burp_scan](https://portswigger.net/burp) · [burp_active_scan](https://portswigger.net/burp) · [Burp Suite MCP](https://github.com/PortSwigger/mcp-server) (PortSwigger) · [Acunetix MCP](https://github.com/therealcoiffeur/MCPwnetix) · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp) · **Next.js Scanner** · **Unified All-in-One MCP**
|
|
120
|
+
|
|
121
|
+
### SSL/TLS & Headers
|
|
122
|
+
**SSLScan MCP** · **HTTP Headers** (Custom MCP) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
|
|
123
|
+
|
|
124
|
+
### OSINT & Threat Intel
|
|
125
|
+
[uncover](https://github.com/projectdiscovery/uncover) · [waybackurls](https://github.com/tomnomnom/waybackurls) · [shodan](https://www.shodan.io) · [virustotal](https://www.virustotal.com) · [bloodhound](https://github.com/BloodHoundAD/BloodHound) · [notify](https://github.com/projectdiscovery/notify) · [Shodan MCP](https://github.com/BurtTheCoder/mcp-shodan) (BurtTheCoder) · [Shodan MCP](https://github.com/Vorota-ai/shodan-mcp) (Vorota-ai) · [WireMCP](https://github.com/0xKoda/WireMCP) · [VirusTotal MCP](https://github.com/BurtTheCoder/mcp-virustotal)
|
|
126
|
+
|
|
127
|
+
### Exploitation
|
|
128
|
+
[metasploit](https://github.com/rapid7/metasploit-framework) · [`msf_*`](https://github.com/rapid7/metasploit-framework) · [hydra](https://github.com/vanhauser-thc/thc-hydra) · [hashcat](https://github.com/hashcat/hashcat) · **CrackMapExec MCP** · **Commix MCP** · [Hex Strike AI MCP](https://github.com/0x4m4/hexstrike-ai) · [Kali Linux MCP](https://github.com/k3nn3dy-ai/kali-mcp)
|
|
129
|
+
|
|
130
|
+
### Cloud Security
|
|
131
|
+
[prowler](https://github.com/prowler-cloud/prowler) · [scoutsuite](https://github.com/nccgroup/ScoutSuite)
|
|
132
|
+
|
|
133
|
+
### Container & IaC
|
|
134
|
+
[trivy](https://github.com/aquasecurity/trivy) · [checkov](https://github.com/bridgecrewio/checkov)
|
|
135
|
+
|
|
136
|
+
### Kubernetes
|
|
137
|
+
[kube-hunter](https://github.com/aquasecurity/kube-hunter) · [kubeaudit](https://github.com/Shopify/kubeaudit) · [kube-bench](https://github.com/aquasecurity/kube-bench)
|
|
138
|
+
|
|
139
|
+
### Code Security
|
|
140
|
+
[Semgrep MCP](https://github.com/semgrep/mcp) · [Gitleaks MCP](https://github.com/FuzzingLabs/mcp-security-hub)
|
|
141
|
+
|
|
142
|
+
### Reverse Engineering
|
|
143
|
+
[Ghidra MCP](https://github.com/LaurieWired/GhidraMCP)
|
|
144
|
+
|
|
145
|
+
### Mobile Security
|
|
146
|
+
[MobSF MCP](https://github.com/pullkitsan/mobsf-mcp-server)
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
91
150
|
## Quick Start
|
|
92
151
|
|
|
93
152
|
```bash
|
|
@@ -144,8 +203,8 @@ npm install @integsec/agentic-pentest-proxy
|
|
|
144
203
|
### From source
|
|
145
204
|
|
|
146
205
|
```bash
|
|
147
|
-
git clone https://github.com/
|
|
148
|
-
cd agentic-pentest-
|
|
206
|
+
git clone https://github.com/IntegSec/agentic-pentest-proxy.git
|
|
207
|
+
cd agentic-pentest-proxy
|
|
149
208
|
npm install
|
|
150
209
|
npm run build
|
|
151
210
|
```
|
|
@@ -156,9 +215,10 @@ npm run build
|
|
|
156
215
|
docker build -t integsec-agentic-pentest-proxy .
|
|
157
216
|
docker run --rm \
|
|
158
217
|
-e SCOPE_MANIFEST_PATH=/scope.json \
|
|
159
|
-
-e MCP_TRANSPORT=
|
|
218
|
+
-e MCP_TRANSPORT=http \
|
|
160
219
|
-e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
|
|
161
220
|
-e PROXY_PORT=9090 \
|
|
221
|
+
-e PROXY_AUTH_TOKEN \
|
|
162
222
|
-v ./scope.json:/scope.json:ro \
|
|
163
223
|
-p 9090:9090 \
|
|
164
224
|
integsec-agentic-pentest-proxy
|
|
@@ -185,17 +245,22 @@ The scope manifest defines the boundaries of a penetration testing engagement. I
|
|
|
185
245
|
"authorized_targets": {
|
|
186
246
|
"ip_ranges": ["10.10.10.0/24", "203.0.113.0/28"],
|
|
187
247
|
"domains": ["*.acme.com", "acme-staging.example.com"],
|
|
248
|
+
// Authorizes the URL's scheme, host, port and path prefix
|
|
188
249
|
"urls": ["https://app.acme.com", "https://api.acme.com"],
|
|
250
|
+
// Matched against account parameters of cloud audit tools (prowler, scoutsuite)
|
|
189
251
|
"cloud_accounts": ["aws:123456789012"]
|
|
190
252
|
},
|
|
191
253
|
|
|
192
|
-
// Override: these are NEVER allowed even if they match above
|
|
254
|
+
// Override: these are NEVER allowed even if they match above.
|
|
255
|
+
// Accepts IPs, CIDRs ("203.0.113.0/30"), hostnames, wildcards ("*.hr.acme.com",
|
|
256
|
+
// any depth) and URLs (compared by hostname).
|
|
193
257
|
"excluded_targets": ["203.0.113.5", "hr.acme.com"],
|
|
194
258
|
|
|
195
|
-
//
|
|
196
|
-
|
|
259
|
+
// Allowed technique categories. When non-empty, a tool in any OTHER known
|
|
260
|
+
// category is blocked. Uncategorized tools are unaffected. [] = no restriction.
|
|
261
|
+
"authorized_techniques": ["recon", "web_app"],
|
|
197
262
|
|
|
198
|
-
// Tool categories that are always blocked
|
|
263
|
+
// Tool categories that are always blocked (wins over authorized_techniques)
|
|
199
264
|
"excluded_techniques": ["dos", "destructive", "social_engineering"],
|
|
200
265
|
|
|
201
266
|
// Time window — calls outside this range are blocked
|
|
@@ -225,16 +290,20 @@ The scope manifest defines the boundaries of a penetration testing engagement. I
|
|
|
225
290
|
| `SCOPE_MANIFEST_KEYVAULT_URI` | — | Azure Key Vault secret URI |
|
|
226
291
|
| `SCOPE_MANIFEST_GCP_SECRET` | — | GCP Secret Manager resource name |
|
|
227
292
|
| **Transport** | | |
|
|
228
|
-
| `MCP_TRANSPORT` | `stdio` |
|
|
293
|
+
| `MCP_TRANSPORT` | `stdio` | `stdio` (spawn upstream), `sse` (agent on stdio, upstream over SSE — e.g. Burp) or `http` (listen on `PROXY_HOST:PROXY_PORT`, reverse-proxy to upstream). Anything else is a startup error |
|
|
229
294
|
| `UPSTREAM_MCP_COMMAND` | — | Command to spawn upstream MCP (stdio mode) |
|
|
230
295
|
| `UPSTREAM_MCP_ARGS` | — | Comma-separated args for upstream command |
|
|
231
|
-
| `
|
|
232
|
-
| `
|
|
296
|
+
| `UPSTREAM_STARTUP_DELAY_MS` | `0` | stdio mode: hold messages until the upstream prints or this delay passes. Only needed for bridges that drop early messages |
|
|
297
|
+
| `UPSTREAM_MCP_URL` | — | Upstream MCP URL (`sse` and `http` modes) |
|
|
298
|
+
| `PROXY_PORT` | `9090` | Listen port (`http` mode) |
|
|
299
|
+
| `PROXY_HOST` | `127.0.0.1` | Listen address (`http` mode). The Docker image sets `0.0.0.0` |
|
|
300
|
+
| `PROXY_AUTH_TOKEN` | — | Required for non-loopback HTTP. Clients send it in `X-Proxy-Token`; use TLS termination for remote clients |
|
|
301
|
+
| `ALLOW_UNSTRUCTURED_COMMANDS` | `false` | Explicitly opt in to heuristic inspection of free-form command and argument fields; unsafe for strict scope enforcement |
|
|
233
302
|
| **Audit** | | |
|
|
234
303
|
| `AUDIT_LOG_PATH` | `./audit/` | Directory for local JSONL audit logs |
|
|
235
304
|
| `AWS_LOG_GROUP` | — | AWS CloudWatch log group name |
|
|
236
305
|
| `AWS_REGION` | — | AWS region for CloudWatch |
|
|
237
|
-
| `
|
|
306
|
+
| `AZURE_LOG_INGESTION_ENDPOINT` | — | DCR or DCE Logs Ingestion endpoint URL |
|
|
238
307
|
| `AZURE_DCR_IMMUTABLE_ID` | — | Azure Data Collection Rule immutable ID |
|
|
239
308
|
| `AZURE_DCR_STREAM_NAME` | `Custom-MCPProxyAudit_CL` | Azure DCR stream name |
|
|
240
309
|
| `GOOGLE_CLOUD_PROJECT` | — | GCP project ID for Cloud Logging |
|
|
@@ -242,13 +311,17 @@ The scope manifest defines the boundaries of a penetration testing engagement. I
|
|
|
242
311
|
| `TECHNIQUE_MAP_PATH` | — | Path to custom technique mappings JSON |
|
|
243
312
|
| `DNS_CACHE_TTL` | `60` | DNS cache TTL in seconds |
|
|
244
313
|
| `LOG_LEVEL` | `INFO` | Log verbosity |
|
|
245
|
-
| `PROXY_VERSION` | `0.
|
|
314
|
+
| `PROXY_VERSION` | `0.2.6` | Version string in audit entries |
|
|
246
315
|
|
|
247
316
|
See [`.env.example`](.env.example) for a complete template.
|
|
248
317
|
|
|
249
318
|
### Technique Mappings
|
|
250
319
|
|
|
251
|
-
The proxy ships with built-in technique categories
|
|
320
|
+
The proxy ships with built-in technique categories: `dos`, `destructive`, `social_engineering`, `recon`, `web_app`, `exploitation` and `cloud_audit` (see `src/technique-checker.ts` for the tool lists). Use these names in `authorized_techniques` / `excluded_techniques`.
|
|
321
|
+
|
|
322
|
+
`exact` entries match the whole tool name. `patterns` containing a separator (`nmap_`, `msf_`) match as substrings; purely alphanumeric patterns match whole words of the tool name or the end of a word (`dos` matches `dos_attack` and `ddos` but not `get_dossier`). All matching is case-insensitive.
|
|
323
|
+
|
|
324
|
+
You can extend these with a custom mapping file:
|
|
252
325
|
|
|
253
326
|
```json
|
|
254
327
|
{
|
|
@@ -263,7 +336,7 @@ The proxy ships with built-in technique categories (`dos`, `destructive`, `socia
|
|
|
263
336
|
}
|
|
264
337
|
```
|
|
265
338
|
|
|
266
|
-
Point `TECHNIQUE_MAP_PATH` at this file. Custom mappings are merged with built-in ones — they don't replace them.
|
|
339
|
+
Point `TECHNIQUE_MAP_PATH` at this file. Custom mappings are merged with built-in ones — they don't replace them. A missing or malformed file stops the proxy at startup rather than silently dropping your blocks.
|
|
267
340
|
|
|
268
341
|
---
|
|
269
342
|
|
|
@@ -278,14 +351,22 @@ UPSTREAM_MCP_COMMAND=npx \
|
|
|
278
351
|
UPSTREAM_MCP_ARGS="-y,@turbopentest/mcp-server" \
|
|
279
352
|
integsec-agentic-pentest-proxy
|
|
280
353
|
|
|
281
|
-
# HTTP mode — reverse proxy to a running MCP server
|
|
354
|
+
# HTTP mode — reverse proxy to a running MCP server (listens on 127.0.0.1:9090)
|
|
282
355
|
SCOPE_MANIFEST_PATH=./scope.json \
|
|
283
|
-
MCP_TRANSPORT=
|
|
356
|
+
MCP_TRANSPORT=http \
|
|
284
357
|
UPSTREAM_MCP_URL=http://localhost:8080 \
|
|
285
358
|
PROXY_PORT=9090 \
|
|
286
359
|
integsec-agentic-pentest-proxy
|
|
360
|
+
|
|
361
|
+
# SSE mode — agent talks stdio, proxy connects to an SSE upstream (no listening port)
|
|
362
|
+
SCOPE_MANIFEST_PATH=./scope.json \
|
|
363
|
+
MCP_TRANSPORT=sse \
|
|
364
|
+
UPSTREAM_MCP_URL=http://127.0.0.1:9876 \
|
|
365
|
+
integsec-agentic-pentest-proxy
|
|
287
366
|
```
|
|
288
367
|
|
|
368
|
+
In HTTP mode, point your MCP client at the proxy using the same path it would use on the upstream (e.g. `http://127.0.0.1:9090/mcp`). For a non-loopback listener, set `PROXY_AUTH_TOKEN` and configure the client to send `X-Proxy-Token`. Terminate TLS before the proxy when clients connect over a network.
|
|
369
|
+
|
|
289
370
|
### Claude Desktop Integration
|
|
290
371
|
|
|
291
372
|
Add to your Claude Desktop `claude_desktop_config.json`:
|
|
@@ -328,15 +409,42 @@ Add to your `.mcp.json` or project settings:
|
|
|
328
409
|
}
|
|
329
410
|
```
|
|
330
411
|
|
|
412
|
+
### Burp Suite Integration
|
|
413
|
+
|
|
414
|
+
The proxy connects directly to Burp Suite's MCP extension via SSE — no Java bridge jar needed.
|
|
415
|
+
|
|
416
|
+
1. Open Burp Suite Pro and enable the MCP extension (listening on port 9876)
|
|
417
|
+
2. Add to your `claude_desktop_config.json`:
|
|
418
|
+
|
|
419
|
+
```json
|
|
420
|
+
{
|
|
421
|
+
"mcpServers": {
|
|
422
|
+
"burp-scoped": {
|
|
423
|
+
"command": "integsec-agentic-pentest-proxy",
|
|
424
|
+
"args": [],
|
|
425
|
+
"env": {
|
|
426
|
+
"SCOPE_MANIFEST_PATH": "/path/to/scope.json",
|
|
427
|
+
"MCP_TRANSPORT": "sse",
|
|
428
|
+
"UPSTREAM_MCP_URL": "http://127.0.0.1:9876",
|
|
429
|
+
"AUDIT_LOG_PATH": "/path/to/audit"
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
The proxy validates `targetHostname` in Burp's `send_http1_request`, `send_http2_request`, `create_repeater_tab`, and `send_to_intruder` tools — blocking requests to out-of-scope targets.
|
|
437
|
+
|
|
331
438
|
### Docker
|
|
332
439
|
|
|
333
440
|
```bash
|
|
334
|
-
# HTTP mode
|
|
441
|
+
# HTTP mode (the image sets PROXY_HOST=0.0.0.0 so the published port is reachable)
|
|
335
442
|
docker run --rm \
|
|
336
443
|
-e SCOPE_MANIFEST_PATH=/scope.json \
|
|
337
|
-
-e MCP_TRANSPORT=
|
|
444
|
+
-e MCP_TRANSPORT=http \
|
|
338
445
|
-e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
|
|
339
446
|
-e PROXY_PORT=9090 \
|
|
447
|
+
-e PROXY_AUTH_TOKEN \
|
|
340
448
|
-v ./scope.json:/scope.json:ro \
|
|
341
449
|
-v ./audit:/app/audit \
|
|
342
450
|
-p 9090:9090 \
|
|
@@ -345,10 +453,11 @@ docker run --rm \
|
|
|
345
453
|
# With AWS CloudWatch
|
|
346
454
|
docker run --rm \
|
|
347
455
|
-e SCOPE_MANIFEST_SECRET_ARN=arn:aws:secretsmanager:us-east-1:123456789012:secret:scope \
|
|
348
|
-
-e MCP_TRANSPORT=
|
|
456
|
+
-e MCP_TRANSPORT=http \
|
|
349
457
|
-e UPSTREAM_MCP_URL=http://host.docker.internal:8080 \
|
|
350
458
|
-e AWS_LOG_GROUP=/integsec/mcp-proxy \
|
|
351
459
|
-e AWS_REGION=us-east-1 \
|
|
460
|
+
-e PROXY_AUTH_TOKEN \
|
|
352
461
|
-p 9090:9090 \
|
|
353
462
|
integsec-agentic-pentest-proxy
|
|
354
463
|
```
|
|
@@ -382,38 +491,58 @@ Run the TUI in a separate terminal while the proxy is active (via Claude Desktop
|
|
|
382
491
|
|
|
383
492
|
## How Validation Works
|
|
384
493
|
|
|
385
|
-
Every `tools/call` JSON-RPC message
|
|
494
|
+
Every `tools/call` JSON-RPC message (including each element of a JSON-RPC batch) passes through this pipeline:
|
|
386
495
|
|
|
387
496
|
```
|
|
388
|
-
|
|
497
|
+
0. REQUEST SHAPE ────▶ Tool name a string? Arguments a JSON object?
|
|
498
|
+
│ NO → BLOCKED_INVALID_REQUEST
|
|
499
|
+
▼
|
|
500
|
+
1. TECHNIQUE CHECK ──▶ Tool in an excluded_techniques category, or in a known
|
|
501
|
+
│ category missing from a non-empty authorized_techniques?
|
|
389
502
|
│ YES → BLOCKED_TECHNIQUE
|
|
390
503
|
▼
|
|
391
504
|
2. TIME WINDOW ──────▶ Is current time within engagement_window?
|
|
392
505
|
│ NO → BLOCKED_OUTSIDE_WINDOW
|
|
393
506
|
▼
|
|
394
|
-
|
|
395
|
-
│
|
|
507
|
+
COMMAND CHECK ─────▶ Free-form command fields present without opt-in?
|
|
508
|
+
│ YES → BLOCKED_UNINSPECTABLE_COMMAND
|
|
509
|
+
▼
|
|
510
|
+
3. TARGET EXTRACTION ▶ Extract EVERY hostname/IP/CIDR from the parameters
|
|
511
|
+
│ (tool mappings + fallback names, arrays, lists,
|
|
512
|
+
│ nested objects)
|
|
513
|
+
▼
|
|
514
|
+
4. NO TARGET? ───────▶ No target found?
|
|
515
|
+
│ YES → ALLOWED_NO_TARGET only for explicitly safe local tools
|
|
516
|
+
│ otherwise → BLOCKED_INVALID_REQUEST
|
|
396
517
|
▼
|
|
397
|
-
|
|
398
|
-
|
|
518
|
+
For each target — any block blocks the whole call:
|
|
519
|
+
5. CLOUD ACCOUNT ────▶ Matches authorized cloud_accounts? → ALLOWED
|
|
520
|
+
6. CIDR TARGET ──────▶ Overlaps an exclusion → BLOCKED_EXCLUDED_TARGET
|
|
521
|
+
│ Fully inside an authorized range → ALLOWED
|
|
522
|
+
│ Otherwise → BLOCKED_NOT_IN_SCOPE
|
|
399
523
|
▼
|
|
400
|
-
|
|
401
|
-
│
|
|
524
|
+
7. DNS RESOLUTION ───▶ A + AAAA, falling back to the OS resolver
|
|
525
|
+
│ No addresses → BLOCKED_DNS_FAILED
|
|
402
526
|
▼
|
|
403
|
-
|
|
527
|
+
8. EXCLUSION CHECK ──▶ Host or any resolved IP matches excluded_targets?
|
|
404
528
|
│ YES → BLOCKED_EXCLUDED_TARGET
|
|
405
529
|
▼
|
|
406
|
-
|
|
407
|
-
│
|
|
530
|
+
9. AUTHORIZATION ────▶ Host matches a domain, IP range or URL prefix?
|
|
531
|
+
│ resolves to loopback/link-local/metadata not in
|
|
532
|
+
│ ip_ranges → BLOCKED_RESTRICTED_IP, else ALLOWED
|
|
533
|
+
│ Resolved IP in an authorized ip_range? → ALLOWED
|
|
408
534
|
▼
|
|
409
|
-
|
|
535
|
+
10. DEFAULT DENY ────▶ BLOCKED_NOT_IN_SCOPE
|
|
410
536
|
```
|
|
411
537
|
|
|
412
538
|
**Key design decisions:**
|
|
413
|
-
- **
|
|
539
|
+
- **Every target must pass.** `targets: ["10.10.10.5", "8.8.8.8"]` is blocked because of the second element.
|
|
540
|
+
- **Exclusions beat authorizations.** If `hr.acme.com` is in `excluded_targets`, it's blocked even if `*.acme.com` is authorized — with or without a trailing dot, in any letter case. A CIDR target that *contains* an excluded IP is blocked.
|
|
414
541
|
- **DNS failures are blocks.** If the proxy can't resolve a hostname, it won't forward the call. Fail closed.
|
|
415
|
-
- **
|
|
416
|
-
- **
|
|
542
|
+
- **Restricted addresses require explicit authorization.** An authorized domain that resolves to loopback, link-local or a cloud metadata endpoint (169.254.169.254) is blocked unless that IP appears in `authorized_targets.ip_ranges`. Private RFC-1918 addresses reached through an authorized domain are allowed (internal engagements); reached directly, they need an `ip_ranges` entry like any other IP.
|
|
543
|
+
- **Unparseable input is never forwarded.** Invalid JSON gets a JSON-RPC parse error (`-32700`) instead of being passed to an upstream whose parser may be more lenient.
|
|
544
|
+
- **Batches are all-or-nothing.** If any tool call in a JSON-RPC batch is blocked, the whole batch is rejected with one error per request.
|
|
545
|
+
- **No target is denied by default.** Only the explicitly listed local tools (`whoami`, `date`, `ls`, `list_tools`, `get_version`, `list_pentests`) may pass without a target. Free-form command fields are blocked unless `ALLOW_UNSTRUCTURED_COMMANDS=true` is set; that opt-in relies on incomplete heuristic extraction and is unsuitable when the proxy is the only scope control.
|
|
417
546
|
|
|
418
547
|
---
|
|
419
548
|
|
|
@@ -435,7 +564,7 @@ Every validation decision produces an audit entry:
|
|
|
435
564
|
"decision_reason": "Target 10.10.10.5 matches authorized IP range 10.10.10.0/24",
|
|
436
565
|
"matched_scope_item": "10.10.10.0/24",
|
|
437
566
|
"duration_ms": 2,
|
|
438
|
-
"proxy_version": "0.
|
|
567
|
+
"proxy_version": "0.2.6"
|
|
439
568
|
}
|
|
440
569
|
```
|
|
441
570
|
|
|
@@ -445,22 +574,26 @@ Every validation decision produces an audit entry:
|
|
|
445
574
|
|---------|--------|--------|
|
|
446
575
|
| **Local** (always active) | `AUDIT_LOG_PATH` | JSONL files: `{engagement_id}.jsonl` |
|
|
447
576
|
| **AWS CloudWatch** | `AWS_LOG_GROUP` + `AWS_REGION` | Log events in `{engagement_id}/{date}` stream |
|
|
448
|
-
| **Azure Monitor** | `
|
|
577
|
+
| **Azure Monitor** | `AZURE_LOG_INGESTION_ENDPOINT` + `AZURE_DCR_IMMUTABLE_ID` | Logs Ingestion API via Data Collection Rules |
|
|
449
578
|
| **GCP Cloud Logging** | `GOOGLE_CLOUD_PROJECT` | Cloud Logging entries with severity mapping |
|
|
450
579
|
|
|
451
|
-
Multiple backends can be active simultaneously.
|
|
580
|
+
Multiple backends can be active simultaneously. The local JSONL entry is written to disk before the call is forwarded, so the local trail survives an abrupt kill. Cloud backends are buffered and flushed every 5 seconds. Backend failures are isolated — a CloudWatch error won't affect local logging.
|
|
452
581
|
|
|
453
582
|
### Decision Types
|
|
454
583
|
|
|
455
584
|
| Decision | Meaning |
|
|
456
585
|
|----------|---------|
|
|
457
586
|
| `ALLOWED` | Target matches an authorized scope item |
|
|
458
|
-
| `ALLOWED_NO_TARGET` | Tool
|
|
459
|
-
| `BLOCKED_TECHNIQUE` | Tool belongs to an excluded technique category |
|
|
587
|
+
| `ALLOWED_NO_TARGET` | Tool is on the explicit targetless local-tool list |
|
|
588
|
+
| `BLOCKED_TECHNIQUE` | Tool belongs to an excluded technique category, or a known category not in `authorized_techniques` |
|
|
460
589
|
| `BLOCKED_OUTSIDE_WINDOW` | Current time is outside the engagement window |
|
|
461
|
-
| `BLOCKED_EXCLUDED_TARGET` | Target is explicitly excluded |
|
|
590
|
+
| `BLOCKED_EXCLUDED_TARGET` | Target (or a range containing it) is explicitly excluded |
|
|
462
591
|
| `BLOCKED_NOT_IN_SCOPE` | Target doesn't match any authorized scope item |
|
|
463
592
|
| `BLOCKED_DNS_FAILED` | DNS resolution returned no addresses |
|
|
593
|
+
| `BLOCKED_RESTRICTED_IP` | Authorized hostname resolves to loopback/link-local/cloud metadata not listed in `ip_ranges` |
|
|
594
|
+
| `BLOCKED_INVALID_REQUEST` | Tool name or arguments malformed — cannot be validated |
|
|
595
|
+
| `BLOCKED_UNINSPECTABLE_COMMAND` | Free-form command or argument field cannot be reliably scoped |
|
|
596
|
+
| `BLOCKED_INTERNAL_ERROR` | Validation threw unexpectedly — failed closed |
|
|
464
597
|
|
|
465
598
|
---
|
|
466
599
|
|
|
@@ -474,9 +607,72 @@ See the [`examples/`](examples/) directory for:
|
|
|
474
607
|
|
|
475
608
|
---
|
|
476
609
|
|
|
610
|
+
## Manifest Builder
|
|
611
|
+
|
|
612
|
+
Build scope manifests interactively with smart validation, or share a web form with clients for scope intake.
|
|
613
|
+
|
|
614
|
+
### Quick Start
|
|
615
|
+
|
|
616
|
+
```bash
|
|
617
|
+
# Create a new manifest interactively
|
|
618
|
+
integsec-agentic-pentest-manifest new
|
|
619
|
+
|
|
620
|
+
# Create from a template
|
|
621
|
+
integsec-agentic-pentest-manifest new --from template.json -o scope.json
|
|
622
|
+
|
|
623
|
+
# Edit an existing manifest
|
|
624
|
+
integsec-agentic-pentest-manifest edit scope.json
|
|
625
|
+
|
|
626
|
+
# Review a client submission
|
|
627
|
+
integsec-agentic-pentest-manifest review submission.pending.json
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### Client Intake (Web Form)
|
|
631
|
+
|
|
632
|
+
Share a web-based form with clients so they can define their own scope:
|
|
633
|
+
|
|
634
|
+
```bash
|
|
635
|
+
# Local only (default — localhost:9471)
|
|
636
|
+
integsec-agentic-pentest-manifest serve --template engagement-template.json
|
|
637
|
+
|
|
638
|
+
# Network-accessible (TLS required)
|
|
639
|
+
integsec-agentic-pentest-manifest serve \
|
|
640
|
+
--host 0.0.0.0 \
|
|
641
|
+
--tls-cert ./certs/server.pem \
|
|
642
|
+
--tls-key ./certs/server-key.pem \
|
|
643
|
+
--template engagement-template.json
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**Workflow:**
|
|
647
|
+
1. Operator creates a template with engagement info, time window, and technique restrictions
|
|
648
|
+
2. Operator runs `serve` and shares the URL with the client
|
|
649
|
+
3. Client fills in their targets (domains, IPs, exclusions) via the web form
|
|
650
|
+
4. Client submits — saved as `.pending.json`
|
|
651
|
+
5. Operator reviews: `integsec-agentic-pentest-manifest review submission.pending.json`
|
|
652
|
+
6. Operator approves, edits, or rejects
|
|
653
|
+
|
|
654
|
+
**Security:** The web server binds to `127.0.0.1` by default. Exposing on `0.0.0.0` requires `--tls-cert` and `--tls-key` — the server refuses to start over plaintext on non-localhost interfaces.
|
|
655
|
+
|
|
656
|
+
### Smart Validation
|
|
657
|
+
|
|
658
|
+
The builder validates your manifest as you build it:
|
|
659
|
+
|
|
660
|
+
- **Format checks** — valid CIDRs, ISO 8601 dates, non-empty required fields
|
|
661
|
+
- **Live DNS resolution** — resolves domains and shows their IPs
|
|
662
|
+
- **Overlap detection** — warns when domains resolve to IPs already covered by CIDR ranges
|
|
663
|
+
- **Broad range warnings** — flags CIDR ranges wider than /16
|
|
664
|
+
- **Wildcard/apex prompts** — suggests adding `acme.com` when `*.acme.com` is entered
|
|
665
|
+
- **Exclusion checks** — warns if an excluded target isn't within any authorized range
|
|
666
|
+
|
|
667
|
+
### Dry-Run Preview
|
|
668
|
+
|
|
669
|
+
Before saving, the builder runs synthetic tool calls against your manifest to preview what the proxy will allow and block. This catches scope misconfigurations before an engagement starts.
|
|
670
|
+
|
|
671
|
+
---
|
|
672
|
+
|
|
477
673
|
## Contributing
|
|
478
674
|
|
|
479
|
-
Contributions are welcome. The IntegSec Agentic Pentest MCP Proxy is an open-source project under the
|
|
675
|
+
Contributions are welcome. The IntegSec Agentic Pentest MCP Proxy is an open-source project under the Apache 2.0 license.
|
|
480
676
|
|
|
481
677
|
### Architecture
|
|
482
678
|
|
|
@@ -486,7 +682,7 @@ bin/
|
|
|
486
682
|
|
|
487
683
|
src/
|
|
488
684
|
proxy.ts ScopeEnforcementProxy — core orchestrator
|
|
489
|
-
validator.ts ScopeValidator —
|
|
685
|
+
validator.ts ScopeValidator — validation pipeline
|
|
490
686
|
extractor.ts Target extraction from tool parameters (19 tools + fallback)
|
|
491
687
|
domain-matcher.ts Wildcard and exact domain matching
|
|
492
688
|
ip-matcher.ts CIDR matching, RFC-1918 detection
|
|
@@ -514,8 +710,8 @@ src/
|
|
|
514
710
|
|
|
515
711
|
```bash
|
|
516
712
|
# Clone the repo
|
|
517
|
-
git clone https://github.com/
|
|
518
|
-
cd agentic-pentest-
|
|
713
|
+
git clone https://github.com/IntegSec/agentic-pentest-proxy.git
|
|
714
|
+
cd agentic-pentest-proxy
|
|
519
715
|
|
|
520
716
|
# Install dependencies
|
|
521
717
|
npm install
|
|
@@ -534,7 +730,7 @@ npm run lint
|
|
|
534
730
|
```
|
|
535
731
|
|
|
536
732
|
**Requirements:**
|
|
537
|
-
- Node.js >=
|
|
733
|
+
- Node.js >= 22.0.0
|
|
538
734
|
- npm >= 9
|
|
539
735
|
|
|
540
736
|
### Project Structure
|
|
@@ -633,7 +829,7 @@ The following is the planned development roadmap for the IntegSec Agentic Pentes
|
|
|
633
829
|
|
|
634
830
|
- [ ] **Signed scope manifests** — Ed25519 signatures on manifests to prevent tampering, with key pinning
|
|
635
831
|
- [ ] **Manifest hot-reload** — watch manifest file for changes and reload without restart
|
|
636
|
-
- [ ] **Scope manifest v2 schema** — add per-tool overrides, port ranges, protocol restrictions
|
|
832
|
+
- [ ] **Scope manifest v2 schema** — add per-tool overrides, port ranges, and protocol restrictions
|
|
637
833
|
- [ ] **Rate limiting** — per-tool and per-target rate limits to prevent runaway agents
|
|
638
834
|
- [ ] **Metrics endpoint** — Prometheus `/metrics` with counters for allowed/blocked decisions, latency histograms
|
|
639
835
|
- [ ] **WebSocket transport** — support MCP over WebSocket for persistent connections
|
|
@@ -749,7 +945,7 @@ The following is the planned development roadmap for the IntegSec Agentic Pentes
|
|
|
749
945
|
|
|
750
946
|
## License
|
|
751
947
|
|
|
752
|
-
|
|
948
|
+
Apache 2.0 License. See [LICENSE](LICENSE) for details.
|
|
753
949
|
|
|
754
950
|
---
|
|
755
951
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integsec-agentic-pentest-manifest.d.ts","sourceRoot":"","sources":["../../bin/integsec-agentic-pentest-manifest.tsx"],"names":[],"mappings":""}
|