Pwnbridge — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Pwnbridge (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
<div align="center">
PwnBridge
⚠️ AUTHORIZED USE ONLY — Only test systems you own or have explicit written permission to test. Unauthorized access to computer systems is illegal.
</div>
PwnBridge is a Model Context Protocol (MCP) server that bridges AI assistants to a Kali Linux machine over SSH. Ask Claude, ChatGPT, or Gemini to run a port scan, test for SQL injection, or perform a full SAST/DAST security assessment — the AI translates intent into commands, executes them on your Kali box, streams back results, and keeps a full audit trail.
┌─────────────────────────────────────────────────────────────────────────┐
│ │
│ Claude Desktop ──── stdio ────┐ │
│ │ │
│ ChatGPT ──────── HTTP/SSE ───►│ PwnBridge ──── SSH ────► Kali Linux │
│ │ (11 tools) │
│ Gemini CLI ───── HTTP/SSE ───►│ │
│ │ │
└─────────────────────────────────────────────────────────────────────────┘| Transport | Clients | Protocol |
|---|---|---|
| stdio | Claude Desktop | MCP native (spawned process) |
| HTTP / SSE | ChatGPT, Gemini CLI, any MCP client | Streamable HTTP + legacy SSE |
| Tool | Description |
|---|---|
nmap_scan | Port scanning — quick, service, OS, full, stealth, UDP profiles |
nikto_scan | Web server vulnerability and misconfiguration detection |
whatweb_fingerprint | CMS, framework, and technology fingerprinting |
| Tool | Description |
|---|---|
sqlmap_scan | SQL injection detection and exploitation |
gobuster_scan | Directory, file, subdomain, and vhost enumeration |
ffuf_fuzz | Web fuzzing with FUZZ keyword — params, paths, headers |
| Tool | Description |
|---|---|
hydra_attack | Password brute-force — SSH, FTP, HTTP, SMB, RDP, and more |
metasploit_exec | Non-interactive Metasploit module execution |
| Tool | Description |
|---|---|
sast_scan | Static analysis — Semgrep + Bandit + Gitleaks + Graudit in parallel, versioned reports |
dast_scan | Dynamic analysis — OWASP ZAP + Nuclei, 5 auth modes, versioned reports |
| Tool | Description |
|---|---|
shell_exec | Raw shell command passthrough (escape hatch for advanced scenarios) |
git clone https://github.com/1mr0-tech/simple-kali-mcp.git pwnbridge
cd pwnbridge
npm installcp .env.example .envEdit .env — minimum required:
SSH_HOST=192.168.1.100 # Your Kali machine IP
SSH_USER=kali
SSH_PRIVATE_KEY_PATH=~/.ssh/id_rsa # Recommended over passwordnpm run buildAdd to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"pwnbridge": {
"command": "node",
"args": ["/absolute/path/to/pwnbridge/dist/index.js", "--stdio"]
}
}
}Restart Claude Desktop. All 11 tools appear automatically.
Option A — MCP Connector (ChatGPT Plus / Team / Enterprise):
node dist/index.js --http # starts on port 3000In ChatGPT → Settings → Connected Apps → Add MCP Server → http://your-server:3000/mcp
Option B — Custom GPT Actions (legacy):
Import the auto-generated schema: http://your-server:3000/openapi.yaml
Add to ~/.gemini/settings.json:
{
"mcpServers": {
"pwnbridge": {
"httpUrl": "http://your-server:3000/mcp",
"headers": { "x-api-key": "your-key-here" }
}
}
}Run static analysis on a local codebase. Code is synced to Kali via SFTP, scanned in parallel, then deleted — only the report is kept.
AI: "Run a SAST scan on /Users/me/projects/backend, project name backend-api"What runs on Kali:
┌─────────────────────────────────────────────────────────────────┐
│ SFTP Upload (8 concurrent streams) │
│ /Users/me/projects/backend → /tmp/kali-sast-abc123/src/ │
└───────────────────────┬─────────────────────────────────────────┘
│ parallel
┌───────────────┼───────────────┬──────────────┐
▼ ▼ ▼ ▼
Semgrep Bandit Gitleaks Graudit
(multi-lang) (Python*) (secrets) (lang-aware)
│ │ │ │
└───────────────┴───────────────┴──────────────┘
│ consolidated report
▼
~/kali-mcp-reports/sast/backend-api/v002_20240120_091500_sast_all.mdBandit is automatically skipped if no `.py` files are found. Graudit uses language auto-detection to target the right rule databases (e.g. `python,js,code`).
~/kali-mcp-reports/
sast/
{project}/
v001_20240115_103000_sast_all.md
v002_20240120_091500_sast_semgrep+bandit.md
v003_20240125_140000_sast_all.mdRun dynamic analysis against a live web application.
AI: "Run a full authenticated DAST scan on http://192.168.1.50, form login at /login"Authentication modes:
auth_type | How it works |
|---|---|
none | Standard unauthenticated crawl |
basic | Injects Authorization: Basic <b64> via ZAP Replacer |
bearer | Injects Authorization: Bearer <token> via ZAP Replacer |
cookie | Injects Cookie: <value> via ZAP Replacer |
form | Generates ZAP Automation Framework YAML — full login flow |
What runs on Kali (parallel):
ZAP (spider → passive scan → active scan)
+
Nuclei (CVE + template detection)
│
▼
~/kali-mcp-reports/dast/192.168.1.50/v001_20240115_103000_dast_full_form-auth.md~/kali-mcp-reports/
dast/
{host}/
v001_20240115_103000_dast_baseline_unauth.md
v002_20240116_090000_dast_full_form-auth.md
v003_20240118_143000_dast_full_bearer-auth.md| Variable | Default | Description |
|---|---|---|
SSH_HOST | — | Required. Kali machine IP or hostname |
SSH_PORT | 22 | SSH port |
SSH_USER | — | Required. SSH username |
SSH_PASSWORD | — | SSH password (prefer key auth) |
SSH_PRIVATE_KEY_PATH | — | Path to private key — ~ is expanded |
SSH_PASSPHRASE | — | Passphrase for encrypted private key |
HTTP_PORT | 3000 | HTTP server port |
HTTP_HOST | 0.0.0.0 | HTTP bind address |
HTTP_API_KEY | — | API key to protect the HTTP endpoint |
DEFAULT_TIMEOUT_MS | 300000 | Default command timeout (5 min) |
NMAP_TIMEOUT_MS | 600000 | nmap timeout (10 min) |
SQLMAP_TIMEOUT_MS | 900000 | sqlmap timeout (15 min) |
SAST_TIMEOUT_MS | 900000 | SAST scan timeout (15 min) |
DAST_TIMEOUT_MS | 1800000 | DAST scan timeout (30 min) |
AUDIT_LOG_PATH | ./logs/audit.log | Local audit log file |
KALI_REPORT_DIR | ~/kali-mcp-reports | Report directory on Kali |
Every command is logged with a full timestamp:
{"timestamp":"2024-01-15 10:30:00","level":"info","message":"COMMAND_EXECUTED",
"tool":"nmap_scan","command":"nmap -T4 -F 192.168.1.1","target":"192.168.1.1"}Log: ./logs/audit.log — rotates at 50MB, keeps 5 files.
# HTTP mode — ChatGPT / Gemini
npm run start:http
# stdio mode — Claude Desktop (usually auto-launched)
npm run start:stdio
# Health check
curl http://localhost:3000/health| Concern | Mitigation |
|---|---|
| Unauthorized access | Set HTTP_API_KEY before exposing port 3000 |
| Credential theft | Use SSH key auth over password |
| Command injection | Tool schemas use enums and typed params — only shell_exec accepts raw strings |
| Audit trail | All commands logged with timestamp, tool, target, and full command string |
| Source code exposure | SAST uploads code temporarily — deleted immediately after scan |
| Network exposure | Restrict port 3000 at firewall level; bind to 127.0.0.1 for local-only use |
| Tool | Install |
|---|---|
| nmap | Pre-installed |
| nikto | apt install nikto |
| sqlmap | Pre-installed |
| gobuster | apt install gobuster |
| ffuf | apt install ffuf |
| whatweb | Pre-installed |
| hydra | Pre-installed |
| metasploit | Pre-installed |
| semgrep | pip install semgrep |
| bandit | pip install bandit |
| gitleaks | apt install gitleaks |
| graudit | apt install graudit |
| zaproxy | apt install zaproxy |
| nuclei | apt install nuclei |
SSH connection fails:
ssh -i ~/.ssh/id_rsa kali@<host>Tool not appearing in Claude Desktop:
claude_desktop_config.json~/Library/Logs/Claude/ (macOS)ZAP / Nuclei / Semgrep not found:
apt install zaproxy nuclei gitleaks graudit
pip install semgrep banditMIT — see LICENSE for details.
<div align="center">
Built for authorized security professionals. Assess responsibly.
</div>
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.