tupaxpl 1.3.0__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.
- tupaxpl-1.3.0/LICENSE +123 -0
- tupaxpl-1.3.0/PKG-INFO +34 -0
- tupaxpl-1.3.0/README.md +129 -0
- tupaxpl-1.3.0/offsecforge/__init__.py +5 -0
- tupaxpl-1.3.0/offsecforge/acquisition/__init__.py +58 -0
- tupaxpl-1.3.0/offsecforge/acquisition/exploit_db.py +89 -0
- tupaxpl-1.3.0/offsecforge/acquisition/exploit_downloader.py +101 -0
- tupaxpl-1.3.0/offsecforge/acquisition/github_poc_finder.py +79 -0
- tupaxpl-1.3.0/offsecforge/acquisition/nvd_client.py +116 -0
- tupaxpl-1.3.0/offsecforge/adapters/__init__.py +7 -0
- tupaxpl-1.3.0/offsecforge/adapters/claude_skill_runner.py +157 -0
- tupaxpl-1.3.0/offsecforge/adapters/mikrotik_adapter.py +198 -0
- tupaxpl-1.3.0/offsecforge/adapters/printer_adapter.py +192 -0
- tupaxpl-1.3.0/offsecforge/adapters/quarry_engine.py +376 -0
- tupaxpl-1.3.0/offsecforge/adapters/stix_export.py +175 -0
- tupaxpl-1.3.0/offsecforge/adapters/suricata_ingest.py +195 -0
- tupaxpl-1.3.0/offsecforge/adapters/taxii_ingest.py +198 -0
- tupaxpl-1.3.0/offsecforge/agent/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/agent/ooda_loop.py +199 -0
- tupaxpl-1.3.0/offsecforge/ai/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/ai/code_gen.py +147 -0
- tupaxpl-1.3.0/offsecforge/ai/llm_core.py +292 -0
- tupaxpl-1.3.0/offsecforge/ai/prompt_library.py +158 -0
- tupaxpl-1.3.0/offsecforge/builders/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/builders/exploit_builder.py +31 -0
- tupaxpl-1.3.0/offsecforge/builders/mitre_mapper.py +70 -0
- tupaxpl-1.3.0/offsecforge/builders/payload_builder.py +39 -0
- tupaxpl-1.3.0/offsecforge/builders/report_builder.py +154 -0
- tupaxpl-1.3.0/offsecforge/campaign/__init__.py +14 -0
- tupaxpl-1.3.0/offsecforge/campaign/ares_bridge.py +9 -0
- tupaxpl-1.3.0/offsecforge/campaign/engagement.py +11 -0
- tupaxpl-1.3.0/offsecforge/cloud/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/cloud/stratus_bridge.py +124 -0
- tupaxpl-1.3.0/offsecforge/compilation/__init__.py +7 -0
- tupaxpl-1.3.0/offsecforge/compilation/exploit_compiler.py +124 -0
- tupaxpl-1.3.0/offsecforge/frameworks/__init__.py +190 -0
- tupaxpl-1.3.0/offsecforge/intel/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/__init__.py +30 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/catalog.py +631 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/citrix_netscaler_cve_2026_series.json +59 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/cve_2026_92392_curl_http2.json +34 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/cve_2026_99999_pwnescape.json +78 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/data/cve_catalog_stats.json +12 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/ivanti_connect_secure_cve_2026_104935.json +39 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/linux_kernel_xfs_cve_2026_64600.json +107 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/linux_nftables_cve_2023_2024_series.json +69 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/mikrotik_routeros_cve_2026.json +57 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_db/pfsense_abraxas_series_2026.json +84 -0
- tupaxpl-1.3.0/offsecforge/intel/cve_feed.py +43 -0
- tupaxpl-1.3.0/offsecforge/intel/embedxpl_bridge.py +223 -0
- tupaxpl-1.3.0/offsecforge/intel/flowsint_bridge.py +255 -0
- tupaxpl-1.3.0/offsecforge/intel/identity_osint.py +347 -0
- tupaxpl-1.3.0/offsecforge/intel/lisa_bridge.py +246 -0
- tupaxpl-1.3.0/offsecforge/intel/osint_advanced.py +348 -0
- tupaxpl-1.3.0/offsecforge/intel/pe_bridge.py +172 -0
- tupaxpl-1.3.0/offsecforge/intel/pugdns_native.py +233 -0
- tupaxpl-1.3.0/offsecforge/intel/recon_chain.py +536 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/__init__.py +0 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/conftest.py +44 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/logger.py +62 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/stix_create.py +47 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/stix_create_v2.py +279 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/stix_item.py +46 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/stixv1.py +259 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/test_stix_create.py +172 -0
- tupaxpl-1.3.0/offsecforge/intel/stix/test_stix_create_v2.py +343 -0
- tupaxpl-1.3.0/offsecforge/intel/taxii/__init__.py +0 -0
- tupaxpl-1.3.0/offsecforge/intel/taxii/auth_service.py +82 -0
- tupaxpl-1.3.0/offsecforge/intel/taxii/base.py +47 -0
- tupaxpl-1.3.0/offsecforge/intel/taxii/conf.py +177 -0
- tupaxpl-1.3.0/offsecforge/intel/taxii/mongodb_auth.py +56 -0
- tupaxpl-1.3.0/offsecforge/intel/tool_registry.py +233 -0
- tupaxpl-1.3.0/offsecforge/intel/upx_recovery_bridge.py +167 -0
- tupaxpl-1.3.0/offsecforge/intel/vulnhub/__init__.py +27 -0
- tupaxpl-1.3.0/offsecforge/intel/vulnhub/catalog.py +601 -0
- tupaxpl-1.3.0/offsecforge/intel/vulnhub/data/vulnhub_catalog.json +15491 -0
- tupaxpl-1.3.0/offsecforge/intel/xpl_forge_bridges.py +147 -0
- tupaxpl-1.3.0/offsecforge/intelligence/blitzstrike_engine.py +315 -0
- tupaxpl-1.3.0/offsecforge/intelligence/cve_feed_monitor.py +172 -0
- tupaxpl-1.3.0/offsecforge/intelligence/geo_osint.py +157 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/c2/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/collection/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/credential_access/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/discovery/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/execution/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/exfiltration/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/initial_access/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/initial_access/web_exploits.py +182 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/lateral_movement/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/lateral_movement/pth_ptt.py +191 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/persistence/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/persistence/windows_persist.py +99 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/privilege_esc/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/privilege_esc/windows_privesc.py +166 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/recon/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/recon/passive_recon.py +200 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/templates/malware_research/apt28_fancy_bear.yaml +77 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/templates/malware_research/lazarus_fastcash.yaml +86 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/templates/malware_research/solarwinds_supply_chain.yaml +98 -0
- tupaxpl-1.3.0/offsecforge/kill_chain/templates/malware_research/triton_ics.yaml +91 -0
- tupaxpl-1.3.0/offsecforge/lab/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/__init__.py +6 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/dlink-hnap-mock/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/dlink-hnap-mock/app.py +100 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/printer-hp-mock/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/printer-hp-mock/app.py +171 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/rtsp-simple/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/rtsp-simple/app.py +44 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/smarttv-bravia-mock/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/smarttv-bravia-mock/app.py +321 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/uniview-mock/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/lab/iot_vuln_lab/targets/uniview-mock/app.py +93 -0
- tupaxpl-1.3.0/offsecforge/mobile/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/ad/domain_root_permissions.py +240 -0
- tupaxpl-1.3.0/offsecforge/modules/ad_autopwn.py +672 -0
- tupaxpl-1.3.0/offsecforge/modules/ad_autopwn_bridge.py +10 -0
- tupaxpl-1.3.0/offsecforge/modules/ad_forensics.py +203 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/__init__.py +7 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/covert_channels.py +1923 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/crypto.py +778 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/exploit_bridge.py +997 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/implant.py +1479 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/persistence.py +1229 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/persistence_windows.py +1581 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/server.py +1432 -0
- tupaxpl-1.3.0/offsecforge/modules/c2/session_hooks.py +1535 -0
- tupaxpl-1.3.0/offsecforge/modules/campaign/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/campaign/forge_campaign.py +182 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/__init__.py +26 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/citrix/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/citrix/citrix_netscaler_citrixbleed2_cve_2025_5777.py +73 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/citrix/citrix_netscaler_saml_rce_cve_2026_8452.py +182 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/fortinet/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/fortinet/fortinet_saml_bypass_cve_2025_59718.py +68 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/ivanti/__init__.py +0 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/ivanti/ivanti_connect_secure_auth_bypass_cve_2026_104935.py +197 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/linux_kernel/__init__.py +0 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/linux_kernel/linux_refluxfs_lpe_cve_2026_64600.py +204 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/ubiquiti/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/cve/ubiquiti/ubiquiti_unifi_cve_2026_22557.py +82 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/byovd_driver_hunt.py +355 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/dom_xss_engine.py +74 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/jwt_algorithm_confusion_bypass.py +73 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/linux_kvm_arm64_escape_cve_2026_89775.py +288 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/linux_pwnescape_vm_escape_cve_2026_99999.py +714 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/postgresql_fuzzystrmatch_oob_cve_2026_15742.py +46 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/roundcube_sqli_preauth_cve_2026_48842.py +48 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/vcenter_srp_auth_bypass_cve_2026_59309.py +336 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/vcenter_syslog_traversal_cve_2026_59310.py +277 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/windows_dangling_com_lpe_cve_2026_66804.py +301 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/windows_wmi_lpe_cve_2026_42980.py +276 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-12227_poc.py +658 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-13355_poc.py +1198 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-14281_poc.py +637 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-19658_poc.py +862 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-6433_poc.py +237 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-8181_poc.py +703 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-89055_poc.py +588 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_murrez_batch/CVE-2026-92229_poc.py +828 -0
- tupaxpl-1.3.0/offsecforge/modules/exploit/wordpress_php_template_traversal_cve_2026_87902.py +46 -0
- tupaxpl-1.3.0/offsecforge/modules/hunt/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/hunt/forge_hunt.py +195 -0
- tupaxpl-1.3.0/offsecforge/modules/ics_ot/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/ics_ot/stuxnet/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/ics_ot/stuxnet/rootkit_analysis.py +168 -0
- tupaxpl-1.3.0/offsecforge/modules/intel/siem_attacks/grafana_exploit_suite.py +155 -0
- tupaxpl-1.3.0/offsecforge/modules/intel/siem_attacks/splunk_rce_suite.py +140 -0
- tupaxpl-1.3.0/offsecforge/modules/iot/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/iot/huawei/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/iot/mikrotik/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/iot/mikrotik/harden_chr.py +257 -0
- tupaxpl-1.3.0/offsecforge/modules/iot/mikrotik/run_security_suite.py +555 -0
- tupaxpl-1.3.0/offsecforge/modules/iot/mikrotik/setup_users_groups.py +163 -0
- tupaxpl-1.3.0/offsecforge/modules/mobile/__init__.py +0 -0
- tupaxpl-1.3.0/offsecforge/modules/mobile/android_contacts_sqli_cve_2026_28576.py +223 -0
- tupaxpl-1.3.0/offsecforge/modules/post_exploitation/silph_credential_dump.py +844 -0
- tupaxpl-1.3.0/offsecforge/modules/post_exploitation/vmkatz_credential_extract.py +273 -0
- tupaxpl-1.3.0/offsecforge/modules/re/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/bypass_patches.py +369 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/emudesk_patcher.py +169 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_arc_fix.py +153 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_bypass.py +282 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_clean_bypass.py +146 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_combined_final.py +155 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_corrected.py +169 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_final_bypass.py +144 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_ipc_logger.py +200 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_js_inject.py +220 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_quickattach.py +156 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_resp_override.py +164 -0
- tupaxpl-1.3.0/offsecforge/modules/re/frida/frida_spawn_bypass.py +228 -0
- tupaxpl-1.3.0/offsecforge/modules/re/pe_analysis/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/sessions/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/sessions/session_hub.py +157 -0
- tupaxpl-1.3.0/offsecforge/modules/sessions/sessions_cmd.py +107 -0
- tupaxpl-1.3.0/offsecforge/modules/vaultwarden_audit.py +258 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp/intercept_apis.py +253 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp/nextjs_api_scan.py +277 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp/smartfit_owasp_tests.py +1116 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp/test_exposed_apis.py +258 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp/validate_findings.py +95 -0
- tupaxpl-1.3.0/offsecforge/modules/webapp_audit.py +403 -0
- tupaxpl-1.3.0/offsecforge/modules/wireless/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/modules/wireless/validate_wxf_modules.py +75 -0
- tupaxpl-1.3.0/offsecforge/output/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/pentestgpt/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/pentestgpt/pentestgpt_engine.py +198 -0
- tupaxpl-1.3.0/offsecforge/py.typed +0 -0
- tupaxpl-1.3.0/offsecforge/recon/bounty_pipeline.py +214 -0
- tupaxpl-1.3.0/offsecforge/research/external_tools_registry.py +179 -0
- tupaxpl-1.3.0/offsecforge/research/poc_index_feed.py +124 -0
- tupaxpl-1.3.0/offsecforge/resources/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/resources/credentials/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/resources/wordlists/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/social_engineering/__init__.py +1 -0
- tupaxpl-1.3.0/offsecforge/social_engineering/phishing/__init__.py +5 -0
- tupaxpl-1.3.0/offsecforge/social_engineering/phishing/tengu_bridge.py +306 -0
- tupaxpl-1.3.0/offsecforge/social_engineering/voice/__init__.py +10 -0
- tupaxpl-1.3.0/offsecforge/social_engineering/voice/voicestudio_bridge.py +152 -0
- tupaxpl-1.3.0/offsecforge/social_engineering/voice/voxcpm_bridge.py +169 -0
- tupaxpl-1.3.0/offsecforge/testing/atomic_red_runner.py +115 -0
- tupaxpl-1.3.0/offsecforge/tools/entropia_compiler.py +257 -0
- tupaxpl-1.3.0/offsecforge/tools/evasion_test.py +104 -0
- tupaxpl-1.3.0/offsecforge/wordlists/wordlist_generator.py +254 -0
- tupaxpl-1.3.0/pentest_engine/__init__.py +6 -0
- tupaxpl-1.3.0/pentest_engine/__main__.py +633 -0
- tupaxpl-1.3.0/pentest_engine/api/__init__.py +7 -0
- tupaxpl-1.3.0/pentest_engine/api/app.py +362 -0
- tupaxpl-1.3.0/pentest_engine/api/auth.py +52 -0
- tupaxpl-1.3.0/pentest_engine/api/chat_service.py +153 -0
- tupaxpl-1.3.0/pentest_engine/api/limits.py +42 -0
- tupaxpl-1.3.0/pentest_engine/api/runs.py +38 -0
- tupaxpl-1.3.0/pentest_engine/api/schemas.py +131 -0
- tupaxpl-1.3.0/pentest_engine/api_smoke.py +216 -0
- tupaxpl-1.3.0/pentest_engine/audit.py +53 -0
- tupaxpl-1.3.0/pentest_engine/campaign/__init__.py +90 -0
- tupaxpl-1.3.0/pentest_engine/campaign/ares_bridge.py +15 -0
- tupaxpl-1.3.0/pentest_engine/campaign/engagement.py +267 -0
- tupaxpl-1.3.0/pentest_engine/capabilities.py +48 -0
- tupaxpl-1.3.0/pentest_engine/config.py +186 -0
- tupaxpl-1.3.0/pentest_engine/core/__init__.py +1 -0
- tupaxpl-1.3.0/pentest_engine/core/bitnet_backend.py +417 -0
- tupaxpl-1.3.0/pentest_engine/core/extraction.py +100 -0
- tupaxpl-1.3.0/pentest_engine/core/llm_config.py +239 -0
- tupaxpl-1.3.0/pentest_engine/core/ollama_client.py +496 -0
- tupaxpl-1.3.0/pentest_engine/core/scoring.py +53 -0
- tupaxpl-1.3.0/pentest_engine/errors.py +38 -0
- tupaxpl-1.3.0/pentest_engine/graph/__init__.py +16 -0
- tupaxpl-1.3.0/pentest_engine/graph/adapters.py +142 -0
- tupaxpl-1.3.0/pentest_engine/graph/builder.py +79 -0
- tupaxpl-1.3.0/pentest_engine/graph/nodes.py +618 -0
- tupaxpl-1.3.0/pentest_engine/graph/roles.py +168 -0
- tupaxpl-1.3.0/pentest_engine/graph/runner.py +105 -0
- tupaxpl-1.3.0/pentest_engine/graph/scenarios.py +84 -0
- tupaxpl-1.3.0/pentest_engine/graph/state.py +193 -0
- tupaxpl-1.3.0/pentest_engine/interface/__init__.py +1 -0
- tupaxpl-1.3.0/pentest_engine/interface/terminal.py +258 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/__init__.py +7 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/attack.py +80 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/bm25.py +120 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/chroma_store.py +190 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/documents.py +79 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/embeddings.py +82 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/index_builder.py +72 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/__init__.py +7 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/atomic.py +150 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/base.py +89 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/bug_hunt.py +111 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/evtx_meta.py +104 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/harpia.py +198 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/kev.py +87 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/legacy_ast.py +135 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/mitre.py +86 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/nuclei.py +151 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/nvd.py +38 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/red_team_battery.py +131 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/registry.py +125 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/ingest/sigma.py +139 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/malware_research_ingest.py +149 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/models.py +113 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/retrieval.py +277 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/stix_ingest.py +316 -0
- tupaxpl-1.3.0/pentest_engine/knowledge/store.py +115 -0
- tupaxpl-1.3.0/pentest_engine/models.py +148 -0
- tupaxpl-1.3.0/pentest_engine/policy.py +118 -0
- tupaxpl-1.3.0/pentest_engine/py.typed +0 -0
- tupaxpl-1.3.0/pentest_engine/rag_smoke.py +139 -0
- tupaxpl-1.3.0/pentest_engine/re_smoke.py +313 -0
- tupaxpl-1.3.0/pentest_engine/retrieval_smoke.py +132 -0
- tupaxpl-1.3.0/pentest_engine/security.py +54 -0
- tupaxpl-1.3.0/pentest_engine/session.py +239 -0
- tupaxpl-1.3.0/pentest_engine/smoke.py +243 -0
- tupaxpl-1.3.0/pentest_engine/tools/__init__.py +1 -0
- tupaxpl-1.3.0/pentest_engine/tools/artifact_paths.py +63 -0
- tupaxpl-1.3.0/pentest_engine/tools/atomic_dryrun.py +221 -0
- tupaxpl-1.3.0/pentest_engine/tools/atomic_runner.py +106 -0
- tupaxpl-1.3.0/pentest_engine/tools/binwalk_helper.py +162 -0
- tupaxpl-1.3.0/pentest_engine/tools/caldera_client.py +47 -0
- tupaxpl-1.3.0/pentest_engine/tools/compiler.py +109 -0
- tupaxpl-1.3.0/pentest_engine/tools/evtx_analyzer.py +188 -0
- tupaxpl-1.3.0/pentest_engine/tools/gateway.py +240 -0
- tupaxpl-1.3.0/pentest_engine/tools/ghidra_helper.py +176 -0
- tupaxpl-1.3.0/pentest_engine/tools/legacy_adapter.py +60 -0
- tupaxpl-1.3.0/pentest_engine/tools/nuclei_runner.py +179 -0
- tupaxpl-1.3.0/pentest_engine/tools/radare2_helper.py +113 -0
- tupaxpl-1.3.0/pentest_engine/tools/raidstorm_client.py +141 -0
- tupaxpl-1.3.0/pentest_engine/tools/sandbox.py +317 -0
- tupaxpl-1.3.0/pentest_engine/tools/sigma_catalog.py +176 -0
- tupaxpl-1.3.0/pentest_engine/tools/strings_helper.py +86 -0
- tupaxpl-1.3.0/pentest_engine/tools/subprocess_safe.py +157 -0
- tupaxpl-1.3.0/pentest_engine/tools/xplforge_bridge.py +116 -0
- tupaxpl-1.3.0/pentest_engine/tools_smoke.py +212 -0
- tupaxpl-1.3.0/pentest_engine/training/__init__.py +22 -0
- tupaxpl-1.3.0/pentest_engine/training/baseline.py +198 -0
- tupaxpl-1.3.0/pentest_engine/training/dataset_builder.py +450 -0
- tupaxpl-1.3.0/pentest_engine/training/ollama_import.py +86 -0
- tupaxpl-1.3.0/pentest_engine/training/peft_runner.py +311 -0
- tupaxpl-1.3.0/pentest_engine/training/release_gate.py +56 -0
- tupaxpl-1.3.0/pentest_engine/training/resource_gate.py +191 -0
- tupaxpl-1.3.0/pentest_engine/training/schema.py +192 -0
- tupaxpl-1.3.0/pentest_engine/training/train_job.py +102 -0
- tupaxpl-1.3.0/pentest_engine/training_smoke.py +177 -0
- tupaxpl-1.3.0/pyproject.toml +173 -0
- tupaxpl-1.3.0/setup.cfg +4 -0
- tupaxpl-1.3.0/tests/test_basic.py +36 -0
- tupaxpl-1.3.0/tests/test_config.py +84 -0
- tupaxpl-1.3.0/tests/test_coverage_gate2.py +163 -0
- tupaxpl-1.3.0/tests/test_entrypoints.py +39 -0
- tupaxpl-1.3.0/tests/test_errors.py +64 -0
- tupaxpl-1.3.0/tests/test_integration.py +95 -0
- tupaxpl-1.3.0/tests/test_manifest.py +29 -0
- tupaxpl-1.3.0/tests/test_models.py +102 -0
- tupaxpl-1.3.0/tests/test_policy.py +100 -0
- tupaxpl-1.3.0/tests/test_reporting.py +116 -0
- tupaxpl-1.3.0/tests/test_session_hub.py +141 -0
- tupaxpl-1.3.0/tests/test_structure.py +34 -0
- tupaxpl-1.3.0/tests/test_version.py +28 -0
- tupaxpl-1.3.0/tools/__init__.py +1 -0
- tupaxpl-1.3.0/tools/contract_mapper.py +163 -0
- tupaxpl-1.3.0/tools/exploitgym_benchmark.py +149 -0
- tupaxpl-1.3.0/tools/llm_benchmark.py +168 -0
- tupaxpl-1.3.0/tupaxpl/__init__.py +3 -0
- tupaxpl-1.3.0/tupaxpl/__main__.py +4 -0
- tupaxpl-1.3.0/tupaxpl/py.typed +0 -0
- tupaxpl-1.3.0/tupaxpl/reporting/__init__.py +16 -0
- tupaxpl-1.3.0/tupaxpl/reporting/generator.py +182 -0
- tupaxpl-1.3.0/tupaxpl/run.py +70 -0
- tupaxpl-1.3.0/tupaxpl/session_hub.py +212 -0
- tupaxpl-1.3.0/tupaxpl.egg-info/PKG-INFO +34 -0
- tupaxpl-1.3.0/tupaxpl.egg-info/SOURCES.txt +356 -0
- tupaxpl-1.3.0/tupaxpl.egg-info/dependency_links.txt +1 -0
- tupaxpl-1.3.0/tupaxpl.egg-info/entry_points.txt +3 -0
- tupaxpl-1.3.0/tupaxpl.egg-info/requires.txt +13 -0
- tupaxpl-1.3.0/tupaxpl.egg-info/top_level.txt +4 -0
tupaxpl-1.3.0/LICENSE
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# XPL-Suite Security Research License (XSRL) v1.0
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026 Andre Henrike de Oliveira (@mrhenrike) / Uniao Geek
|
|
4
|
+
All rights reserved.
|
|
5
|
+
|
|
6
|
+
## 1. Definitions
|
|
7
|
+
|
|
8
|
+
- "Software" means the source code, documentation, binaries, scripts, configuration
|
|
9
|
+
files, and any other materials included in this repository.
|
|
10
|
+
- "Author" means the original copyright holder: Andre Henrike de Oliveira (@mrhenrike).
|
|
11
|
+
- "Original Repository" means the source repository hosted at
|
|
12
|
+
https://github.com/mrhenrike/TupaXPL-Forge from which the Software originates.
|
|
13
|
+
- "Upstream Credits" means the authors and licenses of third-party components,
|
|
14
|
+
libraries, or code referenced in the Software, as documented in source file headers,
|
|
15
|
+
CREDITS files, or README attribution sections.
|
|
16
|
+
- "Authorized Security Testing" means penetration testing, vulnerability assessment,
|
|
17
|
+
red team exercises, purple team exercises, security auditing, or similar activities
|
|
18
|
+
conducted with explicit written permission from the owner of the target system(s).
|
|
19
|
+
|
|
20
|
+
## 2. Grant of Rights
|
|
21
|
+
|
|
22
|
+
Subject to the terms and conditions of this License, the Author grants you a
|
|
23
|
+
non-exclusive, worldwide, royalty-free license to:
|
|
24
|
+
|
|
25
|
+
a) **Use** the Software for educational purposes, academic research, security studies,
|
|
26
|
+
and Authorized Security Testing;
|
|
27
|
+
b) **Copy and reproduce** the Software;
|
|
28
|
+
c) **Modify** the Software and create derivative works;
|
|
29
|
+
d) **Fork** the Software and maintain independent copies;
|
|
30
|
+
e) **Distribute** the Software and derivative works, provided all conditions in
|
|
31
|
+
Section 3 are met.
|
|
32
|
+
|
|
33
|
+
## 3. Conditions
|
|
34
|
+
|
|
35
|
+
Any use, copy, modification, fork, or distribution of the Software must comply with
|
|
36
|
+
ALL of the following conditions:
|
|
37
|
+
|
|
38
|
+
### 3.1 Attribution
|
|
39
|
+
|
|
40
|
+
a) You must retain the Author's original copyright notice and attribution in all
|
|
41
|
+
copies and derivative works.
|
|
42
|
+
b) You must retain all Upstream Credits, including but not limited to: original author
|
|
43
|
+
names, license notices, and attribution statements of third-party code used as a
|
|
44
|
+
base or reference for the Software.
|
|
45
|
+
c) Modified files must carry a prominent notice stating that you changed the files and
|
|
46
|
+
the date of any change.
|
|
47
|
+
d) Derivative works must include a clear statement identifying the original Software
|
|
48
|
+
and its Author.
|
|
49
|
+
e) Any copy, fork, or derivative work must include a visible reference to the Original
|
|
50
|
+
Repository URL (https://github.com/mrhenrike/TupaXPL-Forge) in the project's
|
|
51
|
+
README or equivalent documentation, so that users can trace the Software back to
|
|
52
|
+
its source.
|
|
53
|
+
f) The Author's name and credits must not be removed, obscured, or replaced in any
|
|
54
|
+
copy, fork, or derivative work. The Author must remain credited as the original
|
|
55
|
+
creator in all circumstances.
|
|
56
|
+
|
|
57
|
+
### 3.2 Same License
|
|
58
|
+
|
|
59
|
+
a) Any distribution of the Software or derivative works must be under this same
|
|
60
|
+
License (XSRL v1.0).
|
|
61
|
+
b) You may not apply any additional restrictions or alternative license terms to the
|
|
62
|
+
Software or derivative works.
|
|
63
|
+
c) You may not sublicense the Software under different terms.
|
|
64
|
+
|
|
65
|
+
### 3.3 Non-Commercial Use Only
|
|
66
|
+
|
|
67
|
+
a) The Software may not be used, in whole or in part, for commercial purposes.
|
|
68
|
+
b) "Commercial purposes" includes but is not limited to: selling the Software or
|
|
69
|
+
derivative works, incorporating the Software into commercial products or services,
|
|
70
|
+
using the Software to generate revenue directly or indirectly, and offering the
|
|
71
|
+
Software as part of a paid service.
|
|
72
|
+
c) Use in non-profit organizations, academic institutions, and personal projects is
|
|
73
|
+
permitted, provided no commercial gain is derived.
|
|
74
|
+
|
|
75
|
+
### 3.4 Ethical Use Only
|
|
76
|
+
|
|
77
|
+
a) The Software may only be used for:
|
|
78
|
+
- Educational purposes and academic research;
|
|
79
|
+
- Security studies, training, and skill development;
|
|
80
|
+
- Authorized Security Testing (as defined in Section 1);
|
|
81
|
+
- Capture The Flag (CTF) competitions and security labs;
|
|
82
|
+
- Defensive security, incident response, and threat analysis.
|
|
83
|
+
|
|
84
|
+
b) The Software may NOT be used for:
|
|
85
|
+
- Unauthorized access to systems, networks, or data;
|
|
86
|
+
- Any activity that violates applicable laws or regulations;
|
|
87
|
+
- Malicious purposes, including but not limited to: deploying malware against
|
|
88
|
+
unauthorized targets, conducting denial-of-service attacks, unauthorized
|
|
89
|
+
surveillance, data theft, or any form of cybercrime;
|
|
90
|
+
- Targeting individuals, organizations, or infrastructure without explicit
|
|
91
|
+
authorization;
|
|
92
|
+
- Any purpose that causes harm to individuals or organizations.
|
|
93
|
+
|
|
94
|
+
## 4. No Warranty
|
|
95
|
+
|
|
96
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
97
|
+
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
98
|
+
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
99
|
+
ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
|
100
|
+
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
101
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
102
|
+
|
|
103
|
+
## 5. Limitation of Liability
|
|
104
|
+
|
|
105
|
+
The Author shall not be held responsible for any misuse of the Software. Users are
|
|
106
|
+
solely responsible for ensuring their use of the Software complies with all applicable
|
|
107
|
+
laws, regulations, and ethical standards.
|
|
108
|
+
|
|
109
|
+
## 6. Termination
|
|
110
|
+
|
|
111
|
+
This License and the rights granted hereunder will terminate automatically if you fail
|
|
112
|
+
to comply with any of the terms and conditions of this License. Upon termination, you
|
|
113
|
+
must cease all use and destroy all copies of the Software in your possession.
|
|
114
|
+
|
|
115
|
+
## 7. Severability
|
|
116
|
+
|
|
117
|
+
If any provision of this License is held to be unenforceable, such provision shall be
|
|
118
|
+
reformed only to the extent necessary to make it enforceable, and the remaining
|
|
119
|
+
provisions shall continue in full force and effect.
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
SPDX-License-Identifier: LicenseRef-XSRL-1.0
|
tupaxpl-1.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: tupaxpl
|
|
3
|
+
Version: 1.3.0
|
|
4
|
+
Summary: TupaXPL-Forge — Offensive Security Platform (LLM+LangGraph runtime)
|
|
5
|
+
Author-email: Andre Henrike <safelabs.support@visioncybersecurity.com>
|
|
6
|
+
License: XSRL-1.0
|
|
7
|
+
Project-URL: Homepage, https://github.com/mrhenrike/TupaXPL-Forge
|
|
8
|
+
Project-URL: Repository, https://github.com/mrhenrike/TupaXPL-Forge
|
|
9
|
+
Project-URL: Documentation, https://github.com/mrhenrike/TupaXPL-Forge/wiki
|
|
10
|
+
Project-URL: Bug Tracker, https://github.com/mrhenrike/TupaXPL-Forge/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/mrhenrike/TupaXPL-Forge/releases
|
|
12
|
+
Keywords: security,pentest,offensive,llm,langgraph
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Intended Audience :: Information Technology
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Topic :: Security
|
|
19
|
+
Requires-Python: >=3.11
|
|
20
|
+
License-File: LICENSE
|
|
21
|
+
Requires-Dist: rich>=14.1.0
|
|
22
|
+
Requires-Dist: prompt_toolkit>=3.0.51
|
|
23
|
+
Requires-Dist: PyYAML>=6.0.3
|
|
24
|
+
Requires-Dist: langgraph>=1.0.1
|
|
25
|
+
Requires-Dist: langchain-core>=1.5.3
|
|
26
|
+
Requires-Dist: pydantic>=2.13.4
|
|
27
|
+
Requires-Dist: pydantic-core>=2.46.4
|
|
28
|
+
Requires-Dist: python-evtx>=0.8.1
|
|
29
|
+
Requires-Dist: chromadb>=1.0.15
|
|
30
|
+
Requires-Dist: fastapi>=0.141.1
|
|
31
|
+
Requires-Dist: uvicorn>=0.35.0
|
|
32
|
+
Requires-Dist: httpx>=0.28.1
|
|
33
|
+
Requires-Dist: xpl-core>=0.1.0
|
|
34
|
+
Dynamic: license-file
|
tupaxpl-1.3.0/README.md
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="docs/img/tupaxpl-forge-banner_16x9.png" alt="TupaXPL-Forge Banner" width="100%"/>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
[](README.md#compatibility)
|
|
7
|
+
[](LICENSE)
|
|
8
|
+
[](https://github.com/mrhenrike)
|
|
9
|
+
[](https://github.com/mrhenrike/TupaXPL-Forge/issues)
|
|
10
|
+
[](https://github.com/mrhenrike/TupaXPL-Forge/commits)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
> **Platform Note:** This framework is designed and tested primarily on **Linux** (Debian/Ubuntu/Kali). Most hardware-dependent modules (wireless adapters, USB devices, raw socket access, firmware tools) require Linux. Running on Windows or macOS may cause errors or limited functionality in many modules. Linux is strongly recommended for maximum compatibility.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# TupaXPL-Forge
|
|
19
|
+
|
|
20
|
+
**Unified Offensive Security Platform** — LangGraph AI agent + EmbedXPL E2E execution + local unrestricted LLM + red team campaign orchestration.
|
|
21
|
+
|
|
22
|
+
> Named after Tupã, the indigenous Brazilian god of thunder and lightning.
|
|
23
|
+
> Part of the XPL-Forge ecosystem: EmbedXPL · FirewallXPL · IndustrialXPL · WirelessXPL · PrinterXPL.
|
|
24
|
+
|
|
25
|
+
## Overview
|
|
26
|
+
|
|
27
|
+
TupaXPL-Forge merges the `pentest-engine` LangGraph agent infrastructure with the `OffSecForge` campaign orchestrator into a single unified offensive security platform.
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
tupaxpl/
|
|
31
|
+
forge.py # Unified CLI entrypoint
|
|
32
|
+
pentest_engine/ # LangGraph agent: tools, RAG, training, API
|
|
33
|
+
core/ # Ollama client, extraction, scoring
|
|
34
|
+
graph/ # StateGraph: authorize/recon/exploit/observe/report
|
|
35
|
+
tools/ # Ghidra, r2, binwalk, compiler, nuclei, atomic, gateway
|
|
36
|
+
knowledge/ # Chroma + BM25 RAG: ATT&CK, Sigma, Atomic, EmbedXPL
|
|
37
|
+
training/ # PEFT/LoRA fine-tuning pipeline
|
|
38
|
+
api/ # FastAPI at :8080
|
|
39
|
+
offsecforge/ # Campaign orchestrator
|
|
40
|
+
campaign.py # Red team campaign management
|
|
41
|
+
ai/ # LLM core (unrestricted), prompt library, code gen
|
|
42
|
+
builders/ # Exploit builder, payload builder, report builder, MITRE mapper
|
|
43
|
+
intel/ # EmbedXPL bridge (E2E), CVE feed
|
|
44
|
+
modules/ # recon, exploit, post, forensics
|
|
45
|
+
legacy/ # pentestgpt_arsenal
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Quick start
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Unrestricted mode (bypasses all policy gates)
|
|
52
|
+
OFFSEC_MODE=unrestricted python forge.py chat
|
|
53
|
+
|
|
54
|
+
# Generate exploit module for a CVE
|
|
55
|
+
python forge.py generate exploit CVE-2024-53703
|
|
56
|
+
|
|
57
|
+
# Generate offensive payload
|
|
58
|
+
python forge.py generate payload "reverse shell linux x64"
|
|
59
|
+
|
|
60
|
+
# Run full campaign
|
|
61
|
+
python forge.py campaign new "Q3 Red Team" 192.168.1.0/24
|
|
62
|
+
python forge.py campaign run <id>
|
|
63
|
+
|
|
64
|
+
# Binary RE
|
|
65
|
+
python forge.py analyze ./malware.bin --ghidra
|
|
66
|
+
|
|
67
|
+
# Code security review
|
|
68
|
+
python forge.py review ./target.py
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Requirements
|
|
72
|
+
|
|
73
|
+
- Python 3.11+
|
|
74
|
+
- Ollama (local LLM server): `ollama pull dolphin-llama3:8b-v2.9-q8_0`
|
|
75
|
+
- EmbedXPL-Forge (set `EMBEDXPL_PATH`)
|
|
76
|
+
|
|
77
|
+
## LLM models (via Ollama)
|
|
78
|
+
|
|
79
|
+
| Model | Use | VRAM |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `dolphin-llama3:8b-v2.9-q8_0` | Zero safety filters | 8 GB |
|
|
82
|
+
| `qwen2.5-coder:14b-instruct-q4_K_M` | Best code quality | 8.5 GB |
|
|
83
|
+
| `deepseek-coder-v2:16b-lite-instruct-q4_K_M` | Max quality | 10 GB |
|
|
84
|
+
|
|
85
|
+
## Environment
|
|
86
|
+
|
|
87
|
+
| Variable | Default | Description |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| `OFFSEC_MODE` | `standard` | Set to `unrestricted` to bypass PolicyGate |
|
|
90
|
+
| `PE_SAFE` | `true` | Set to `false` to disable safe mode |
|
|
91
|
+
| `PE_EXEC` | `false` | Set to `true` to enable execution |
|
|
92
|
+
| `OLLAMA_HOST` | `http://127.0.0.1:11434` | Ollama server |
|
|
93
|
+
| `EMBEDXPL_PATH` | auto-detect | EmbedXPL-Forge root |
|
|
94
|
+
|
|
95
|
+
## Author
|
|
96
|
+
|
|
97
|
+
Andre Henrique (@mrhenrike) | Uniao Geek | https://uniaogeek.com.br/
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Contact
|
|
101
|
+
|
|
102
|
+
**Support / general inquiries:** security.research@uniaogeek.com.br
|
|
103
|
+
**Security issues:** [SECURITY.md](SECURITY.md)
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### André Henrique
|
|
108
|
+
|
|
109
|
+
| | |
|
|
110
|
+
|---|---|
|
|
111
|
+
| GitHub | [@mrhenrike](https://github.com/mrhenrike) |
|
|
112
|
+
| X / Twitter | [@mrhenrike](https://x.com/mrhenrike) |
|
|
113
|
+
| LinkedIn | [mrhenrike](https://www.linkedin.com/in/mrhenrike/) |
|
|
114
|
+
|
|
115
|
+
### União Geek
|
|
116
|
+
|
|
117
|
+
| | |
|
|
118
|
+
|---|---|
|
|
119
|
+
| Website | [uniaogeek.com.br](https://uniaogeek.com.br/) |
|
|
120
|
+
| Blog | [uniaogeek.com.br/blog](https://uniaogeek.com.br/blog/) |
|
|
121
|
+
| GitHub | [Uniao-Geek](https://github.com/Uniao-Geek) |
|
|
122
|
+
| Instagram | [@uniaogeek](https://www.instagram.com/uniaogeek/) |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
**License:** XSRL-1.0 - Copyright (c) 2024-2026 Andre Henrike de Oliveira / Uniao Geek
|
|
127
|
+
**Created by:** André Henrique ([@mrhenrike](https://github.com/mrhenrike)) | [União Geek](https://uniaogeek.com.br/)
|
|
128
|
+
|
|
129
|
+
[Leia em Português](README.pt-BR.md) - [Command coverage](docs/commands.md) - [Wiki](../../wiki)
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"""Acquisition layer __init__ - unified interface.
|
|
2
|
+
|
|
3
|
+
Author: Andre Henrique (@mrhenrike) | Uniao Geek
|
|
4
|
+
"""
|
|
5
|
+
from offsecforge.acquisition.nvd_client import NvdClient, KevClient
|
|
6
|
+
from offsecforge.acquisition.github_poc_finder import GitHubPocFinder
|
|
7
|
+
from offsecforge.acquisition.exploit_db import ExploitDB, MalwareBazaar
|
|
8
|
+
from offsecforge.acquisition.exploit_downloader import ExploitDownloader
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"ExploitDB",
|
|
12
|
+
"ExploitDownloader",
|
|
13
|
+
"GitHubPocFinder",
|
|
14
|
+
"KevClient",
|
|
15
|
+
"MalwareBazaar",
|
|
16
|
+
"NvdClient",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def hunt(cve_id: str) -> dict:
|
|
21
|
+
"""One-shot CVE intelligence: NVD + KEV + PoCs.
|
|
22
|
+
|
|
23
|
+
Returns a unified intel dict for a CVE.
|
|
24
|
+
"""
|
|
25
|
+
nvd = NvdClient()
|
|
26
|
+
kev = KevClient()
|
|
27
|
+
gh = GitHubPocFinder()
|
|
28
|
+
edb = ExploitDB()
|
|
29
|
+
|
|
30
|
+
cve_data = nvd.get(cve_id) or {"id": cve_id, "description": "", "cvss_v3": 0, "severity": "UNKNOWN"}
|
|
31
|
+
kev_entry = kev.get(cve_id)
|
|
32
|
+
pocs = gh.find(cve_id)
|
|
33
|
+
edb_results = edb.search_cve(cve_id)
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
"cve_id": cve_id,
|
|
37
|
+
"nvd": cve_data,
|
|
38
|
+
"is_kev": kev_entry is not None,
|
|
39
|
+
"kev": kev_entry,
|
|
40
|
+
"pocs": pocs,
|
|
41
|
+
"exploitdb": edb_results,
|
|
42
|
+
"poc_count": len(pocs),
|
|
43
|
+
"has_metasploit": any("metasploit" in (p.get("description") or "").lower() for p in pocs),
|
|
44
|
+
"recommendation": _recommend(cve_data, kev_entry is not None, len(pocs)),
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _recommend(cve: dict, is_kev: bool, poc_count: int) -> str:
|
|
49
|
+
score = cve.get("cvss_v3", 0)
|
|
50
|
+
if is_kev and score >= 9.0:
|
|
51
|
+
return "CRITICAL - actively exploited, CVSS 9+, immediate priority"
|
|
52
|
+
elif is_kev:
|
|
53
|
+
return "HIGH - in CISA KEV, actively exploited in the wild"
|
|
54
|
+
elif score >= 9.0 and poc_count > 0:
|
|
55
|
+
return "HIGH - CVSS 9+, public PoC available"
|
|
56
|
+
elif score >= 7.0:
|
|
57
|
+
return "MEDIUM - high CVSS, investigate for exploitation path"
|
|
58
|
+
return "LOW - assess based on target context"
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""ExploitDB / searchsploit bridge.
|
|
2
|
+
|
|
3
|
+
Author: Andre Henrique (@mrhenrike) | Uniao Geek
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import json
|
|
7
|
+
import subprocess
|
|
8
|
+
from typing import Optional
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ExploitDB:
|
|
12
|
+
"""Interface to ExploitDB via searchsploit (installed in WSL/Kali)."""
|
|
13
|
+
|
|
14
|
+
def search(self, query: str, limit: int = 10) -> list[dict]:
|
|
15
|
+
"""Search ExploitDB for exploits matching query."""
|
|
16
|
+
return self._run_searchsploit(["--json", query])
|
|
17
|
+
|
|
18
|
+
def search_cve(self, cve_id: str) -> list[dict]:
|
|
19
|
+
"""Search ExploitDB by CVE ID."""
|
|
20
|
+
return self._run_searchsploit(["--json", "--cve", cve_id])
|
|
21
|
+
|
|
22
|
+
def download(self, exploit_id: str, output_dir: str = "/tmp") -> Optional[str]:
|
|
23
|
+
"""Download an exploit by its EDB ID."""
|
|
24
|
+
result = subprocess.run(
|
|
25
|
+
self._wsl_cmd(["searchsploit", "--mirror", exploit_id]),
|
|
26
|
+
capture_output=True, text=True, timeout=30, cwd=output_dir,
|
|
27
|
+
)
|
|
28
|
+
if result.returncode == 0:
|
|
29
|
+
return result.stdout.strip()
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
def _run_searchsploit(self, args: list[str]) -> list[dict]:
|
|
33
|
+
cmd = self._wsl_cmd(["searchsploit"] + args)
|
|
34
|
+
try:
|
|
35
|
+
result = subprocess.run(cmd, capture_output=True, text=True, timeout=20)
|
|
36
|
+
if result.returncode == 0:
|
|
37
|
+
data = json.loads(result.stdout)
|
|
38
|
+
return [self._parse(e) for e in data.get("RESULTS_EXPLOIT", [])]
|
|
39
|
+
except Exception:
|
|
40
|
+
pass
|
|
41
|
+
return []
|
|
42
|
+
|
|
43
|
+
def _parse(self, e: dict) -> dict:
|
|
44
|
+
return {
|
|
45
|
+
"id": e.get("EDB-ID", ""),
|
|
46
|
+
"title": e.get("Title", ""),
|
|
47
|
+
"date": e.get("Date", ""),
|
|
48
|
+
"author": e.get("Author", ""),
|
|
49
|
+
"type": e.get("Type", ""),
|
|
50
|
+
"platform": e.get("Platform", ""),
|
|
51
|
+
"path": e.get("Path", ""),
|
|
52
|
+
"codes": e.get("Codes", ""),
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
def _wsl_cmd(self, cmd: list[str]) -> list[str]:
|
|
56
|
+
"""Wrap command for WSL execution on Windows."""
|
|
57
|
+
import sys
|
|
58
|
+
if sys.platform == "win32":
|
|
59
|
+
return ["wsl", "-d", "Ubuntu", "--"] + cmd
|
|
60
|
+
return cmd
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class MalwareBazaar:
|
|
64
|
+
"""MalwareBazaar (abuse.ch) API client for malware samples."""
|
|
65
|
+
|
|
66
|
+
API = "https://mb-api.abuse.ch/api/v1/"
|
|
67
|
+
|
|
68
|
+
def search_tag(self, tag: str, limit: int = 10) -> list[dict]:
|
|
69
|
+
return self._query({"query": "get_taginfo", "tag": tag, "limit": limit})
|
|
70
|
+
|
|
71
|
+
def search_signature(self, sig: str) -> list[dict]:
|
|
72
|
+
return self._query({"query": "get_siginfo", "signature": sig, "limit": 10})
|
|
73
|
+
|
|
74
|
+
def get_hash(self, sha256: str) -> Optional[dict]:
|
|
75
|
+
results = self._query({"query": "get_info", "hash": sha256})
|
|
76
|
+
return results[0] if results else None
|
|
77
|
+
|
|
78
|
+
def _query(self, payload: dict) -> list[dict]:
|
|
79
|
+
import urllib.request
|
|
80
|
+
import urllib.parse
|
|
81
|
+
data = urllib.parse.urlencode(payload).encode()
|
|
82
|
+
try:
|
|
83
|
+
req = urllib.request.Request(self.API, data=data, method="POST")
|
|
84
|
+
req.add_header("User-Agent", "TupaXPL-Forge/2.0")
|
|
85
|
+
with urllib.request.urlopen(req, timeout=15) as r:
|
|
86
|
+
result = json.loads(r.read())
|
|
87
|
+
return result.get("data", [])
|
|
88
|
+
except Exception:
|
|
89
|
+
return []
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"""Exploit downloader - downloads and caches exploits locally.
|
|
2
|
+
|
|
3
|
+
Never deletes cached exploits. Stores in .tmp/cache/exploits/<cve_id>/
|
|
4
|
+
|
|
5
|
+
Author: Andre Henrique (@mrhenrike) | Uniao Geek
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
import hashlib
|
|
9
|
+
import json
|
|
10
|
+
import os
|
|
11
|
+
import ssl
|
|
12
|
+
import subprocess
|
|
13
|
+
import urllib.request
|
|
14
|
+
from datetime import datetime
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Optional
|
|
17
|
+
|
|
18
|
+
CACHE_DIR = Path(os.environ.get("TUPAXPL_CACHE", "")).resolve() or (
|
|
19
|
+
Path(__file__).resolve().parents[3] / ".tmp" / "cache" / "exploits"
|
|
20
|
+
)
|
|
21
|
+
_UA = "TupaXPL-Forge/2.0 Security Research"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ExploitDownloader:
|
|
25
|
+
"""Downloads and caches exploit PoCs and scripts locally. Never deletes."""
|
|
26
|
+
|
|
27
|
+
def __init__(self, cache_dir: Optional[Path] = None) -> None:
|
|
28
|
+
self.cache = cache_dir or CACHE_DIR
|
|
29
|
+
self.cache.mkdir(parents=True, exist_ok=True)
|
|
30
|
+
|
|
31
|
+
def download_url(self, cve_id: str, url: str, filename: Optional[str] = None) -> dict:
|
|
32
|
+
"""Download a PoC from URL into the CVE cache directory."""
|
|
33
|
+
cve_dir = self.cache / cve_id.upper()
|
|
34
|
+
cve_dir.mkdir(parents=True, exist_ok=True)
|
|
35
|
+
# Derive filename
|
|
36
|
+
if not filename:
|
|
37
|
+
filename = url.split("/")[-1].split("?")[0] or "poc.py"
|
|
38
|
+
dst = cve_dir / filename
|
|
39
|
+
if dst.exists():
|
|
40
|
+
return {"status": "cached", "path": str(dst), "size": dst.stat().st_size}
|
|
41
|
+
try:
|
|
42
|
+
ctx = ssl.create_default_context()
|
|
43
|
+
ctx.check_hostname = False
|
|
44
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
45
|
+
req = urllib.request.Request(url, headers={"User-Agent": _UA})
|
|
46
|
+
with urllib.request.urlopen(req, context=ctx, timeout=30) as r:
|
|
47
|
+
data = r.read()
|
|
48
|
+
dst.write_bytes(data)
|
|
49
|
+
# Write metadata
|
|
50
|
+
meta = {
|
|
51
|
+
"cve_id": cve_id,
|
|
52
|
+
"source_url": url,
|
|
53
|
+
"filename": filename,
|
|
54
|
+
"downloaded": datetime.now().isoformat(),
|
|
55
|
+
"size": len(data),
|
|
56
|
+
"sha256": hashlib.sha256(data).hexdigest(),
|
|
57
|
+
}
|
|
58
|
+
(cve_dir / "metadata.json").write_text(
|
|
59
|
+
json.dumps(meta, indent=2), encoding="utf-8"
|
|
60
|
+
)
|
|
61
|
+
return {"status": "downloaded", "path": str(dst), "size": len(data)}
|
|
62
|
+
except Exception as e:
|
|
63
|
+
return {"status": "error", "error": str(e), "url": url}
|
|
64
|
+
|
|
65
|
+
def clone_repo(self, cve_id: str, repo_url: str) -> dict:
|
|
66
|
+
"""Clone a GitHub PoC repo into the CVE cache directory."""
|
|
67
|
+
cve_dir = self.cache / cve_id.upper()
|
|
68
|
+
repo_name = repo_url.rstrip("/").split("/")[-1].removesuffix(".git")
|
|
69
|
+
dst = cve_dir / repo_name
|
|
70
|
+
if dst.exists():
|
|
71
|
+
return {"status": "cached", "path": str(dst)}
|
|
72
|
+
cve_dir.mkdir(parents=True, exist_ok=True)
|
|
73
|
+
result = subprocess.run(
|
|
74
|
+
["git", "clone", "--depth=1", repo_url, str(dst)],
|
|
75
|
+
capture_output=True, text=True, timeout=60,
|
|
76
|
+
)
|
|
77
|
+
if result.returncode == 0:
|
|
78
|
+
return {"status": "cloned", "path": str(dst)}
|
|
79
|
+
return {"status": "error", "error": result.stderr[:200]}
|
|
80
|
+
|
|
81
|
+
def list_cached(self, cve_id: str = "") -> list[dict]:
|
|
82
|
+
"""List all cached exploits, optionally filtered by CVE."""
|
|
83
|
+
results = []
|
|
84
|
+
search = self.cache / cve_id.upper() if cve_id else self.cache
|
|
85
|
+
if not search.exists():
|
|
86
|
+
return []
|
|
87
|
+
pattern = "**/*.py" if not cve_id else "*.py"
|
|
88
|
+
for f in search.glob(pattern if cve_id else "**/*.py"):
|
|
89
|
+
meta_file = f.parent / "metadata.json"
|
|
90
|
+
meta = json.loads(meta_file.read_text()) if meta_file.exists() else {}
|
|
91
|
+
results.append({
|
|
92
|
+
"path": str(f),
|
|
93
|
+
"cve": f.parts[-2] if not cve_id else cve_id,
|
|
94
|
+
"size": f.stat().st_size,
|
|
95
|
+
**meta,
|
|
96
|
+
})
|
|
97
|
+
return results
|
|
98
|
+
|
|
99
|
+
def get_cache_path(self, cve_id: str) -> Path:
|
|
100
|
+
"""Return the cache directory for a CVE."""
|
|
101
|
+
return self.cache / cve_id.upper()
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""GitHub PoC finder - searches nomi-sec/PoC-in-GitHub and trickest/cve.
|
|
2
|
+
|
|
3
|
+
Author: Andre Henrique (@mrhenrike) | Uniao Geek
|
|
4
|
+
"""
|
|
5
|
+
from __future__ import annotations
|
|
6
|
+
import json
|
|
7
|
+
import ssl
|
|
8
|
+
import urllib.parse
|
|
9
|
+
import urllib.request
|
|
10
|
+
from typing import Any, Optional
|
|
11
|
+
|
|
12
|
+
_UA = "TupaXPL-Forge/2.0 Security Research"
|
|
13
|
+
_NOMI_BASE = "https://raw.githubusercontent.com/nomi-sec/PoC-in-GitHub/master"
|
|
14
|
+
_GH_SEARCH = "https://api.github.com/search/repositories"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _get(url: str, timeout: float = 15.0) -> Any:
|
|
18
|
+
ctx = ssl.create_default_context()
|
|
19
|
+
ctx.check_hostname = False
|
|
20
|
+
ctx.verify_mode = ssl.CERT_NONE
|
|
21
|
+
headers = {"User-Agent": _UA, "Accept": "application/vnd.github+json"}
|
|
22
|
+
req = urllib.request.Request(url, headers=headers)
|
|
23
|
+
with urllib.request.urlopen(req, context=ctx, timeout=timeout) as r:
|
|
24
|
+
return json.loads(r.read())
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class GitHubPocFinder:
|
|
28
|
+
"""Multi-source PoC finder: nomi-sec, trickest/cve, GitHub Search."""
|
|
29
|
+
|
|
30
|
+
def find(self, cve_id: str) -> list[dict]:
|
|
31
|
+
"""Find all PoC repos for a CVE ID."""
|
|
32
|
+
results = []
|
|
33
|
+
results.extend(self._nomi_sec(cve_id))
|
|
34
|
+
results.extend(self._github_search(cve_id))
|
|
35
|
+
# Deduplicate by URL
|
|
36
|
+
seen = set()
|
|
37
|
+
unique = []
|
|
38
|
+
for r in results:
|
|
39
|
+
url = r.get("url", "")
|
|
40
|
+
if url not in seen:
|
|
41
|
+
seen.add(url)
|
|
42
|
+
unique.append(r)
|
|
43
|
+
return sorted(unique, key=lambda x: x.get("stars", 0), reverse=True)
|
|
44
|
+
|
|
45
|
+
def _nomi_sec(self, cve_id: str) -> list[dict]:
|
|
46
|
+
"""Query nomi-sec/PoC-in-GitHub index."""
|
|
47
|
+
try:
|
|
48
|
+
year = cve_id.split("-")[1]
|
|
49
|
+
url = f"{_NOMI_BASE}/{year}/{cve_id}.json"
|
|
50
|
+
data = _get(url)
|
|
51
|
+
return [{
|
|
52
|
+
"source": "nomi-sec",
|
|
53
|
+
"cve": cve_id,
|
|
54
|
+
"url": r.get("html_url", ""),
|
|
55
|
+
"description": r.get("description", ""),
|
|
56
|
+
"stars": r.get("stargazers_count", 0),
|
|
57
|
+
"language": r.get("language", ""),
|
|
58
|
+
"updated": r.get("updated_at", "")[:10],
|
|
59
|
+
} for r in (data if isinstance(data, list) else [])]
|
|
60
|
+
except Exception:
|
|
61
|
+
return []
|
|
62
|
+
|
|
63
|
+
def _github_search(self, cve_id: str, limit: int = 5) -> list[dict]:
|
|
64
|
+
"""Search GitHub repositories by CVE ID."""
|
|
65
|
+
try:
|
|
66
|
+
query = urllib.parse.quote(f"{cve_id} exploit poc")
|
|
67
|
+
url = f"{_GH_SEARCH}?q={query}&sort=stars&per_page={limit}"
|
|
68
|
+
data = _get(url)
|
|
69
|
+
return [{
|
|
70
|
+
"source": "github-search",
|
|
71
|
+
"cve": cve_id,
|
|
72
|
+
"url": r.get("html_url", ""),
|
|
73
|
+
"description": (r.get("description") or "")[:200],
|
|
74
|
+
"stars": r.get("stargazers_count", 0),
|
|
75
|
+
"language": r.get("language", ""),
|
|
76
|
+
"updated": r.get("updated_at", "")[:10],
|
|
77
|
+
} for r in data.get("items", [])]
|
|
78
|
+
except Exception:
|
|
79
|
+
return []
|