open-sploit 1.2.0

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.
Files changed (81) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +75 -0
  3. package/bin/install.mjs +158 -0
  4. package/package.json +27 -0
  5. package/template/agent/offsec.md +53 -0
  6. package/template/command/target.md +45 -0
  7. package/template/config/opencode.example.json +46 -0
  8. package/template/skills/api-security-testing/SKILL.md +61 -0
  9. package/template/skills/conducting-api-security-testing/LICENSE +201 -0
  10. package/template/skills/conducting-api-security-testing/SKILL.md +195 -0
  11. package/template/skills/conducting-api-security-testing/references/api-reference.md +62 -0
  12. package/template/skills/conducting-api-security-testing/scripts/agent.py +228 -0
  13. package/template/skills/exploiting-api-injection-vulnerabilities/LICENSE +201 -0
  14. package/template/skills/exploiting-api-injection-vulnerabilities/SKILL.md +481 -0
  15. package/template/skills/exploiting-api-injection-vulnerabilities/references/api-reference.md +103 -0
  16. package/template/skills/exploiting-api-injection-vulnerabilities/scripts/agent.py +142 -0
  17. package/template/skills/exploiting-http-request-smuggling/LICENSE +201 -0
  18. package/template/skills/exploiting-http-request-smuggling/SKILL.md +343 -0
  19. package/template/skills/exploiting-http-request-smuggling/references/api-reference.md +53 -0
  20. package/template/skills/exploiting-http-request-smuggling/scripts/agent.py +196 -0
  21. package/template/skills/exploiting-idor-vulnerabilities/LICENSE +201 -0
  22. package/template/skills/exploiting-idor-vulnerabilities/SKILL.md +309 -0
  23. package/template/skills/exploiting-idor-vulnerabilities/references/api-reference.md +52 -0
  24. package/template/skills/exploiting-idor-vulnerabilities/scripts/agent.py +177 -0
  25. package/template/skills/exploiting-jwt-algorithm-confusion-attack/LICENSE +201 -0
  26. package/template/skills/exploiting-jwt-algorithm-confusion-attack/SKILL.md +472 -0
  27. package/template/skills/exploiting-jwt-algorithm-confusion-attack/references/api-reference.md +99 -0
  28. package/template/skills/exploiting-jwt-algorithm-confusion-attack/scripts/agent.py +132 -0
  29. package/template/skills/exploiting-nosql-injection-vulnerabilities/LICENSE +201 -0
  30. package/template/skills/exploiting-nosql-injection-vulnerabilities/SKILL.md +219 -0
  31. package/template/skills/exploiting-nosql-injection-vulnerabilities/assets/template.md +30 -0
  32. package/template/skills/exploiting-nosql-injection-vulnerabilities/references/api-reference.md +85 -0
  33. package/template/skills/exploiting-nosql-injection-vulnerabilities/references/standards.md +19 -0
  34. package/template/skills/exploiting-nosql-injection-vulnerabilities/references/workflows.md +23 -0
  35. package/template/skills/exploiting-nosql-injection-vulnerabilities/scripts/agent.py +136 -0
  36. package/template/skills/exploiting-nosql-injection-vulnerabilities/scripts/process.py +222 -0
  37. package/template/skills/exploiting-oauth-misconfiguration/LICENSE +201 -0
  38. package/template/skills/exploiting-oauth-misconfiguration/SKILL.md +316 -0
  39. package/template/skills/exploiting-oauth-misconfiguration/references/api-reference.md +59 -0
  40. package/template/skills/exploiting-oauth-misconfiguration/scripts/agent.py +232 -0
  41. package/template/skills/exploiting-prototype-pollution-in-javascript/LICENSE +201 -0
  42. package/template/skills/exploiting-prototype-pollution-in-javascript/SKILL.md +239 -0
  43. package/template/skills/exploiting-prototype-pollution-in-javascript/references/api-reference.md +102 -0
  44. package/template/skills/exploiting-prototype-pollution-in-javascript/scripts/agent.py +156 -0
  45. package/template/skills/exploiting-race-condition-vulnerabilities/LICENSE +201 -0
  46. package/template/skills/exploiting-race-condition-vulnerabilities/SKILL.md +246 -0
  47. package/template/skills/exploiting-race-condition-vulnerabilities/references/api-reference.md +84 -0
  48. package/template/skills/exploiting-race-condition-vulnerabilities/scripts/agent.py +119 -0
  49. package/template/skills/exploiting-server-side-request-forgery/LICENSE +201 -0
  50. package/template/skills/exploiting-server-side-request-forgery/SKILL.md +354 -0
  51. package/template/skills/exploiting-server-side-request-forgery/references/api-reference.md +57 -0
  52. package/template/skills/exploiting-server-side-request-forgery/scripts/agent.py +183 -0
  53. package/template/skills/exploiting-sql-injection-vulnerabilities/LICENSE +201 -0
  54. package/template/skills/exploiting-sql-injection-vulnerabilities/SKILL.md +205 -0
  55. package/template/skills/exploiting-sql-injection-vulnerabilities/references/api-reference.md +60 -0
  56. package/template/skills/exploiting-sql-injection-vulnerabilities/scripts/agent.py +196 -0
  57. package/template/skills/exploiting-sql-injection-with-sqlmap/LICENSE +201 -0
  58. package/template/skills/exploiting-sql-injection-with-sqlmap/SKILL.md +257 -0
  59. package/template/skills/exploiting-sql-injection-with-sqlmap/references/api-reference.md +74 -0
  60. package/template/skills/exploiting-sql-injection-with-sqlmap/scripts/agent.py +217 -0
  61. package/template/skills/exploiting-template-injection-vulnerabilities/LICENSE +201 -0
  62. package/template/skills/exploiting-template-injection-vulnerabilities/SKILL.md +322 -0
  63. package/template/skills/exploiting-template-injection-vulnerabilities/references/api-reference.md +55 -0
  64. package/template/skills/exploiting-template-injection-vulnerabilities/scripts/agent.py +205 -0
  65. package/template/skills/exploiting-type-juggling-vulnerabilities/LICENSE +201 -0
  66. package/template/skills/exploiting-type-juggling-vulnerabilities/SKILL.md +272 -0
  67. package/template/skills/exploiting-type-juggling-vulnerabilities/references/api-reference.md +87 -0
  68. package/template/skills/exploiting-type-juggling-vulnerabilities/scripts/agent.py +141 -0
  69. package/template/skills/exploiting-websocket-vulnerabilities/LICENSE +201 -0
  70. package/template/skills/exploiting-websocket-vulnerabilities/SKILL.md +424 -0
  71. package/template/skills/exploiting-websocket-vulnerabilities/references/api-reference.md +62 -0
  72. package/template/skills/exploiting-websocket-vulnerabilities/scripts/agent.py +211 -0
  73. package/template/skills/hackerone/SKILL.md +137 -0
  74. package/template/skills/hackerone/reference/INTEGRATION_GUIDE.md +199 -0
  75. package/template/skills/hackerone/reference/sensitive-data-tracking.md +134 -0
  76. package/template/skills/hackerone/tools/__init__.py +0 -0
  77. package/template/skills/hackerone/tools/csv_parser.py +185 -0
  78. package/template/skills/hackerone/tools/report_validator.py +285 -0
  79. package/template/skills/hackerone/tools/sensitive_data_tracker.py +495 -0
  80. package/template/skills/owasp-top-10-testing/SKILL.md +64 -0
  81. package/template/skills/web-app-penetration-testing/SKILL.md +54 -0
