aiptx 2.0.7__py3-none-any.whl
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.
- aipt_v2/__init__.py +110 -0
- aipt_v2/__main__.py +24 -0
- aipt_v2/agents/AIPTxAgent/__init__.py +10 -0
- aipt_v2/agents/AIPTxAgent/aiptx_agent.py +211 -0
- aipt_v2/agents/__init__.py +46 -0
- aipt_v2/agents/base.py +520 -0
- aipt_v2/agents/exploit_agent.py +688 -0
- aipt_v2/agents/ptt.py +406 -0
- aipt_v2/agents/state.py +168 -0
- aipt_v2/app.py +957 -0
- aipt_v2/browser/__init__.py +31 -0
- aipt_v2/browser/automation.py +458 -0
- aipt_v2/browser/crawler.py +453 -0
- aipt_v2/cli.py +2933 -0
- aipt_v2/compliance/__init__.py +71 -0
- aipt_v2/compliance/compliance_report.py +449 -0
- aipt_v2/compliance/framework_mapper.py +424 -0
- aipt_v2/compliance/nist_mapping.py +345 -0
- aipt_v2/compliance/owasp_mapping.py +330 -0
- aipt_v2/compliance/pci_mapping.py +297 -0
- aipt_v2/config.py +341 -0
- aipt_v2/core/__init__.py +43 -0
- aipt_v2/core/agent.py +630 -0
- aipt_v2/core/llm.py +395 -0
- aipt_v2/core/memory.py +305 -0
- aipt_v2/core/ptt.py +329 -0
- aipt_v2/database/__init__.py +14 -0
- aipt_v2/database/models.py +232 -0
- aipt_v2/database/repository.py +384 -0
- aipt_v2/docker/__init__.py +23 -0
- aipt_v2/docker/builder.py +260 -0
- aipt_v2/docker/manager.py +222 -0
- aipt_v2/docker/sandbox.py +371 -0
- aipt_v2/evasion/__init__.py +58 -0
- aipt_v2/evasion/request_obfuscator.py +272 -0
- aipt_v2/evasion/tls_fingerprint.py +285 -0
- aipt_v2/evasion/ua_rotator.py +301 -0
- aipt_v2/evasion/waf_bypass.py +439 -0
- aipt_v2/execution/__init__.py +23 -0
- aipt_v2/execution/executor.py +302 -0
- aipt_v2/execution/parser.py +544 -0
- aipt_v2/execution/terminal.py +337 -0
- aipt_v2/health.py +437 -0
- aipt_v2/intelligence/__init__.py +194 -0
- aipt_v2/intelligence/adaptation.py +474 -0
- aipt_v2/intelligence/auth.py +520 -0
- aipt_v2/intelligence/chaining.py +775 -0
- aipt_v2/intelligence/correlation.py +536 -0
- aipt_v2/intelligence/cve_aipt.py +334 -0
- aipt_v2/intelligence/cve_info.py +1111 -0
- aipt_v2/intelligence/knowledge_graph.py +590 -0
- aipt_v2/intelligence/learning.py +626 -0
- aipt_v2/intelligence/llm_analyzer.py +502 -0
- aipt_v2/intelligence/llm_tool_selector.py +518 -0
- aipt_v2/intelligence/payload_generator.py +562 -0
- aipt_v2/intelligence/rag.py +239 -0
- aipt_v2/intelligence/scope.py +442 -0
- aipt_v2/intelligence/searchers/__init__.py +5 -0
- aipt_v2/intelligence/searchers/exploitdb_searcher.py +523 -0
- aipt_v2/intelligence/searchers/github_searcher.py +467 -0
- aipt_v2/intelligence/searchers/google_searcher.py +281 -0
- aipt_v2/intelligence/tools.json +443 -0
- aipt_v2/intelligence/triage.py +670 -0
- aipt_v2/interactive_shell.py +559 -0
- aipt_v2/interface/__init__.py +5 -0
- aipt_v2/interface/cli.py +230 -0
- aipt_v2/interface/main.py +501 -0
- aipt_v2/interface/tui.py +1276 -0
- aipt_v2/interface/utils.py +583 -0
- aipt_v2/llm/__init__.py +39 -0
- aipt_v2/llm/config.py +26 -0
- aipt_v2/llm/llm.py +514 -0
- aipt_v2/llm/memory.py +214 -0
- aipt_v2/llm/request_queue.py +89 -0
- aipt_v2/llm/utils.py +89 -0
- aipt_v2/local_tool_installer.py +1467 -0
- aipt_v2/models/__init__.py +15 -0
- aipt_v2/models/findings.py +295 -0
- aipt_v2/models/phase_result.py +224 -0
- aipt_v2/models/scan_config.py +207 -0
- aipt_v2/monitoring/grafana/dashboards/aipt-dashboard.json +355 -0
- aipt_v2/monitoring/grafana/dashboards/default.yml +17 -0
- aipt_v2/monitoring/grafana/datasources/prometheus.yml +17 -0
- aipt_v2/monitoring/prometheus.yml +60 -0
- aipt_v2/orchestration/__init__.py +52 -0
- aipt_v2/orchestration/pipeline.py +398 -0
- aipt_v2/orchestration/progress.py +300 -0
- aipt_v2/orchestration/scheduler.py +296 -0
- aipt_v2/orchestrator.py +2427 -0
- aipt_v2/payloads/__init__.py +27 -0
- aipt_v2/payloads/cmdi.py +150 -0
- aipt_v2/payloads/sqli.py +263 -0
- aipt_v2/payloads/ssrf.py +204 -0
- aipt_v2/payloads/templates.py +222 -0
- aipt_v2/payloads/traversal.py +166 -0
- aipt_v2/payloads/xss.py +204 -0
- aipt_v2/prompts/__init__.py +60 -0
- aipt_v2/proxy/__init__.py +29 -0
- aipt_v2/proxy/history.py +352 -0
- aipt_v2/proxy/interceptor.py +452 -0
- aipt_v2/recon/__init__.py +44 -0
- aipt_v2/recon/dns.py +241 -0
- aipt_v2/recon/osint.py +367 -0
- aipt_v2/recon/subdomain.py +372 -0
- aipt_v2/recon/tech_detect.py +311 -0
- aipt_v2/reports/__init__.py +17 -0
- aipt_v2/reports/generator.py +313 -0
- aipt_v2/reports/html_report.py +378 -0
- aipt_v2/runtime/__init__.py +53 -0
- aipt_v2/runtime/base.py +30 -0
- aipt_v2/runtime/docker.py +401 -0
- aipt_v2/runtime/local.py +346 -0
- aipt_v2/runtime/tool_server.py +205 -0
- aipt_v2/runtime/vps.py +830 -0
- aipt_v2/scanners/__init__.py +28 -0
- aipt_v2/scanners/base.py +273 -0
- aipt_v2/scanners/nikto.py +244 -0
- aipt_v2/scanners/nmap.py +402 -0
- aipt_v2/scanners/nuclei.py +273 -0
- aipt_v2/scanners/web.py +454 -0
- aipt_v2/scripts/security_audit.py +366 -0
- aipt_v2/setup_wizard.py +941 -0
- aipt_v2/skills/__init__.py +80 -0
- aipt_v2/skills/agents/__init__.py +14 -0
- aipt_v2/skills/agents/api_tester.py +706 -0
- aipt_v2/skills/agents/base.py +477 -0
- aipt_v2/skills/agents/code_review.py +459 -0
- aipt_v2/skills/agents/security_agent.py +336 -0
- aipt_v2/skills/agents/web_pentest.py +818 -0
- aipt_v2/skills/prompts/__init__.py +647 -0
- aipt_v2/system_detector.py +539 -0
- aipt_v2/telemetry/__init__.py +7 -0
- aipt_v2/telemetry/tracer.py +347 -0
- aipt_v2/terminal/__init__.py +28 -0
- aipt_v2/terminal/executor.py +400 -0
- aipt_v2/terminal/sandbox.py +350 -0
- aipt_v2/tools/__init__.py +44 -0
- aipt_v2/tools/active_directory/__init__.py +78 -0
- aipt_v2/tools/active_directory/ad_config.py +238 -0
- aipt_v2/tools/active_directory/bloodhound_wrapper.py +447 -0
- aipt_v2/tools/active_directory/kerberos_attacks.py +430 -0
- aipt_v2/tools/active_directory/ldap_enum.py +533 -0
- aipt_v2/tools/active_directory/smb_attacks.py +505 -0
- aipt_v2/tools/agents_graph/__init__.py +19 -0
- aipt_v2/tools/agents_graph/agents_graph_actions.py +69 -0
- aipt_v2/tools/api_security/__init__.py +76 -0
- aipt_v2/tools/api_security/api_discovery.py +608 -0
- aipt_v2/tools/api_security/graphql_scanner.py +622 -0
- aipt_v2/tools/api_security/jwt_analyzer.py +577 -0
- aipt_v2/tools/api_security/openapi_fuzzer.py +761 -0
- aipt_v2/tools/browser/__init__.py +5 -0
- aipt_v2/tools/browser/browser_actions.py +238 -0
- aipt_v2/tools/browser/browser_instance.py +535 -0
- aipt_v2/tools/browser/tab_manager.py +344 -0
- aipt_v2/tools/cloud/__init__.py +70 -0
- aipt_v2/tools/cloud/cloud_config.py +273 -0
- aipt_v2/tools/cloud/cloud_scanner.py +639 -0
- aipt_v2/tools/cloud/prowler_tool.py +571 -0
- aipt_v2/tools/cloud/scoutsuite_tool.py +359 -0
- aipt_v2/tools/executor.py +307 -0
- aipt_v2/tools/parser.py +408 -0
- aipt_v2/tools/proxy/__init__.py +5 -0
- aipt_v2/tools/proxy/proxy_actions.py +103 -0
- aipt_v2/tools/proxy/proxy_manager.py +789 -0
- aipt_v2/tools/registry.py +196 -0
- aipt_v2/tools/scanners/__init__.py +343 -0
- aipt_v2/tools/scanners/acunetix_tool.py +712 -0
- aipt_v2/tools/scanners/burp_tool.py +631 -0
- aipt_v2/tools/scanners/config.py +156 -0
- aipt_v2/tools/scanners/nessus_tool.py +588 -0
- aipt_v2/tools/scanners/zap_tool.py +612 -0
- aipt_v2/tools/terminal/__init__.py +5 -0
- aipt_v2/tools/terminal/terminal_actions.py +37 -0
- aipt_v2/tools/terminal/terminal_manager.py +153 -0
- aipt_v2/tools/terminal/terminal_session.py +449 -0
- aipt_v2/tools/tool_processing.py +108 -0
- aipt_v2/utils/__init__.py +17 -0
- aipt_v2/utils/logging.py +202 -0
- aipt_v2/utils/model_manager.py +187 -0
- aipt_v2/utils/searchers/__init__.py +269 -0
- aipt_v2/verify_install.py +793 -0
- aiptx-2.0.7.dist-info/METADATA +345 -0
- aiptx-2.0.7.dist-info/RECORD +187 -0
- aiptx-2.0.7.dist-info/WHEEL +5 -0
- aiptx-2.0.7.dist-info/entry_points.txt +7 -0
- aiptx-2.0.7.dist-info/licenses/LICENSE +21 -0
- aiptx-2.0.7.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Searcher Utilities for AIPT v2
|
|
3
|
+
==============================
|
|
4
|
+
|
|
5
|
+
Provides utility functions for intelligence searchers:
|
|
6
|
+
- Domain filtering
|
|
7
|
+
- File extension filtering
|
|
8
|
+
- Repository filtering
|
|
9
|
+
- Directory cleanup
|
|
10
|
+
|
|
11
|
+
These are stub implementations for compatibility with
|
|
12
|
+
intelligence/searchers modules.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import re
|
|
17
|
+
from typing import List, Set
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
|
|
20
|
+
from aipt_v2.utils.logging import logger
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Blocked domains for security/ethical reasons
|
|
24
|
+
BLOCKED_DOMAINS: Set[str] = {
|
|
25
|
+
".gov",
|
|
26
|
+
".mil",
|
|
27
|
+
".edu",
|
|
28
|
+
".bank",
|
|
29
|
+
".police",
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
# Allowed web page extensions
|
|
33
|
+
WEB_EXTENSIONS: Set[str] = {
|
|
34
|
+
".html",
|
|
35
|
+
".htm",
|
|
36
|
+
".php",
|
|
37
|
+
".asp",
|
|
38
|
+
".aspx",
|
|
39
|
+
".jsp",
|
|
40
|
+
".do",
|
|
41
|
+
"", # No extension
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
# Blocked file patterns for GitHub
|
|
45
|
+
BLOCKED_GITHUB_PATTERNS: Set[str] = {
|
|
46
|
+
"README",
|
|
47
|
+
"LICENSE",
|
|
48
|
+
"CHANGELOG",
|
|
49
|
+
"CONTRIBUTING",
|
|
50
|
+
".md",
|
|
51
|
+
".txt",
|
|
52
|
+
".rst",
|
|
53
|
+
".lock",
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class DomainFilter:
|
|
58
|
+
"""Filter domains based on security/ethical rules."""
|
|
59
|
+
|
|
60
|
+
def __init__(self, blocked: Set[str] = None, allowed: Set[str] = None):
|
|
61
|
+
self.blocked = blocked or BLOCKED_DOMAINS
|
|
62
|
+
self.allowed = allowed or set()
|
|
63
|
+
|
|
64
|
+
def __call__(self, domain: str) -> bool:
|
|
65
|
+
return self.is_allowed(domain)
|
|
66
|
+
|
|
67
|
+
def is_allowed(self, domain: str) -> bool:
|
|
68
|
+
"""
|
|
69
|
+
Check if domain is allowed for scanning.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
domain: Domain to check
|
|
73
|
+
|
|
74
|
+
Returns:
|
|
75
|
+
True if domain is allowed
|
|
76
|
+
"""
|
|
77
|
+
domain_lower = domain.lower()
|
|
78
|
+
|
|
79
|
+
# Check blocked list
|
|
80
|
+
for blocked in self.blocked:
|
|
81
|
+
if domain_lower.endswith(blocked):
|
|
82
|
+
logger.debug("Domain blocked", domain=domain, reason=f"ends with {blocked}")
|
|
83
|
+
return False
|
|
84
|
+
|
|
85
|
+
# If allowed list exists, check it
|
|
86
|
+
if self.allowed:
|
|
87
|
+
for allowed in self.allowed:
|
|
88
|
+
if domain_lower.endswith(allowed):
|
|
89
|
+
return True
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
return True
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class ExtensionFilter:
|
|
96
|
+
"""Filter files/URLs by extension."""
|
|
97
|
+
|
|
98
|
+
def __init__(self, allowed: Set[str] = None, blocked: Set[str] = None):
|
|
99
|
+
self.allowed = allowed or set()
|
|
100
|
+
self.blocked = blocked or set()
|
|
101
|
+
|
|
102
|
+
def __call__(self, filename: str) -> bool:
|
|
103
|
+
return self.is_allowed(filename)
|
|
104
|
+
|
|
105
|
+
def is_allowed(self, filename: str) -> bool:
|
|
106
|
+
"""Check if file extension is allowed."""
|
|
107
|
+
ext = Path(filename).suffix.lower()
|
|
108
|
+
|
|
109
|
+
if self.blocked and ext in self.blocked:
|
|
110
|
+
return False
|
|
111
|
+
|
|
112
|
+
if self.allowed:
|
|
113
|
+
return ext in self.allowed
|
|
114
|
+
|
|
115
|
+
return True
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class RepositoryFilter:
|
|
119
|
+
"""Filter GitHub repositories."""
|
|
120
|
+
|
|
121
|
+
def __init__(self, blocked_patterns: Set[str] = None):
|
|
122
|
+
self.blocked = blocked_patterns or set()
|
|
123
|
+
|
|
124
|
+
def __call__(self, repo: str) -> bool:
|
|
125
|
+
return self.is_allowed(repo)
|
|
126
|
+
|
|
127
|
+
def is_allowed(self, repo: str) -> bool:
|
|
128
|
+
"""Check if repository name is allowed."""
|
|
129
|
+
repo_lower = repo.lower()
|
|
130
|
+
|
|
131
|
+
for pattern in self.blocked:
|
|
132
|
+
if pattern.lower() in repo_lower:
|
|
133
|
+
return False
|
|
134
|
+
|
|
135
|
+
return True
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# Pre-configured filter instances
|
|
139
|
+
domain_filter = DomainFilter()
|
|
140
|
+
repository_filter = RepositoryFilter()
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def for_google_webpage(extension: str) -> bool:
|
|
144
|
+
"""
|
|
145
|
+
Check if extension is valid for web pages.
|
|
146
|
+
|
|
147
|
+
Args:
|
|
148
|
+
extension: File extension (with or without dot)
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
True if valid web page extension
|
|
152
|
+
"""
|
|
153
|
+
ext = extension.lower()
|
|
154
|
+
if not ext.startswith("."):
|
|
155
|
+
ext = f".{ext}" if ext else ""
|
|
156
|
+
|
|
157
|
+
return ext in WEB_EXTENSIONS
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def for_github_repo_file(filename: str) -> bool:
|
|
161
|
+
"""
|
|
162
|
+
Check if file should be included from GitHub repo.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
filename: File name to check
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
True if file should be included
|
|
169
|
+
"""
|
|
170
|
+
filename_upper = filename.upper()
|
|
171
|
+
|
|
172
|
+
for pattern in BLOCKED_GITHUB_PATTERNS:
|
|
173
|
+
if pattern.upper() in filename_upper or filename.endswith(pattern):
|
|
174
|
+
return False
|
|
175
|
+
|
|
176
|
+
return True
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def remove_empty_directories(path: str) -> int:
|
|
180
|
+
"""
|
|
181
|
+
Remove empty directories recursively.
|
|
182
|
+
|
|
183
|
+
Args:
|
|
184
|
+
path: Root path to clean
|
|
185
|
+
|
|
186
|
+
Returns:
|
|
187
|
+
Number of directories removed
|
|
188
|
+
"""
|
|
189
|
+
removed = 0
|
|
190
|
+
path_obj = Path(path)
|
|
191
|
+
|
|
192
|
+
if not path_obj.exists():
|
|
193
|
+
return 0
|
|
194
|
+
|
|
195
|
+
for dirpath in sorted(path_obj.rglob("*"), reverse=True):
|
|
196
|
+
if dirpath.is_dir():
|
|
197
|
+
try:
|
|
198
|
+
# Check if directory is empty
|
|
199
|
+
if not any(dirpath.iterdir()):
|
|
200
|
+
dirpath.rmdir()
|
|
201
|
+
removed += 1
|
|
202
|
+
logger.debug("Removed empty directory", path=str(dirpath))
|
|
203
|
+
except OSError as e:
|
|
204
|
+
logger.warning("Failed to remove directory", path=str(dirpath), error=str(e))
|
|
205
|
+
|
|
206
|
+
return removed
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def sanitize_filename(filename: str) -> str:
|
|
210
|
+
"""
|
|
211
|
+
Sanitize filename for safe filesystem use.
|
|
212
|
+
|
|
213
|
+
Args:
|
|
214
|
+
filename: Original filename
|
|
215
|
+
|
|
216
|
+
Returns:
|
|
217
|
+
Sanitized filename
|
|
218
|
+
"""
|
|
219
|
+
# Remove or replace dangerous characters
|
|
220
|
+
sanitized = re.sub(r'[<>:"/\\|?*]', '_', filename)
|
|
221
|
+
sanitized = re.sub(r'\s+', '_', sanitized)
|
|
222
|
+
sanitized = sanitized.strip('._')
|
|
223
|
+
|
|
224
|
+
# Limit length
|
|
225
|
+
if len(sanitized) > 200:
|
|
226
|
+
sanitized = sanitized[:200]
|
|
227
|
+
|
|
228
|
+
return sanitized or "unnamed"
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def validate_cve_id(cve_id: str) -> bool:
|
|
232
|
+
"""
|
|
233
|
+
Validate CVE ID format.
|
|
234
|
+
|
|
235
|
+
Args:
|
|
236
|
+
cve_id: CVE identifier to validate
|
|
237
|
+
|
|
238
|
+
Returns:
|
|
239
|
+
True if valid CVE format
|
|
240
|
+
"""
|
|
241
|
+
pattern = r'^CVE-\d{4}-\d{4,}$'
|
|
242
|
+
return bool(re.match(pattern, cve_id.upper()))
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def extract_cve_ids(text: str) -> List[str]:
|
|
246
|
+
"""
|
|
247
|
+
Extract CVE IDs from text.
|
|
248
|
+
|
|
249
|
+
Args:
|
|
250
|
+
text: Text to search
|
|
251
|
+
|
|
252
|
+
Returns:
|
|
253
|
+
List of CVE IDs found
|
|
254
|
+
"""
|
|
255
|
+
pattern = r'CVE-\d{4}-\d{4,}'
|
|
256
|
+
matches = re.findall(pattern, text.upper())
|
|
257
|
+
return list(set(matches))
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
# GitHub configuration compatibility
|
|
261
|
+
class GitHubConfig:
|
|
262
|
+
"""GitHub API configuration."""
|
|
263
|
+
API_URL = "https://api.github.com"
|
|
264
|
+
SEARCH_URL = f"{API_URL}/search"
|
|
265
|
+
RATE_LIMIT = 30 # requests per minute for unauthenticated
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
# Alias for backwards compatibility
|
|
269
|
+
c = GitHubConfig
|