numasec 3.0.0__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.
Files changed (82) hide show
  1. numasec/__init__.py +10 -0
  2. numasec/__main__.py +125 -0
  3. numasec/agent.py +741 -0
  4. numasec/chains.py +162 -0
  5. numasec/cli.py +921 -0
  6. numasec/config.py +208 -0
  7. numasec/context.py +261 -0
  8. numasec/cost_tracker.py +148 -0
  9. numasec/demo.py +422 -0
  10. numasec/error_recovery.py +443 -0
  11. numasec/extractors.py +534 -0
  12. numasec/few_shot_examples.py +505 -0
  13. numasec/knowledge/__init__.py +1 -0
  14. numasec/knowledge/advanced_privesc.md +257 -0
  15. numasec/knowledge/attack_chains/lfi_to_rce.md +129 -0
  16. numasec/knowledge/attack_chains/sqli_to_rce.md +134 -0
  17. numasec/knowledge/attack_chains/ssti_to_rce.md +164 -0
  18. numasec/knowledge/attack_chains/upload_to_rce.md +212 -0
  19. numasec/knowledge/attack_decision_matrix.md +108 -0
  20. numasec/knowledge/binary/heap_exploitation.md +212 -0
  21. numasec/knowledge/binary/resources.md +83 -0
  22. numasec/knowledge/binary/rop_advanced.md +209 -0
  23. numasec/knowledge/blind_injection_techniques.md +230 -0
  24. numasec/knowledge/blockchain_cheatsheet.md +127 -0
  25. numasec/knowledge/cloud/cloud_exploitation.md +231 -0
  26. numasec/knowledge/crypto_cheatsheet.md +232 -0
  27. numasec/knowledge/enterprise/README.md +124 -0
  28. numasec/knowledge/enterprise/api_security.md +432 -0
  29. numasec/knowledge/enterprise/cloud_security.md +449 -0
  30. numasec/knowledge/enterprise/compliance_frameworks.md +332 -0
  31. numasec/knowledge/enterprise/owasp_top_10.md +295 -0
  32. numasec/knowledge/legacy/README.md +13 -0
  33. numasec/knowledge/linux_cheatsheet.md +301 -0
  34. numasec/knowledge/osint_cheatsheet.md +164 -0
  35. numasec/knowledge/payloads/TEMPLATE.md +48 -0
  36. numasec/knowledge/payloads/command_injection.md +130 -0
  37. numasec/knowledge/payloads/php_rce.md +165 -0
  38. numasec/knowledge/payloads/python_sandbox.md +168 -0
  39. numasec/knowledge/pwn_reverse_cheatsheet.md +222 -0
  40. numasec/knowledge/quick_wins.md +148 -0
  41. numasec/knowledge/ssti_advanced_bypasses.md +133 -0
  42. numasec/knowledge/volatility_cheatsheet.md +122 -0
  43. numasec/knowledge/web/payloads_deserialization.md +209 -0
  44. numasec/knowledge/web/payloads_file_upload.md +387 -0
  45. numasec/knowledge/web/payloads_graphql.md +401 -0
  46. numasec/knowledge/web/payloads_http_smuggling.md +207 -0
  47. numasec/knowledge/web/payloads_jwt.md +541 -0
  48. numasec/knowledge/web/payloads_ldap.md +143 -0
  49. numasec/knowledge/web/payloads_nosql.md +247 -0
  50. numasec/knowledge/web/payloads_prototype_pollution.md +209 -0
  51. numasec/knowledge/web/payloads_race_condition.md +165 -0
  52. numasec/knowledge/web/payloads_ssrf.md +189 -0
  53. numasec/knowledge/web/payloads_websocket.md +230 -0
  54. numasec/knowledge/web/payloads_xpath.md +140 -0
  55. numasec/knowledge/web/payloads_xxe.md +201 -0
  56. numasec/knowledge/web/race_conditions.md +160 -0
  57. numasec/knowledge/web_cheatsheet.md +366 -0
  58. numasec/knowledge/windows/active_directory.md +158 -0
  59. numasec/knowledge/windows/windows_cheatsheet.md +289 -0
  60. numasec/knowledge_loader.py +391 -0
  61. numasec/logging_config.py +115 -0
  62. numasec/planner.py +304 -0
  63. numasec/plugins.py +553 -0
  64. numasec/prompts/system.md +173 -0
  65. numasec/reflection.py +179 -0
  66. numasec/renderer.py +1435 -0
  67. numasec/report.py +1047 -0
  68. numasec/router.py +641 -0
  69. numasec/session.py +284 -0
  70. numasec/state.py +95 -0
  71. numasec/target_profile.py +354 -0
  72. numasec/theme.py +120 -0
  73. numasec/tools/__init__.py +618 -0
  74. numasec/tools/browser.py +1511 -0
  75. numasec/tools/browser_fallback.py +239 -0
  76. numasec/tools/exploit.py +354 -0
  77. numasec/tools/recon.py +616 -0
  78. numasec-3.0.0.dist-info/METADATA +306 -0
  79. numasec-3.0.0.dist-info/RECORD +82 -0
  80. numasec-3.0.0.dist-info/WHEEL +4 -0
  81. numasec-3.0.0.dist-info/entry_points.txt +2 -0
  82. numasec-3.0.0.dist-info/licenses/LICENSE +46 -0