@@ -0,0 +1,495 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Sensitive Data Metadata Tracker for HackerOne Bug Bounty Testing
4
+
5
+ Tracks and documents all credentials, tokens, and sensitive data discovered
6
+ during penetration testing in a structured JSON format.
7
+ """
8
+
9
+ import json
10
+ import os
11
+ from datetime import datetime, timezone
12
+ from typing import Dict, List, Optional, Any
13
+ import hashlib
14
+
15
+
16
+ class SensitiveDataTracker:
17
+ """Track sensitive data discovered during penetration testing"""
18
+
19
+ CATEGORIES = [
20
+ "credentials",
21
+ "api_keys_and_tokens",
22
+ "private_data",
23
+ "configuration_data",
24
+ "user_pii",
25
+ "other_sensitive"
26
+ ]
27
+
28
+ SEVERITY_LEVELS = ["CRITICAL", "HIGH", "MEDIUM", "LOW", "INFO"]
29
+
30
+ def __init__(self, program_name: str, asset_identifier: str, output_dir: str):
31
+ """
32
+ Initialize sensitive data tracker
33
+
34
+ Args:
35
+ program_name: HackerOne program name
36
+ asset_identifier: Asset being tested (URL, domain, etc.)
37
+ output_dir: Directory to save metadata files
38
+ """
39
+ self.program_name = program_name
40
+ self.asset_identifier = asset_identifier
41
+ self.output_dir = output_dir
42
+
43
+ # Ensure output directory exists
44
+ os.makedirs(output_dir, exist_ok=True)
45
+
46
+ # Initialize metadata structure
47
+ self.metadata = {
48
+ "program": program_name,
49
+ "asset_identifier": asset_identifier,
50
+ "testing_date_start": datetime.now(timezone.utc).isoformat(),
51
+ "testing_date_end": None,
52
+ "tester": "Pentester Agent",
53
+ "sensitive_data_categories": {cat: [] for cat in self.CATEGORIES},
54
+ "summary": {
55
+ "total_items_discovered": 0,
56
+ "by_category": {cat: 0 for cat in self.CATEGORIES},
57
+ "by_severity": {level: 0 for level in self.SEVERITY_LEVELS},
58
+ "highest_risk_finding": None
59
+ },
60
+ "remediation_status": "pending"
61
+ }
62
+
63
+ self._save_metadata()
64
+
65
+ def add_sensitive_data(
66
+ self,
67
+ category: str,
68
+ data_type: str,
69
+ location: str,
70
+ finding_id: str,
71
+ data_preview: Dict[str, Any],
72
+ severity: str,
73
+ impact_assessment: Dict[str, Any],
74
+ evidence: Optional[Dict[str, str]] = None,
75
+ remediation: Optional[str] = None
76
+ ) -> None:
77
+ """
78
+ Add discovered sensitive data to tracking
79
+
80
+ Args:
81
+ category: Data category (credentials, api_keys_and_tokens, etc.)
82
+ data_type: Type within category (e.g., username_password, api_key)
83
+ location: Where data was found
84
+ finding_id: Associated finding ID
85
+ data_preview: Preview of data (with redaction)
86
+ severity: CRITICAL, HIGH, MEDIUM, LOW, INFO
87
+ impact_assessment: Business impact analysis
88
+ evidence: Files/screenshots proving discovery
89
+ remediation: Recommended remediation action
90
+ """
91
+
92
+ if category not in self.CATEGORIES:
93
+ raise ValueError(f"Invalid category: {category}")
94
+
95
+ if severity not in self.SEVERITY_LEVELS:
96
+ raise ValueError(f"Invalid severity: {severity}")
97
+
98
+ item = {
99
+ "type": data_type,
100
+ "location": location,
101
+ "finding_id": finding_id,
102
+ "discovered_date": datetime.now(timezone.utc).isoformat(),
103
+ "data": data_preview,
104
+ "severity": severity,
105
+ "impact_assessment": impact_assessment,
106
+ "evidence": evidence or {},
107
+ "remediation": remediation or "Review and rotate credentials",
108
+ "status": "discovered"
109
+ }
110
+
111
+ # Add to metadata
112
+ self.metadata["sensitive_data_categories"][category].append(item)
113
+
114
+ # Update summary
115
+ self.metadata["summary"]["total_items_discovered"] += 1
116
+ self.metadata["summary"]["by_category"][category] += 1
117
+ self.metadata["summary"]["by_severity"][severity] += 1
118
+
119
+ # Update highest risk finding
120
+ if severity == "CRITICAL":
121
+ if not self.metadata["summary"]["highest_risk_finding"]:
122
+ self.metadata["summary"]["highest_risk_finding"] = finding_id
123
+
124
+ # Save immediately to avoid data loss
125
+ self._save_metadata()
126
+
127
+ print(f"[+] Logged {category}/{data_type} (severity: {severity})")
128
+
129
+ def add_credentials(
130
+ self,
131
+ username: str,
132
+ password_hash: str,
133
+ account_type: str,
134
+ location: str,
135
+ finding_id: str,
136
+ hash_algorithm: Optional[str] = None,
137
+ evidence: Optional[Dict[str, str]] = None
138
+ ) -> None:
139
+ """Add discovered credentials"""
140
+
141
+ data_preview = {
142
+ "username": username if username else "[REDACTED]",
143
+ "password_hash": password_hash if password_hash else "[REDACTED]",
144
+ "account_type": account_type,
145
+ "hash_algorithm": hash_algorithm
146
+ }
147
+
148
+ impact = {
149
+ "severity": "CRITICAL",
150
+ "risk": "Account takeover, privilege escalation",
151
+ "potential_actions": ["account_takeover", "data_breach"]
152
+ }
153
+
154
+ self.add_sensitive_data(
155
+ category="credentials",
156
+ data_type="username_password",
157
+ location=location,
158
+ finding_id=finding_id,
159
+ data_preview=data_preview,
160
+ severity="CRITICAL",
161
+ impact_assessment=impact,
162
+ evidence=evidence,
163
+ remediation="Rotate credentials immediately"
164
+ )
165
+
166
+ def add_api_key(
167
+ self,
168
+ key_id: str,
169
+ key_preview: str,
170
+ scope: List[str],
171
+ location: str,
172
+ finding_id: str,
173
+ token_type: str = "API Key",
174
+ evidence: Optional[Dict[str, str]] = None
175
+ ) -> None:
176
+ """Add discovered API key or token"""
177
+
178
+ data_preview = {
179
+ "key_id": key_id if key_id else "[REDACTED]",
180
+ "key_preview": key_preview,
181
+ "token_type": token_type,
182
+ "scope": scope
183
+ }
184
+
185
+ impact = {
186
+ "severity": "HIGH",
187
+ "risk": "Unauthorized API access, data exfiltration",
188
+ "endpoints_accessible": len(scope)
189
+ }
190
+
191
+ self.add_sensitive_data(
192
+ category="api_keys_and_tokens",
193
+ data_type=token_type.lower(),
194
+ location=location,
195
+ finding_id=finding_id,
196
+ data_preview=data_preview,
197
+ severity="HIGH",
198
+ impact_assessment=impact,
199
+ evidence=evidence,
200
+ remediation="Revoke token immediately and rotate secrets"
201
+ )
202
+
203
+ def add_private_key(
204
+ self,
205
+ key_type: str,
206
+ key_length: int,
207
+ purpose: str,
208
+ location: str,
209
+ finding_id: str,
210
+ systems_accessible: Optional[List[str]] = None,
211
+ evidence: Optional[Dict[str, str]] = None
212
+ ) -> None:
213
+ """Add discovered private key"""
214
+
215
+ data_preview = {
216
+ "key_type": key_type,
217
+ "key_length": key_length,
218
+ "purpose": purpose,
219
+ "systems_accessible": systems_accessible or []
220
+ }
221
+
222
+ impact = {
223
+ "severity": "CRITICAL",
224
+ "risk": "Server access, complete system compromise",
225
+ "systems_affected": len(systems_accessible or [])
226
+ }
227
+
228
+ self.add_sensitive_data(
229
+ category="private_data",
230
+ data_type="private_key",
231
+ location=location,
232
+ finding_id=finding_id,
233
+ data_preview=data_preview,
234
+ severity="CRITICAL",
235
+ impact_assessment=impact,
236
+ evidence=evidence,
237
+ remediation="Revoke key and rotate all dependent credentials"
238
+ )
239
+
240
+ def add_database_credentials(
241
+ self,
242
+ database_type: str,
243
+ host: str,
244
+ port: int,
245
+ database_name: str,
246
+ location: str,
247
+ finding_id: str,
248
+ records_affected: Optional[int] = None,
249
+ evidence: Optional[Dict[str, str]] = None
250
+ ) -> None:
251
+ """Add discovered database credentials"""
252
+
253
+ data_preview = {
254
+ "database_type": database_type,
255
+ "host": host if host else "[REDACTED]",
256
+ "port": port,
257
+ "database_name": database_name,
258
+ "records_accessible": records_affected
259
+ }
260
+
261
+ impact = {
262
+ "severity": "CRITICAL",
263
+ "risk": "Complete database access, data exfiltration",
264
+ "records_affected": records_affected or 0
265
+ }
266
+
267
+ self.add_sensitive_data(
268
+ category="configuration_data",
269
+ data_type="database_credentials",
270
+ location=location,
271
+ finding_id=finding_id,
272
+ data_preview=data_preview,
273
+ severity="CRITICAL",
274
+ impact_assessment=impact,
275
+ evidence=evidence,
276
+ remediation="Rotate database credentials immediately"
277
+ )
278
+
279
+ def add_user_pii(
280
+ self,
281
+ pii_types: List[str],
282
+ records_affected: int,
283
+ location: str,
284
+ finding_id: str,
285
+ affected_jurisdictions: Optional[List[str]] = None,
286
+ evidence: Optional[Dict[str, str]] = None
287
+ ) -> None:
288
+ """Add discovered user PII"""
289
+
290
+ data_preview = {
291
+ "pii_types": pii_types,
292
+ "records_affected": records_affected,
293
+ "affected_jurisdictions": affected_jurisdictions or []
294
+ }
295
+
296
+ impact = {
297
+ "severity": "CRITICAL",
298
+ "risk": "Privacy violation, regulatory fines, identity theft",
299
+ "records_exposed": records_affected,
300
+ "legal_implications": ["GDPR", "CCPA"] if affected_jurisdictions else []
301
+ }
302
+
303
+ self.add_sensitive_data(
304
+ category="user_pii",
305
+ data_type="personal_information",
306
+ location=location,
307
+ finding_id=finding_id,
308
+ data_preview=data_preview,
309
+ severity="CRITICAL",
310
+ impact_assessment=impact,
311
+ evidence=evidence,
312
+ remediation="Notify affected users per GDPR requirements (72 hours)"
313
+ )
314
+
315
+ def add_configuration_data(
316
+ self,
317
+ config_type: str,
318
+ data_exposed: str,
319
+ location: str,
320
+ finding_id: str,
321
+ evidence: Optional[Dict[str, str]] = None
322
+ ) -> None:
323
+ """Add exposed configuration data"""
324
+
325
+ data_preview = {
326
+ "config_type": config_type,
327
+ "description": data_exposed
328
+ }
329
+
330
+ impact = {
331
+ "severity": "HIGH",
332
+ "risk": "Information disclosure, enables further attacks",
333
+ "potential_actions": ["reconnaissance", "targeted_attacks"]
334
+ }
335
+
336
+ self.add_sensitive_data(
337
+ category="configuration_data",
338
+ data_type=config_type,
339
+ location=location,
340
+ finding_id=finding_id,
341
+ data_preview=data_preview,
342
+ severity="HIGH",
343
+ impact_assessment=impact,
344
+ evidence=evidence,
345
+ remediation="Remove sensitive data from error messages and logs"
346
+ )
347
+
348
+ def add_other_sensitive_data(
349
+ self,
350
+ data_type: str,
351
+ items: List[str],
352
+ location: str,
353
+ finding_id: str,
354
+ severity: str = "MEDIUM",
355
+ evidence: Optional[Dict[str, str]] = None
356
+ ) -> None:
357
+ """Add other sensitive data"""
358
+
359
+ data_preview = {
360
+ "data_type": data_type,
361
+ "items": items,
362
+ "count": len(items)
363
+ }
364
+
365
+ impact = {
366
+ "severity": severity,
367
+ "risk": f"Exposed {data_type} enables further reconnaissance"
368
+ }
369
+
370
+ self.add_sensitive_data(
371
+ category="other_sensitive",
372
+ data_type=data_type,
373
+ location=location,
374
+ finding_id=finding_id,
375
+ data_preview=data_preview,
376
+ severity=severity,
377
+ impact_assessment=impact,
378
+ evidence=evidence
379
+ )
380
+
381
+ def finalize(self) -> None:
382
+ """Finalize tracking upon testing completion"""
383
+ self.metadata["testing_date_end"] = datetime.now(timezone.utc).isoformat()
384
+ self._save_metadata()
385
+
386
+ def generate_summary_report(self) -> str:
387
+ """Generate markdown summary report"""
388
+
389
+ report = f"""# Sensitive Data Discovery Report
390
+
391
+ **Program**: {self.program_name}
392
+ **Asset**: {self.asset_identifier}
393
+ **Testing Start**: {self.metadata['testing_date_start']}
394
+ **Testing End**: {self.metadata.get('testing_date_end', 'In Progress')}
395
+
396
+ ## Summary
397
+
398
+ **Total Sensitive Items Discovered**: {self.metadata['summary']['total_items_discovered']}
399
+
400
+ ### By Category
401
+ """
402
+
403
+ for cat, count in self.metadata['summary']['by_category'].items():
404
+ if count > 0:
405
+ report += f"- {cat.replace('_', ' ').title()}: **{count}** items\n"
406
+
407
+ report += "\n### By Severity\n"
408
+
409
+ for level, count in self.metadata['summary']['by_severity'].items():
410
+ if count > 0:
411
+ report += f"- **{level}**: {count} items\n"
412
+
413
+ report += "\n## Highest Risk\n"
414
+
415
+ if self.metadata['summary']['highest_risk_finding']:
416
+ report += f"Most critical findings: {self.metadata['summary']['highest_risk_finding']}\n"
417
+
418
+ report += "\n## Required Actions\n"
419
+ report += "- [ ] Rotate all discovered credentials immediately\n"
420
+ report += "- [ ] Revoke all API keys and tokens\n"
421
+ report += "- [ ] Disable compromised accounts\n"
422
+ report += "- [ ] Notify users if PII was exposed\n"
423
+ report += "- [ ] Audit access logs\n"
424
+
425
+ return report
426
+
427
+ def _save_metadata(self) -> None:
428
+ """Save metadata to JSON file"""
429
+ filepath = os.path.join(self.output_dir, "sensitive_data_metadata.json")
430
+
431
+ with open(filepath, 'w') as f:
432
+ json.dump(self.metadata, f, indent=2)
433
+
434
+ def export_summary(self, output_path: Optional[str] = None) -> str:
435
+ """Export markdown summary report"""
436
+ if not output_path:
437
+ output_path = os.path.join(self.output_dir, "sensitive_data_report.md")
438
+
439
+ report = self.generate_summary_report()
440
+
441
+ with open(output_path, 'w') as f:
442
+ f.write(report)
443
+
444
+ return output_path
445
+
446
+
447
+ # Example usage
448
+ if __name__ == "__main__":
449
+ # Initialize tracker
450
+ tracker = SensitiveDataTracker(
451
+ program_name="ACME Corp Bug Bounty",
452
+ asset_identifier="https://example.com",
453
+ output_dir="./findings"
454
+ )
455
+
456
+ # Log discovered credentials
457
+ tracker.add_credentials(
458
+ username="admin",
459
+ password_hash="$2y$10$abc123...",
460
+ account_type="admin",
461
+ location="SQL injection in search parameter",
462
+ finding_id="finding-001",
463
+ evidence={
464
+ "poc_script": "findings/finding-001/poc.py",
465
+ "poc_output": "findings/finding-001/poc_output.txt"
466
+ }
467
+ )
468
+
469
+ # Log discovered API key
470
+ tracker.add_api_key(
471
+ key_id="sk_live_abc123",
472
+ key_preview="sk_live_****...1234",
473
+ scope=["read:users", "write:data"],
474
+ location="Hardcoded in JavaScript",
475
+ finding_id="finding-003",
476
+ token_type="API Key"
477
+ )
478
+
479
+ # Log discovered private key
480
+ tracker.add_private_key(
481
+ key_type="RSA",
482
+ key_length=2048,
483
+ purpose="SSH access to production",
484
+ location=".git/config",
485
+ finding_id="finding-005",
486
+ systems_accessible=["prod-db-01", "prod-api-server"]
487
+ )
488
+
489
+ # Finalize
490
+ tracker.finalize()
491
+
492
+ # Export summary
493
+ report_path = tracker.export_summary()
494
+ print(f"\n[+] Report saved to: {report_path}")
495
+ print(f"[+] Metadata saved to: {os.path.join(tracker.output_dir, 'sensitive_data_metadata.json')}")
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: owasp-top-10-testing
3
+ description: Test an application against the OWASP Top 10 with Strix — autonomous AI agents that attempt real exploits for each category of the current OWASP Top 10:2025 (broken access control including SSRF, security misconfiguration, software supply chain failures, cryptographic failures, injection, insecure design, authentication failures, integrity failures, logging and alerting failures, mishandling of exceptional conditions) and report only what they could actually prove, mapped back to the category with a proof-of-concept. Also covers the OWASP API Security Top 10 (2023). Use when the user asks for an OWASP Top 10 assessment, OWASP compliance testing, or a security review mapped to OWASP categories.
4
+ license: Apache-2.0
5
+ metadata:
6
+ author: usestrix
7
+ homepage: https://docs.strix.ai
8
+ ---
9
+
10
+ # Test against the OWASP Top 10
11
+
12
+ The OWASP Top 10 is a taxonomy of risk categories, not a test suite — "OWASP Top 10 testing" means exercising each category against the real application and reporting what's actually exploitable. Strix's agents do the exploitation; this skill covers running it category-by-category and reporting coverage honestly.
13
+
14
+ **Use the current edition: [OWASP Top 10:2025](https://owasp.org/Top10/)** (8th installment, superseding 2021). Ask the user before targeting an older edition — some compliance checklists still reference 2021, and a report labelled with the wrong edition is misleading. Key differences from 2021: **SSRF is folded into A01**, **A03 Software Supply Chain Failures** expands the old "Vulnerable and Outdated Components", and **A10 Mishandling of Exceptional Conditions** is new; A02 Security Misconfiguration moved 5→2.
15
+
16
+ Install, LLM setup, and the managed-cloud alternative: **penetration-testing-with-strix**.
17
+
18
+ ## What is and is not testable by an agent
19
+
20
+ Be straight with the user about this — claiming a clean sweep of all ten is misleading.
21
+
22
+ | Category (2025) | Coverage |
23
+ |---|---|
24
+ | A01 Broken Access Control (incl. SSRF) | **Strong** — cross-user/tenant access, privilege escalation, IDOR, and SSRF (including blind, via out-of-band callbacks) are all exploit-validated. Needs two accounts plus a privileged one to prove the authorization half. |
25
+ | A02 Security Misconfiguration | **Strong** — debug endpoints, verbose errors, permissive CORS, missing hardening, default credentials, exposed admin surfaces. |
26
+ | A03 Software Supply Chain Failures | **Partial** — version fingerprinting, and vulnerable/outdated dependency review when source is supplied. Build-system and distribution-infrastructure compromise (the broader half of this category) is out of scope for a runtime scan — pair with SCA plus build-provenance controls. |
27
+ | A04 Cryptographic Failures | **Partial** — transport config, unencrypted data in transit, secrets and tokens leaked in responses. At-rest crypto and key management need source or infra review. |
28
+ | A05 Injection | **Strong** — SQL/NoSQL/command/template injection and XSS, exploit-validated. |
29
+ | A06 Insecure Design | **Partial** — business-logic abuse (price/quantity tampering, workflow skipping, race conditions) is found where reachable; design intent still needs human review and threat modelling. |
30
+ | A07 Authentication Failures | **Strong** — auth bypass, weak session/token handling, password-reset and MFA flaws. |
31
+ | A08 Software or Data Integrity Failures | **Partial** — insecure deserialization and unsigned-update paths where reachable; CI/CD trust boundaries are not runtime-testable. |
32
+ | A09 Security Logging & Alerting Failures | **Not testable from outside** — requires reviewing the logging and alerting pipeline. State this rather than reporting it as passed. |
33
+ | A10 Mishandling of Exceptional Conditions | **Partial** — agents actively probe error handling and fail-open behavior (malformed input, forced errors, race and timeout conditions) and report what leaks or bypasses a control; exhaustive coverage of internal error paths needs source review. |
34
+
35
+ For APIs, run the same exercise against the **OWASP API Security Top 10 (2023)** — API1 BOLA, API3 Broken Object Property Level Authorization (2019's excessive data exposure + mass assignment merged), API5 broken function-level authorization — using the **api-security-testing** skill.
36
+
37
+ ## Run it
38
+
39
+ Maximum category coverage comes from giving the agents both the source and a running instance, plus credentials at two privilege levels:
40
+
41
+ ```bash
42
+ strix -n \
43
+ -t https://github.com/org/app \
44
+ -t https://staging.example.com \
45
+ --scan-mode deep --max-budget 30 \
46
+ --instruction "OWASP Top 10:2025 assessment. Cover every category systematically and map each finding to its 2025 category id.
47
+ Accounts: userA@example.com/<pw> (org 1), userB@example.com/<pw> (org 2), admin@example.com/<pw>.
48
+ Prioritise A01 (cross-org access, privilege escalation, SSRF), A02, A05, A07, A10.
49
+ Out of scope: /billing/*, outbound email."
50
+ ```
51
+
52
+ - `--scan-mode deep` matters here: systematically walking ten categories is not a quick scan.
53
+ - Without a second account, A01 results are structurally incomplete — say so in the report rather than leaving it implied.
54
+ - Need an auditor-facing PDF? Run it through the managed platform and pull the technical report (**managed-pentesting-with-strix**).
55
+
56
+ ## Report honestly
57
+
58
+ From `strix_runs/<run>/`, group `vulnerabilities/*.md` by category and state, per category: what was attempted, what was proven, and what could not be assessed (A09 always; A03/A04/A06/A08/A10 partially). Label the report with the edition used. Verify each PoC yourself before it goes in front of the user.
59
+
60
+ A `0` exit code means nothing exploitable was proven **in what was analyzed** — check `run.json` status and cost against `--max-budget`; a budget-capped run is not a completed assessment.
61
+
62
+ ## Then fix and re-test
63
+
64
+ Remediate with **fix-security-vulnerabilities-with-strix** and re-run to prove each exploit is closed. For ongoing coverage as the app changes, gate pull requests using **ci-security-scanning-with-strix**.
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: web-app-penetration-testing
3
+ description: Pentest a web app or website end to end — black-box testing of a live URL, staging environment, or local dev server that finds and exploits real vulnerabilities (auth bypass, broken access control, IDOR, injection, XSS, SSRF, business logic) and proves each one with a working proof-of-concept instead of a signature match. Runs with Strix, either the self-hosted open-source CLI or the managed app.strix.ai cloud. Use when the user asks to pentest, hack, security-test, or audit their web app, website, web application, or staging site.
4
+ license: Apache-2.0
5
+ metadata:
6
+ author: usestrix
7
+ homepage: https://docs.strix.ai
8
+ ---
9
+
10
+ # Pentest a web application
11
+
12
+ Black-box (and optionally source-assisted) penetration testing of a running web app with Strix's autonomous agents. Every reported finding is validated with a working exploit, so there are no signature-based false positives to triage.
13
+
14
+ Install, LLM setup, all CLI flags, and the managed-cloud alternative are covered in the **penetration-testing-with-strix** skill — read it if the target is not a running web app, or if `strix --version` fails. This skill is the web-app-specific workflow.
15
+
16
+ ## 1. Confirm authorization and scope
17
+
18
+ Before running anything, establish:
19
+
20
+ - **The target is the user's** (or they are explicitly authorized to test it). Never pentest a third-party site on a hunch.
21
+ - **Which environment.** Prefer staging over production; agents send real exploit payloads and will create/modify data.
22
+ - **Out-of-scope paths** — payment flows, mass-email endpoints, admin destructive actions, third-party SSO providers.
23
+ - **Credentials.** Most real vulnerabilities live behind login. Without a test account, the agents only ever see the marketing surface.
24
+
25
+ Ask for anything missing rather than guessing.
26
+
27
+ ## 2. Run the scan
28
+
29
+ ```bash
30
+ strix -n -t https://staging.example.com --max-budget 20 \
31
+ --instruction "Test account: qa@example.com / <password>. In scope: /app/*, /api/*. Do not touch /billing or send email. Focus on access control between the two seeded orgs."
32
+ ```
33
+
34
+ Notes that matter for web apps specifically:
35
+
36
+ - **Give it credentials via `--instruction`** (or `--instruction-file` for anything long), including how to log in if the flow is unusual (magic link, SSO, MFA-exempt test user).
37
+ - **Two accounts beat one.** Multi-tenant IDOR and broken-access-control bugs — consistently the highest-impact class in web apps — can only be proven when the agent can attempt cross-account access.
38
+ - **Add the repo for white-box depth** when you have the source: `-t https://github.com/org/app -t https://staging.example.com` (or a local path). Source access materially improves coverage of business-logic and authorization flaws.
39
+ - **Localhost works.** Point at `http://host.docker.internal:3000` (Docker Desktop) so the sandbox can reach a dev server on the host.
40
+ - `--scan-mode quick` for a fast dev-loop pass, `standard` (~30 min) for a normal review, `deep` for pre-release assurance. Always set `--max-budget`.
41
+
42
+ For a hosted run with no Docker/LLM key, or when the user wants a shareable dashboard and an auditor-ready PDF, use the cloud path in **managed-pentesting-with-strix** instead — same engine, same findings.
43
+
44
+ ## 3. Review results
45
+
46
+ Read `strix_runs/<run>/penetration_test_report.md` first, then per-finding files in `vulnerabilities/`. Each contains the PoC — re-run it yourself to confirm before reporting to the user.
47
+
48
+ Exit codes: `0` no validated vulns in what was analyzed, `2` vulnerabilities found, `1` fatal error. A `0` is not proof of full coverage — if the budget or turn cap was hit the scan wraps up early, so check `run.json` status and cost against `--max-budget` before calling the app clean.
49
+
50
+ ## 4. Fix and verify
51
+
52
+ Hand findings to the **fix-security-vulnerabilities-with-strix** skill: patch the root cause, then re-run Strix against the same target to prove the exploit no longer works. Re-testing is the only reliable confirmation a fix landed.
53
+
54
+ To keep the app tested on every change rather than once, wire Strix into CI with **ci-security-scanning-with-strix**.