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.
- numasec/__init__.py +10 -0
- numasec/__main__.py +125 -0
- numasec/agent.py +741 -0
- numasec/chains.py +162 -0
- numasec/cli.py +921 -0
- numasec/config.py +208 -0
- numasec/context.py +261 -0
- numasec/cost_tracker.py +148 -0
- numasec/demo.py +422 -0
- numasec/error_recovery.py +443 -0
- numasec/extractors.py +534 -0
- numasec/few_shot_examples.py +505 -0
- numasec/knowledge/__init__.py +1 -0
- numasec/knowledge/advanced_privesc.md +257 -0
- numasec/knowledge/attack_chains/lfi_to_rce.md +129 -0
- numasec/knowledge/attack_chains/sqli_to_rce.md +134 -0
- numasec/knowledge/attack_chains/ssti_to_rce.md +164 -0
- numasec/knowledge/attack_chains/upload_to_rce.md +212 -0
- numasec/knowledge/attack_decision_matrix.md +108 -0
- numasec/knowledge/binary/heap_exploitation.md +212 -0
- numasec/knowledge/binary/resources.md +83 -0
- numasec/knowledge/binary/rop_advanced.md +209 -0
- numasec/knowledge/blind_injection_techniques.md +230 -0
- numasec/knowledge/blockchain_cheatsheet.md +127 -0
- numasec/knowledge/cloud/cloud_exploitation.md +231 -0
- numasec/knowledge/crypto_cheatsheet.md +232 -0
- numasec/knowledge/enterprise/README.md +124 -0
- numasec/knowledge/enterprise/api_security.md +432 -0
- numasec/knowledge/enterprise/cloud_security.md +449 -0
- numasec/knowledge/enterprise/compliance_frameworks.md +332 -0
- numasec/knowledge/enterprise/owasp_top_10.md +295 -0
- numasec/knowledge/legacy/README.md +13 -0
- numasec/knowledge/linux_cheatsheet.md +301 -0
- numasec/knowledge/osint_cheatsheet.md +164 -0
- numasec/knowledge/payloads/TEMPLATE.md +48 -0
- numasec/knowledge/payloads/command_injection.md +130 -0
- numasec/knowledge/payloads/php_rce.md +165 -0
- numasec/knowledge/payloads/python_sandbox.md +168 -0
- numasec/knowledge/pwn_reverse_cheatsheet.md +222 -0
- numasec/knowledge/quick_wins.md +148 -0
- numasec/knowledge/ssti_advanced_bypasses.md +133 -0
- numasec/knowledge/volatility_cheatsheet.md +122 -0
- numasec/knowledge/web/payloads_deserialization.md +209 -0
- numasec/knowledge/web/payloads_file_upload.md +387 -0
- numasec/knowledge/web/payloads_graphql.md +401 -0
- numasec/knowledge/web/payloads_http_smuggling.md +207 -0
- numasec/knowledge/web/payloads_jwt.md +541 -0
- numasec/knowledge/web/payloads_ldap.md +143 -0
- numasec/knowledge/web/payloads_nosql.md +247 -0
- numasec/knowledge/web/payloads_prototype_pollution.md +209 -0
- numasec/knowledge/web/payloads_race_condition.md +165 -0
- numasec/knowledge/web/payloads_ssrf.md +189 -0
- numasec/knowledge/web/payloads_websocket.md +230 -0
- numasec/knowledge/web/payloads_xpath.md +140 -0
- numasec/knowledge/web/payloads_xxe.md +201 -0
- numasec/knowledge/web/race_conditions.md +160 -0
- numasec/knowledge/web_cheatsheet.md +366 -0
- numasec/knowledge/windows/active_directory.md +158 -0
- numasec/knowledge/windows/windows_cheatsheet.md +289 -0
- numasec/knowledge_loader.py +391 -0
- numasec/logging_config.py +115 -0
- numasec/planner.py +304 -0
- numasec/plugins.py +553 -0
- numasec/prompts/system.md +173 -0
- numasec/reflection.py +179 -0
- numasec/renderer.py +1435 -0
- numasec/report.py +1047 -0
- numasec/router.py +641 -0
- numasec/session.py +284 -0
- numasec/state.py +95 -0
- numasec/target_profile.py +354 -0
- numasec/theme.py +120 -0
- numasec/tools/__init__.py +618 -0
- numasec/tools/browser.py +1511 -0
- numasec/tools/browser_fallback.py +239 -0
- numasec/tools/exploit.py +354 -0
- numasec/tools/recon.py +616 -0
- numasec-3.0.0.dist-info/METADATA +306 -0
- numasec-3.0.0.dist-info/RECORD +82 -0
- numasec-3.0.0.dist-info/WHEEL +4 -0
- numasec-3.0.0.dist-info/entry_points.txt +2 -0
- 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()
|