numasec/__init__.py ADDED
@@ -0,0 +1,10 @@
1
+ """NumaSec — AI security testing for your apps."""
2
+
3
+ __version__ = "3.0.0"
4
+ __author__ = "Francesco Stabile"
5
+ __description__ = "AI security testing for apps. Paste a URL, get a security report."
6
+
7
+ # Export key components
8
+ from numasec.config import load_config, ensure_config, Config
9
+
10
+ __all__ = ["load_config", "ensure_config", "Config"]
numasec/__main__.py ADDED
@@ -0,0 +1,125 @@
1
+ """
2
+ NumaSec — Entry Point
3
+
4
+ Usage:
5
+ numasec # Interactive mode
6
+ numasec check <url> # Quick security check (non-interactive)
7
+ numasec --demo # Demo mode (no API key needed)
8
+ numasec --resume <session> # Resume previous session
9
+ numasec --verbose # Debug logging
10
+ """
11
+
12
+ import argparse
13
+ import asyncio
14
+ import sys
15
+
16
+ from numasec import __version__
17
+
18
+
19
+ def _suppress_shutdown_noise(loop: asyncio.AbstractEventLoop):
20
+ """Suppress 'Future exception was never retrieved' from Playwright during shutdown."""
21
+ original_handler = loop.get_exception_handler()
22
+
23
+ def handler(loop, context):
24
+ msg = context.get("message", "")
25
+ exc = context.get("exception")
26
+ # Suppress Playwright driver disconnection noise on shutdown
27
+ if exc and "Connection closed while reading from the driver" in str(exc):
28
+ return
29
+ if "Future exception was never retrieved" in msg:
30
+ if exc and "driver" in str(exc).lower():
31
+ return
32
+ # Everything else: use original handler or default
33
+ if original_handler:
34
+ original_handler(loop, context)
35
+ else:
36
+ loop.default_exception_handler(context)
37
+
38
+ loop.set_exception_handler(handler)
39
+
40
+
41
+ async def async_main():
42
+ """Async main entry point."""
43
+ # Suppress Playwright shutdown noise early
44
+ _suppress_shutdown_noise(asyncio.get_running_loop())
45
+
46
+ parser = argparse.ArgumentParser(
47
+ description="NumaSec — AI Security Testing for Your Apps",
48
+ epilog="Examples:\n"
49
+ " numasec Interactive mode\n"
50
+ " numasec check http://localhost:3000 Quick security check\n"
51
+ " numasec --demo See NumaSec in action (no API key)\n",
52
+ formatter_class=argparse.RawDescriptionHelpFormatter,
53
+ )
54
+ parser.add_argument("--version", action="version", version=f"numasec {__version__}")
55
+ parser.add_argument("--resume", metavar="SESSION_ID", help="Resume a previous session")
56
+ parser.add_argument("--budget", type=float, default=10.0, help="Cost budget limit (default: $10)")
57
+ parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose logging")
58
+ parser.add_argument("--show-browser", action="store_true", help="Show browser in real-time")
59
+ parser.add_argument("--demo", action="store_true", help="See NumaSec in action (no API key needed)")
60
+
61
+ # Subcommand: check <url>
62
+ subparsers = parser.add_subparsers(dest="command")
63
+ check_parser = subparsers.add_parser("check", help="Quick security check (non-interactive)")
64
+ check_parser.add_argument("url", help="URL to check (e.g. http://localhost:3000)")
65
+ check_parser.add_argument("--budget", type=float, default=5.0, help="Cost budget limit")
66
+ check_parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose logging")
67
+ check_parser.add_argument("--show-browser", action="store_true", help="Show browser in real-time")
68
+
69
+ args = parser.parse_args()
70
+
71
+ # Demo mode — standalone replay, no config needed
72
+ if args.demo:
73
+ from numasec.demo import run_demo
74
+ await run_demo()
75
+ return
76
+
77
+ # Non-interactive check mode
78
+ if args.command == "check":
79
+ from numasec.logging_config import setup_logging
80
+ logger = setup_logging(verbose=args.verbose)
81
+ logger.info("NumaSec check mode", extra={"url": args.url})
82
+
83
+ from numasec.cli import NumaSecCLI
84
+ cli = NumaSecCLI(show_browser=args.show_browser)
85
+ cli.cost_tracker.budget_limit = args.budget
86
+ await cli.run_check(args.url)
87
+ return
88
+
89
+ # Interactive mode
90
+ from numasec.logging_config import setup_logging
91
+ logger = setup_logging(verbose=args.verbose)
92
+ logger.info("NumaSec starting", extra={"cli_args": vars(args)})
93
+
94
+ try:
95
+ from numasec.cli import NumaSecCLI
96
+
97
+ cli = NumaSecCLI(resume_session_id=args.resume, show_browser=args.show_browser)
98
+ if args.budget:
99
+ cli.cost_tracker.budget_limit = args.budget
100
+
101
+ await cli.run()
102
+
103
+ except KeyboardInterrupt:
104
+ logger.info("User interrupted with Ctrl-C")
105
+ print("\nBye! Stay safe.")
106
+ sys.exit(0)
107
+ except Exception as e:
108
+ logger.error(f"Fatal error: {e}", exc_info=True)
109
+ print(f"\n[!] Fatal error: {e}")
110
+ import traceback
111
+ traceback.print_exc()
112
+ sys.exit(1)
113
+
114
+
115
+ def main():
116
+ """Sync entry point for console_scripts (pyproject.toml)."""
117
+ try:
118
+ asyncio.run(async_main())
119
+ except KeyboardInterrupt:
120
+ print("\n\nInterrupted. Goodbye!")
121
+ sys.exit(0)
122
+
123
+
124
+ if __name__ == "__main__":
125
+ main()