mcppt 1.0.0__tar.gz → 1.0.2__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.
- {mcppt-1.0.0 → mcppt-1.0.2}/PKG-INFO +10 -3
- {mcppt-1.0.0 → mcppt-1.0.2}/README.md +9 -2
- mcppt-1.0.2/mcppt/__init__.py +1 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/cli.py +3 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/pyproject.toml +1 -1
- mcppt-1.0.2/wbs_mcppt_result.md +130 -0
- mcppt-1.0.0/mcppt/__init__.py +0 -1
- {mcppt-1.0.0 → mcppt-1.0.2}/.github/workflows/ci.yml +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/.gitignore +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/LICENSE +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/OPERATOR_GUIDE.md +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/app.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/docs/MCPTROTTER_ARTICLE.md +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/docs/MCPTROTTER_MEDIUM.md +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/docs/mcptrotter.jpeg +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/checks.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/core.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/report.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/server.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/shell.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/mcppt/tui.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/requirements.txt +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/smoke_test.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/test_report.md +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/test_server.log +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/test_server.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/tests/__init__.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/tests/test_checks.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/tests/test_core.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/vuln_server.py +0 -0
- {mcppt-1.0.0 → mcppt-1.0.2}/wbs_scan_report.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcppt
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: MCPTROTTER — MCP Pentest Tool: 28 automated security checks for MCP servers
|
|
5
5
|
Project-URL: Homepage, https://github.com/gurudeepmallam-cmd/mcppt
|
|
6
6
|
Project-URL: Repository, https://github.com/gurudeepmallam-cmd/mcppt
|
|
@@ -32,10 +32,11 @@ Description-Content-Type: text/markdown
|
|
|
32
32
|
# MCPTROTTER — MCP Pentest Tool
|
|
33
33
|
|
|
34
34
|
<p align="center">
|
|
35
|
-
<
|
|
35
|
+
<img src="https://raw.githubusercontent.com/gurudeepmallam-cmd/mcppt/main/docs/mcptrotter.jpeg" alt="MCPTROTTER" width="380"/>
|
|
36
36
|
</p>
|
|
37
37
|
|
|
38
38
|
<p align="center">
|
|
39
|
+
<img src="https://img.shields.io/pypi/v/mcppt?label=PyPI&color=orange"/>
|
|
39
40
|
<img src="https://img.shields.io/badge/python-3.10%2B-blue"/>
|
|
40
41
|
<img src="https://img.shields.io/badge/checks-28-red"/>
|
|
41
42
|
<img src="https://img.shields.io/badge/license-MIT-green"/>
|
|
@@ -67,13 +68,19 @@ Works against any MCP server using Streamable HTTP transport (POST + SSE respons
|
|
|
67
68
|
|
|
68
69
|
## Install
|
|
69
70
|
|
|
71
|
+
**From PyPI (recommended):**
|
|
72
|
+
```bash
|
|
73
|
+
pip install mcppt
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**From source:**
|
|
70
77
|
```bash
|
|
71
78
|
git clone https://github.com/gurudeepmallam-cmd/mcppt
|
|
72
79
|
cd mcppt/mcppt_tool
|
|
73
80
|
pip install -e .
|
|
74
81
|
```
|
|
75
82
|
|
|
76
|
-
Requires Python 3.10+.
|
|
83
|
+
Requires Python 3.10+.
|
|
77
84
|
|
|
78
85
|
---
|
|
79
86
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
# MCPTROTTER — MCP Pentest Tool
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
|
-
<
|
|
4
|
+
<img src="https://raw.githubusercontent.com/gurudeepmallam-cmd/mcppt/main/docs/mcptrotter.jpeg" alt="MCPTROTTER" width="380"/>
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
+
<img src="https://img.shields.io/pypi/v/mcppt?label=PyPI&color=orange"/>
|
|
8
9
|
<img src="https://img.shields.io/badge/python-3.10%2B-blue"/>
|
|
9
10
|
<img src="https://img.shields.io/badge/checks-28-red"/>
|
|
10
11
|
<img src="https://img.shields.io/badge/license-MIT-green"/>
|
|
@@ -36,13 +37,19 @@ Works against any MCP server using Streamable HTTP transport (POST + SSE respons
|
|
|
36
37
|
|
|
37
38
|
## Install
|
|
38
39
|
|
|
40
|
+
**From PyPI (recommended):**
|
|
41
|
+
```bash
|
|
42
|
+
pip install mcppt
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**From source:**
|
|
39
46
|
```bash
|
|
40
47
|
git clone https://github.com/gurudeepmallam-cmd/mcppt
|
|
41
48
|
cd mcppt/mcppt_tool
|
|
42
49
|
pip install -e .
|
|
43
50
|
```
|
|
44
51
|
|
|
45
|
-
Requires Python 3.10+.
|
|
52
|
+
Requires Python 3.10+.
|
|
46
53
|
|
|
47
54
|
---
|
|
48
55
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "1.0.2"
|
|
@@ -48,6 +48,9 @@ def cmd_scan(args: argparse.Namespace) -> None:
|
|
|
48
48
|
|
|
49
49
|
checks = [c.strip() for c in args.checks.split(",")]
|
|
50
50
|
run_all = "all" in checks
|
|
51
|
+
# enum must always run first — other checks depend on the tool list it builds
|
|
52
|
+
if not run_all and "enum" not in checks:
|
|
53
|
+
checks = ["enum"] + checks
|
|
51
54
|
total = len(ALL_CHECKS) if run_all else len([c for c in checks if c in ALL_CHECKS])
|
|
52
55
|
|
|
53
56
|
state = ScanState(
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# MCPPT Security Scan Report
|
|
2
|
+
|
|
3
|
+
**Target:** `https://qmcp.wbsautomation.deloitte.com/`
|
|
4
|
+
**Date:** 2026-06-08 11:33 UTC
|
|
5
|
+
**Duration:** 114.8s
|
|
6
|
+
|
|
7
|
+
## Summary
|
|
8
|
+
|
|
9
|
+
| Severity | Count |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| [CRIT] CRITICAL | 1 |
|
|
12
|
+
| [HIGH] HIGH | 4 |
|
|
13
|
+
| [MED] MEDIUM | 2 |
|
|
14
|
+
| [LOW] LOW | 3 |
|
|
15
|
+
|
|
16
|
+
## Findings
|
|
17
|
+
|
|
18
|
+
### 1. [MED] [MEDIUM] tools/list accessible without Authorization header
|
|
19
|
+
|
|
20
|
+
**Check:** `enum`
|
|
21
|
+
**Severity:** MEDIUM
|
|
22
|
+
|
|
23
|
+
Returned 25 tools: ['get_material_options_by_market_offering', 'wbs_automation_check_publish_status', 'get_missing_mandatory_fields_with_options', 'get_invoice_details', 'get_field_info', 'get_field_description', 'get_all_market_offering_categories', 'get_wbs_form_by_id', 'search_information_with_prefilter_from_provider', 'get_market_offering_subcategories']
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
### 2. [LOW] [LOW] No rate limiting — 30/30 requests in 45.1s
|
|
28
|
+
|
|
29
|
+
**Check:** `rate`
|
|
30
|
+
**Severity:** LOW
|
|
31
|
+
|
|
32
|
+
Server may be vulnerable to DoS via tool call flooding
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### 3. [HIGH] [HIGH] Replay confirmed on 'get_material_options_by_market_offering'
|
|
37
|
+
|
|
38
|
+
**Check:** `replay`
|
|
39
|
+
**Severity:** HIGH
|
|
40
|
+
|
|
41
|
+
Identical request accepted twice with same req_id — no nonce/timestamp protection
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
### 4. [CRIT] [CRITICAL] Replay confirmed on WRITE tool 'wbs_automation_check_publish_status'
|
|
46
|
+
|
|
47
|
+
**Check:** `replay`
|
|
48
|
+
**Severity:** CRITICAL
|
|
49
|
+
|
|
50
|
+
Destructive tool accepted replayed request — attacker can replay captured requests
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
### 5. [MED] [MEDIUM] Context overflow: get_material_options_by_market_offering accepts 10,000-char payload
|
|
55
|
+
|
|
56
|
+
**Check:** `context_overflow`
|
|
57
|
+
**Severity:** MEDIUM
|
|
58
|
+
|
|
59
|
+
Attack: write max-size content → agent reads it → LLM context window overwhelmed → system prompt / guardrail instructions truncated
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
### 6. [HIGH] [HIGH] Weak session ID: Non-UUID/non-hex format: 'ixr6d3hIUVkjgz0lbTelQA'
|
|
64
|
+
|
|
65
|
+
**Check:** `session`
|
|
66
|
+
**Severity:** HIGH
|
|
67
|
+
|
|
68
|
+
Predictable IDs allow session hijacking. Fix: CSPRNG ≥128-bit entropy (UUID v4)
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
### 7. [LOW] [LOW] Missing security headers: X-Content-Type-Options, X-Frame-Options, Referrer-Policy, Content-Security-Policy, Permissions-Policy
|
|
73
|
+
|
|
74
|
+
**Check:** `headers`
|
|
75
|
+
**Severity:** LOW
|
|
76
|
+
|
|
77
|
+
These headers reduce XSS, clickjacking, and info-leakage risk
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
### 8. [LOW] [LOW] HSTS max-age too short: 16070400s (< 1 year)
|
|
82
|
+
|
|
83
|
+
**Check:** `headers`
|
|
84
|
+
**Severity:** LOW
|
|
85
|
+
|
|
86
|
+
Recommend max-age ≥ 31536000 with includeSubDomains
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### 9. [HIGH] [HIGH] CORS preflight allows arbitrary origins
|
|
91
|
+
|
|
92
|
+
**Check:** `headers`
|
|
93
|
+
**Severity:** HIGH
|
|
94
|
+
|
|
95
|
+
Origin 'https://evil.attacker.com' was reflected/allowed in preflight
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
### 10. [HIGH] [HIGH] Resources accessible without auth — 6 items returned
|
|
100
|
+
|
|
101
|
+
**Check:** `resources`
|
|
102
|
+
**Severity:** HIGH
|
|
103
|
+
|
|
104
|
+
Unauthenticated resources/list — may expose data / system prompt templates
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Remediation Reference
|
|
109
|
+
|
|
110
|
+
| Check | Risk | Fix |
|
|
111
|
+
| --- | --- | --- |
|
|
112
|
+
| `enum` | Info disclosure | Require auth on `tools/list` |
|
|
113
|
+
| `auth` | Auth bypass | Validate Bearer token server-side on every tool call |
|
|
114
|
+
| `idor` | Data exposure | Scope resource access to the authenticated user |
|
|
115
|
+
| `injection` | Prompt injection | Sanitise/escape all user-supplied strings before returning to LLM |
|
|
116
|
+
| `schema` | Input validation | Enforce strict type validation at the MCP server layer |
|
|
117
|
+
| `ssrf` | SSRF | Block RFC-1918/link-local URLs; use allowlist for external fetches |
|
|
118
|
+
| `publish` | Unconfirmed action | Enforce confirmation gate in MCP layer, not only in agent prompt |
|
|
119
|
+
| `rate` | DoS | Add rate limiting per token/IP |
|
|
120
|
+
| `stored` | Stored injection | Escape stored content before returning in tool responses |
|
|
121
|
+
| `scope` | Privilege escalation | Enforce token scopes server-side per tool |
|
|
122
|
+
| `replay` | Replay | Add per-request nonce or timestamp window validation |
|
|
123
|
+
| `context_overflow` | Context hijack | Enforce max field length at ingestion |
|
|
124
|
+
| `poison_all` | Injection | Sanitise every response field, not just primary content |
|
|
125
|
+
| `tenant` | Data leak | Scope cache keys and storage to tenant/user ID |
|
|
126
|
+
| `session` | Session hijack | Use CSPRNG ≥128-bit entropy for session IDs (UUID v4) |
|
|
127
|
+
| `rug_pull` | Supply chain | Pin tool versions; alert on description changes |
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
_Generated by [MCPPT](https://github.com/gurudeepmallam-cmd/mcppt) v2.0_
|
mcppt-1.0.0/mcppt/__init__.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "1.0.0"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|