Add files via upload

This commit is contained in:
公明
2026-05-04 03:42:24 +08:00
committed by GitHub
parent 62c6f3f191
commit 4fca4a85c2
10 changed files with 4133 additions and 11 deletions
File diff suppressed because it is too large Load Diff
+49
View File
@@ -12998,6 +12998,55 @@ header {
.dashboard-kpi-row { grid-template-columns: 1fr; }
}
/* C2 概览:主列内卡片,外层样式复用 .dashboard-grid .dashboard-section */
.dashboard-c2-strip {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 14px;
}
@media (max-width: 720px) {
.dashboard-c2-strip { grid-template-columns: 1fr; }
}
.dashboard-c2-stat {
background: linear-gradient(145deg, #f8fafc 0%, #eef2ff 100%);
border-radius: 12px;
padding: 14px 16px;
cursor: pointer;
border: 1px solid rgba(99, 102, 241, 0.14);
transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
}
.dashboard-c2-stat:hover {
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(99, 102, 241, 0.12);
border-color: rgba(99, 102, 241, 0.28);
}
.dashboard-c2-stat:focus-visible {
outline: 2px solid rgba(99, 102, 241, 0.45);
outline-offset: 2px;
}
.dashboard-c2-stat-value {
font-size: 1.625rem;
font-weight: 800;
color: var(--text-primary);
line-height: 1.15;
letter-spacing: -0.02em;
font-variant-numeric: tabular-nums;
}
.dashboard-c2-stat-label {
display: block;
margin-top: 6px;
font-size: 0.8125rem;
color: var(--text-secondary);
font-weight: 500;
}
.dashboard-kpi-card {
background: #fff;
border-radius: 14px;
+321 -1
View File
@@ -75,7 +75,14 @@
"roles": "Roles",
"rolesManagement": "Roles Management",
"settings": "System settings",
"hitl": "Human-in-the-loop"
"hitl": "Human-in-the-loop",
"c2": "C2",
"c2Listeners": "Listeners",
"c2Sessions": "Sessions",
"c2Tasks": "Tasks",
"c2Payloads": "Payload",
"c2Events": "Events",
"c2Profiles": "Traffic profiles"
},
"dashboard": {
"title": "Dashboard",
@@ -88,6 +95,14 @@
"clickToViewTasks": "Click to view tasks",
"clickToViewVuln": "Click to view vulnerabilities",
"clickToViewMCP": "Click to view MCP monitor",
"c2OverviewTitle": "C2 overview",
"c2GoManage": "Open C2 →",
"c2ListenersRunning": "Listeners running",
"c2SessionsOnline": "Sessions online",
"c2TasksPending": "Pending / queued tasks",
"c2ClickListeners": "View listeners",
"c2ClickSessions": "View sessions",
"c2ClickTasks": "View tasks",
"severityDistribution": "Vulnerability severity distribution",
"severityCritical": "Critical",
"severityHigh": "High",
@@ -263,6 +278,7 @@
"einoSubAgentStep": "Sub-agent {{agent}} · step {{n}}",
"aiThinking": "AI thinking",
"planning": "Planning",
"assistantStreamPhase": "Assistant output",
"toolCallsDetected": "Detected {{count}} tool call(s)",
"callTool": "Call tool: {{name}} ({{index}}/{{total}})",
"toolExecComplete": "Tool {{name}} completed",
@@ -2032,5 +2048,309 @@
"roleFilterOnBanner": "These tools are checked and linked to this role (independent of MCP-wide enable).",
"roleFilterOffBanner": "These tools are unchecked and not linked to this role.",
"checkboxLinkTitle": "Check to link this tool to this role"
},
"c2": {
"title": "C2 Management",
"welcomeTitle": "AI-Native C2 Framework",
"welcomeDesc": "MCP-native design: let LLM call C2 like calling nmap to complete the full chain: initial access → control → tasks → lateral movement → cleanup",
"statListeners": "Running Listeners",
"statSessions": "Online Sessions",
"statPending": "Pending Tasks",
"goListeners": "Manage Listeners",
"goSessions": "View Sessions",
"clipboardCopied": "Copied to clipboard",
"fmt": {
"durationMs": "{{n}}ms",
"durationSec": "{{n}}s",
"durationMin": "{{n}}m"
},
"files": {
"parent": "Parent",
"refresh": "Refresh",
"loading": "Loading…",
"timeout": "Timed out loading files",
"emptyDir": "Empty directory",
"colName": "Name",
"colSize": "Size",
"colMode": "Mode",
"colActions": "Actions",
"open": "Open",
"download": "Download",
"failed": "Failed"
},
"listeners": {
"title": "Listener Management",
"create": "Create Listener",
"name": "Name",
"type": "Type",
"bindHost": "Bind Host",
"bindPort": "Bind Port",
"status": "Status",
"remark": "Remark",
"actions": "Actions",
"start": "Start",
"stop": "Stop",
"delete": "Delete",
"edit": "Edit",
"running": "Running",
"stopped": "Stopped",
"placeholderName": "Enter listener name",
"placeholderHost": "Default 127.0.0.1",
"placeholderPort": "Enter port number",
"placeholderRemark": "Optional remark",
"emptyTitle": "No listeners yet",
"emptyHint": "Create your first C2 listener using the button below",
"headerCreateBtn": "+ Create Listener",
"modalCreateTitle": "Create Listener",
"placeholderNameExample": "e.g. http-beacon-01",
"bindHintExternal": "Use 0.0.0.0 to allow external access",
"callbackHost": "Callback host (optional)",
"callbackHostHint": "Public IP or hostname stored for payloads/beacons; separate from bind address. If empty, payload generation falls back to bind address / auto-detect.",
"placeholderRemarkLong": "Optional remark",
"editTitle": "Edit Listener",
"startedAt": "Started {{time}}",
"confirmDelete": "Delete this listener? All related sessions and tasks will be removed.",
"toastFillRequired": "Please fill in all required fields",
"toastCreated": "Listener created",
"toastStarted": "Listener started",
"toastStopped": "Listener stopped",
"toastDeleted": "Listener deleted",
"toastUpdated": "Listener updated",
"submitCreate": "Create",
"typeLabels": {
"http_beacon": "HTTP Beacon",
"https_beacon": "HTTPS Beacon",
"tcp_reverse": "TCP Reverse",
"websocket": "WebSocket"
}
},
"sessions": {
"title": "Session Management",
"hostname": "Hostname",
"username": "Username",
"os": "OS",
"arch": "Arch",
"ip": "IP Address",
"status": "Status",
"active": "Active",
"sleeping": "Sleeping",
"dead": "Dead",
"isAdmin": "Admin",
"pid": "PID",
"sleep": "Sleep Interval",
"jitter": "Jitter",
"firstSeen": "First Seen",
"lastCheckIn": "Last Check-in",
"selectSession": "Select Session",
"terminal": "Terminal",
"files": "Files",
"tasks": "Tasks",
"info": "Info",
"execute": "Execute Command",
"kill": "Kill Session",
"cardDeleteSession": "Delete",
"btnSleep": "Sleep",
"emptyTitle": "No active sessions",
"emptyHint": "Start a listener and run a payload on the target",
"unknownHost": "unknown",
"rootBadge": "ROOT",
"curlBeaconTitle": "Lightweight Curl beacon",
"curlBeaconBody": "This session was created with a Curl oneliner: heartbeat and tasks only.\nInteractive terminal and file management require a compiled Beacon binary or a TCP reverse listener.",
"infoSessionId": "Session ID",
"infoImplantUuid": "Implant UUID",
"infoHostname": "Hostname",
"infoUsername": "Username",
"infoOs": "OS",
"infoArch": "Arch",
"infoPid": "PID",
"infoProcess": "Process",
"infoAdmin": "Admin",
"infoInternalIp": "Internal IP",
"infoSleep": "Sleep",
"infoSleepLine": "{{sec}}s (jitter {{jitter}}%)",
"infoFirstSeen": "First seen",
"infoLastCheckin": "Last check-in",
"infoNote": "Note",
"adminYes": "Yes",
"adminNo": "No",
"promptSleepSeconds": "Sleep interval (seconds)",
"promptJitterPercent": "Jitter percent (0100)",
"toastSleepUpdated": "Sleep settings updated",
"confirmExitSession": "Send exit command to this session?",
"confirmDeleteSession": "Remove this session and related tasks/files from the server? (Does not send exit to the implant; use Kill Session to exit the agent.)",
"toastExitSent": "Exit command sent",
"toastSessionDeleted": "Session record deleted",
"terminalWelcome": "CyberStrikeAI C2 Terminal — AI-Native Command & Control",
"termStatusReady": "Ready",
"termStatusExec": "Executing…",
"termStatusErr": "Error",
"termStatusTimeout": "Timeout",
"termNoSession": "Error: no session selected",
"termWaitTimeout": "[Timed out waiting for result]",
"termCleared": "Terminal cleared",
"termNoSelection": "No text selected",
"clearTerminal": "Clear"
},
"tasks": {
"title": "Task Management",
"taskId": "Task ID",
"type": "Type",
"status": "Status",
"result": "Result",
"error": "Error",
"duration": "Duration",
"createdAt": "Created At",
"queued": "Queued",
"sent": "Sent",
"running": "Running",
"success": "Success",
"failed": "Failed",
"cancelled": "Cancelled",
"viewResult": "View Result",
"cancel": "Cancel Task",
"refresh": "Refresh Tasks",
"pending": "Pending",
"emptyAll": "No tasks yet",
"emptySession": "No tasks for this session",
"colTask": "Task",
"colSession": "Session",
"colType": "Type",
"colStatus": "Status",
"colDuration": "Duration",
"colCreated": "Created",
"colActions": "Actions",
"view": "View",
"cancelBtn": "Cancel",
"modalTitle": "Task details",
"labelId": "ID",
"labelSession": "Session",
"labelType": "Type",
"labelStatus": "Status",
"labelCreated": "Created",
"labelSent": "Sent",
"labelCompleted": "Completed",
"labelDuration": "Duration",
"labelError": "Error",
"labelResult": "Output",
"toastCancelled": "Task cancelled",
"batchDelete": "Delete selected",
"selectAll": "Select all on this page",
"deleteOne": "Delete task",
"deleteBtn": "Delete",
"confirmDeleteOne": "Delete this task record from the server? This cannot be undone.",
"confirmBatchDelete": "Delete {{n}} selected task record(s)? This cannot be undone.",
"toastSelectFirst": "Select tasks to delete first",
"toastDeleted": "Deleted {{n}} task(s)",
"paginationShow": "Showing {{start}}-{{end}} / {{total}} records",
"paginationPerPage": "Per page",
"paginationFirst": "First",
"paginationPrev": "Previous",
"paginationPage": "Page {{current}} / {{total}}",
"paginationNext": "Next",
"paginationLast": "Last"
},
"payloads": {
"title": "Payload Generator",
"oneliner": "Oneliner Payload",
"build": "Build Beacon",
"listener": "Listener",
"kind": "Kind",
"host": "Callback Host",
"generate": "Generate",
"copy": "Copy to Clipboard",
"copied": "Copied",
"os": "Target OS",
"arch": "Target Arch",
"buildBtn": "Build",
"building": "Building...",
"download": "Download",
"linux": "Linux",
"windows": "Windows",
"darwin": "macOS",
"amd64": "AMD64",
"arm64": "ARM64",
"386": "386",
"arm": "ARM",
"onelinerDesc": "Generate a one-line reverse shell for the target (Bash / Python / PowerShell / Curl).",
"buildDesc": "Cross-compile a full Beacon binary for Linux / Windows / macOS.",
"hostOptional": "Callback host (optional)",
"placeholderListenerHost": "Leave empty: listener callback host, else bind address",
"generateOnelinerBtn": "Generate Oneliner",
"buildBeaconBtn": "Build Beacon",
"loopbackBeaconWarning": "127.0.0.1 works only when the beacon and C2 share the same host and network namespace (simple local test). If C2 runs in Docker and the beacon runs on the host, 127.0.0.1 hits the host loopback, not the container — use the published port plus the host LAN IP or host.docker.internal. For remote targets, bind 0.0.0.0 and rebuild.",
"noBeaconListenersTcpOnly": "tcp_reverse supports compiled Beacon (TCP + CSB1 framing); classic shell still uses Oneliner above",
"noListenersOption": "No listeners available",
"noKindOption": "No kinds available",
"toastLoadListenersFail": "Failed to load listeners: {{msg}}",
"toastPickListener": "Select a listener first",
"toastOnelinerFail": "Failed to generate oneliner: {{msg}}",
"toastBuildFail": "Failed to build beacon: {{msg}}",
"toastBuildSuccess": "Build succeeded: {{bytes}} bytes",
"buildSuccessTitle": "Build succeeded",
"buildMetaOsArch": "OS: {{os}} | Arch: {{arch}}",
"buildSize": "Size: {{bytes}} bytes",
"clickToCopyTitle": "Click to copy",
"toastDownloadQueued": "Download task queued"
},
"events": {
"title": "Event Audit",
"level": "Level",
"category": "Category",
"message": "Message",
"time": "Time",
"info": "Info",
"warn": "Warning",
"critical": "Critical",
"listener": "Listener",
"session": "Session",
"task": "Task",
"payload": "Payload",
"opsec": "OPSEC",
"refresh": "Refresh",
"empty": "No events yet",
"batchDelete": "Delete selected",
"selectAll": "Select all on this page",
"deleteOne": "Delete",
"confirmDeleteOne": "Delete this event? This cannot be undone.",
"confirmBatchDelete": "Delete {{n}} selected event(s)? This cannot be undone.",
"toastSelectFirst": "Select events to delete first",
"toastDeleted": "Deleted {{n}} event(s)",
"paginationShow": "Showing {{start}}-{{end}} / {{total}} records",
"paginationPerPage": "Per page",
"paginationFirst": "First",
"paginationPrev": "Previous",
"paginationPage": "Page {{current}} / {{total}}",
"paginationNext": "Next",
"paginationLast": "Last"
},
"profiles": {
"title": "Malleable Profile",
"name": "Name",
"userAgent": "User-Agent",
"uris": "URI Paths",
"headers": "Headers",
"jitter": "Jitter Range",
"create": "Create Profile",
"createBtn": "+ Create Profile",
"delete": "Delete",
"empty": "No profiles yet",
"defaultValue": "Default",
"modalCreateTitle": "Create Malleable Profile",
"profileNameLabel": "Profile name",
"placeholderProfileName": "e.g. cdn-fronting",
"hintUa": "Custom User-Agent for Beacon HTTP requests",
"labelBeaconUris": "Beacon URIs (one per line)",
"hintUris": "URI paths used when the beacon checks in",
"labelJitterMin": "Jitter min (ms)",
"labelJitterMax": "Jitter max (ms)",
"labelRespHeaders": "Custom response headers (JSON)",
"hintHeaders": "HTTP response headers to mimic a legitimate server",
"toastNameRequired": "Profile name is required",
"toastInvalidHeadersJson": "Invalid JSON in response headers",
"toastCreated": "Profile created",
"toastDeleted": "Profile deleted",
"confirmDelete": "Delete this profile?",
"submitCreate": "Create"
}
}
}
+321 -1
View File
@@ -75,7 +75,14 @@
"roles": "角色",
"rolesManagement": "角色管理",
"settings": "系统设置",
"hitl": "人机协同"
"hitl": "人机协同",
"c2": "C2",
"c2Listeners": "监听器",
"c2Sessions": "会话",
"c2Tasks": "任务",
"c2Payloads": "载荷",
"c2Events": "事件",
"c2Profiles": "流量伪装"
},
"dashboard": {
"title": "仪表盘",
@@ -88,6 +95,14 @@
"clickToViewTasks": "点击查看任务管理",
"clickToViewVuln": "点击查看漏洞管理",
"clickToViewMCP": "点击查看 MCP 监控",
"c2OverviewTitle": "C2 概览",
"c2GoManage": "进入 C2 →",
"c2ListenersRunning": "运行中监听器",
"c2SessionsOnline": "在线会话",
"c2TasksPending": "待审 / 排队任务",
"c2ClickListeners": "查看监听器",
"c2ClickSessions": "查看会话",
"c2ClickTasks": "查看任务",
"severityDistribution": "漏洞严重程度分布",
"severityCritical": "严重",
"severityHigh": "高危",
@@ -252,6 +267,7 @@
"einoSubAgentStep": "子代理 {{agent}} · 第 {{n}} 步",
"aiThinking": "AI思考",
"planning": "规划中",
"assistantStreamPhase": "助手输出",
"toolCallsDetected": "检测到 {{count}} 个工具调用",
"callTool": "调用工具: {{name}} ({{index}}/{{total}})",
"toolExecComplete": "工具 {{name}} 执行完成",
@@ -2021,5 +2037,309 @@
"roleFilterOnBanner": "以下为「已勾选、关联到本角色」的工具(与 MCP 管理里全局开/关无关)。",
"roleFilterOffBanner": "以下为「未勾选、未关联到本角色」的工具。",
"checkboxLinkTitle": "勾选表示本角色关联使用该工具"
},
"c2": {
"title": "C2 管理",
"welcomeTitle": "AI-Native C2 框架",
"welcomeDesc": "以 MCP 工具为一等公民,让 LLM 可以像调用 nmap 一样调用 C2 完成「上线 → 控制 → 任务 → 横向 → 清场」全流程",
"statListeners": "运行中监听器",
"statSessions": "在线会话",
"statPending": "待审任务",
"goListeners": "管理监听器",
"goSessions": "查看会话",
"clipboardCopied": "已复制到剪贴板",
"fmt": {
"durationMs": "{{n}}ms",
"durationSec": "{{n}}秒",
"durationMin": "{{n}}分钟"
},
"files": {
"parent": "上级目录",
"refresh": "刷新",
"loading": "加载中…",
"timeout": "加载文件超时",
"emptyDir": "空目录",
"colName": "名称",
"colSize": "大小",
"colMode": "权限",
"colActions": "操作",
"open": "打开",
"download": "下载",
"failed": "失败"
},
"listeners": {
"title": "监听器管理",
"create": "创建监听器",
"name": "名称",
"type": "类型",
"bindHost": "绑定地址",
"bindPort": "绑定端口",
"status": "状态",
"remark": "备注",
"actions": "操作",
"start": "启动",
"stop": "停止",
"delete": "删除",
"edit": "编辑",
"running": "运行中",
"stopped": "已停止",
"placeholderName": "输入监听器名称",
"placeholderHost": "默认 127.0.0.1",
"placeholderPort": "输入端口号",
"placeholderRemark": "可选备注",
"emptyTitle": "暂无监听器",
"emptyHint": "点击下方按钮创建第一个 C2 监听器",
"headerCreateBtn": "+ 创建监听器",
"modalCreateTitle": "创建监听器",
"placeholderNameExample": "例如 http-beacon-01",
"bindHintExternal": "使用 0.0.0.0 允许外部访问",
"callbackHost": "回连地址(可选)",
"callbackHostHint": "公网 IP 或域名,写入配置供 Payload/Beacon 使用;与「绑定地址」分离。不填则生成 Payload 时按绑定地址或自动探测。",
"placeholderRemarkLong": "可选的备注说明",
"editTitle": "编辑监听器",
"startedAt": "启动于 {{time}}",
"confirmDelete": "确定删除此监听器?相关会话与任务将被清除。",
"toastFillRequired": "请填写必填项",
"toastCreated": "监听器已创建",
"toastStarted": "监听器已启动",
"toastStopped": "监听器已停止",
"toastDeleted": "监听器已删除",
"toastUpdated": "监听器已更新",
"submitCreate": "创建",
"typeLabels": {
"http_beacon": "HTTP Beacon",
"https_beacon": "HTTPS Beacon",
"tcp_reverse": "TCP 反向",
"websocket": "WebSocket"
}
},
"sessions": {
"title": "会话管理",
"hostname": "主机名",
"username": "用户名",
"os": "操作系统",
"arch": "架构",
"ip": "IP 地址",
"status": "状态",
"active": "活跃",
"sleeping": "休眠",
"dead": "离线",
"isAdmin": "管理员",
"pid": "进程ID",
"sleep": "Sleep 间隔",
"jitter": "Jitter",
"firstSeen": "首次上线",
"lastCheckIn": "上次心跳",
"selectSession": "选择会话",
"terminal": "终端",
"files": "文件",
"tasks": "任务",
"info": "信息",
"execute": "执行命令",
"kill": "终止会话",
"cardDeleteSession": "删除会话",
"btnSleep": "Sleep",
"emptyTitle": "暂无在线会话",
"emptyHint": "启动监听器并在目标上执行 Payload",
"unknownHost": "未知",
"rootBadge": "ROOT",
"curlBeaconTitle": "轻量级 Curl 信标",
"curlBeaconBody": "此会话由 Curl Oneliner 建立,仅支持心跳保活和任务下发。\n交互式终端与文件管理需使用编译的 Beacon 可执行文件或 TCP 反向监听器。",
"infoSessionId": "会话 ID",
"infoImplantUuid": "植入体 UUID",
"infoHostname": "主机名",
"infoUsername": "用户名",
"infoOs": "操作系统",
"infoArch": "架构",
"infoPid": "PID",
"infoProcess": "进程",
"infoAdmin": "管理员",
"infoInternalIp": "内网 IP",
"infoSleep": "Sleep",
"infoSleepLine": "{{sec}} 秒(抖动 {{jitter}}%",
"infoFirstSeen": "首次上线",
"infoLastCheckin": "上次心跳",
"infoNote": "备注",
"adminYes": "是",
"adminNo": "否",
"promptSleepSeconds": "Sleep 间隔(秒)",
"promptJitterPercent": "抖动百分比(0100",
"toastSleepUpdated": "Sleep 设置已更新",
"confirmExitSession": "向该会话发送退出指令?",
"confirmDeleteSession": "从服务器删除此会话及其关联任务与文件记录?(不会向植入体发送退出;若需退出目标进程请使用「终止会话」。)",
"toastExitSent": "退出指令已发送",
"toastSessionDeleted": "会话记录已删除",
"terminalWelcome": "CyberStrikeAI C2 终端 — AI-Native 命令与控制",
"termStatusReady": "就绪",
"termStatusExec": "执行中…",
"termStatusErr": "错误",
"termStatusTimeout": "超时",
"termNoSession": "错误:未选择会话",
"termWaitTimeout": "[等待结果超时]",
"termCleared": "终端已清屏",
"termNoSelection": "未选中文本",
"clearTerminal": "清屏"
},
"tasks": {
"title": "任务管理",
"taskId": "任务ID",
"type": "类型",
"status": "状态",
"result": "结果",
"error": "错误",
"duration": "耗时",
"createdAt": "创建时间",
"queued": "队列中",
"sent": "已发送",
"running": "执行中",
"success": "成功",
"failed": "失败",
"cancelled": "已取消",
"viewResult": "查看结果",
"cancel": "取消任务",
"refresh": "刷新任务",
"pending": "待处理",
"emptyAll": "暂无任务",
"emptySession": "该会话暂无任务",
"colTask": "任务",
"colSession": "会话",
"colType": "类型",
"colStatus": "状态",
"colDuration": "耗时",
"colCreated": "创建时间",
"colActions": "操作",
"view": "查看",
"cancelBtn": "取消",
"modalTitle": "任务详情",
"labelId": "ID",
"labelSession": "会话",
"labelType": "类型",
"labelStatus": "状态",
"labelCreated": "创建时间",
"labelSent": "发送时间",
"labelCompleted": "完成时间",
"labelDuration": "耗时",
"labelError": "错误",
"labelResult": "输出",
"toastCancelled": "任务已取消",
"batchDelete": "批量删除",
"selectAll": "全选本页",
"deleteOne": "删除任务",
"deleteBtn": "删除",
"confirmDeleteOne": "确定从服务器删除该任务记录吗?此操作不可恢复。",
"confirmBatchDelete": "确定删除选中的 {{n}} 条任务记录吗?此操作不可恢复。",
"toastSelectFirst": "请先勾选要删除的任务",
"toastDeleted": "已删除 {{n}} 条",
"paginationShow": "显示 {{start}}-{{end}} / 共 {{total}} 条记录",
"paginationPerPage": "每页显示",
"paginationFirst": "首页",
"paginationPrev": "上一页",
"paginationPage": "第 {{current}} / {{total}} 页",
"paginationNext": "下一页",
"paginationLast": "末页"
},
"payloads": {
"title": "Payload 生成",
"oneliner": "单行 Payload",
"build": "编译 Beacon",
"listener": "监听器",
"kind": "类型",
"host": "回连地址",
"generate": "生成",
"copy": "复制到剪贴板",
"copied": "已复制",
"os": "目标系统",
"arch": "目标架构",
"buildBtn": "构建",
"building": "构建中...",
"download": "下载",
"linux": "Linux",
"windows": "Windows",
"darwin": "macOS",
"amd64": "AMD64",
"arm64": "ARM64",
"386": "386",
"arm": "ARM",
"onelinerDesc": "快速生成可在目标机直接执行的反弹命令,支持 Bash / Python / PowerShell / Curl",
"buildDesc": "交叉编译多平台完整 Beacon 可执行文件,支持 Linux / Windows / macOS",
"hostOptional": "回连地址(可选)",
"placeholderListenerHost": "留空则优先监听器「回连地址」,否则按绑定地址",
"generateOnelinerBtn": "生成 Oneliner",
"buildBeaconBtn": "构建 Beacon",
"loopbackBeaconWarning": "127.0.0.1 仅适合「Beacon 与 C2 在同一台机、同一网络环境」本机自测。若 C2 跑在 Docker 里、Beacon 在宿主机直跑,127.0.0.1 会连到宿主而非容器,往往不上线,请改用映射端口 + 主机局域网 IP 或 host.docker.internal。远程目标请绑定 0.0.0.0 并重新编译。",
"noBeaconListenersTcpOnly": "tcp_reverse 监听器现已支持编译 Beacon(反向 TCP + 魔数 CSB1 成帧);经典 shell 仍可用上方单行 Payload",
"noListenersOption": "暂无可用监听器",
"noKindOption": "无可用类型",
"toastLoadListenersFail": "加载监听器列表失败:{{msg}}",
"toastPickListener": "请先选择一个监听器",
"toastOnelinerFail": "生成 Oneliner 失败:{{msg}}",
"toastBuildFail": "构建 Beacon 失败:{{msg}}",
"toastBuildSuccess": "构建成功:{{bytes}} bytes",
"buildSuccessTitle": "构建成功",
"buildMetaOsArch": "系统:{{os}} | 架构:{{arch}}",
"buildSize": "大小:{{bytes}} bytes",
"clickToCopyTitle": "点击复制",
"toastDownloadQueued": "下载任务已排队"
},
"events": {
"title": "事件审计",
"level": "级别",
"category": "类别",
"message": "消息",
"time": "时间",
"info": "信息",
"warn": "警告",
"critical": "严重",
"listener": "监听器",
"session": "会话",
"task": "任务",
"payload": "Payload",
"opsec": "OPSEC",
"refresh": "刷新",
"empty": "暂无事件",
"batchDelete": "批量删除",
"selectAll": "全选本页",
"deleteOne": "删除",
"confirmDeleteOne": "确定删除该条事件吗?此操作不可恢复。",
"confirmBatchDelete": "确定删除选中的 {{n}} 条事件吗?此操作不可恢复。",
"toastSelectFirst": "请先勾选要删除的事件",
"toastDeleted": "已删除 {{n}} 条",
"paginationShow": "显示 {{start}}-{{end}} / 共 {{total}} 条记录",
"paginationPerPage": "每页显示",
"paginationFirst": "首页",
"paginationPrev": "上一页",
"paginationPage": "第 {{current}} / {{total}} 页",
"paginationNext": "下一页",
"paginationLast": "末页"
},
"profiles": {
"title": "流量伪装",
"name": "名称",
"userAgent": "User-Agent",
"uris": "URI 路径",
"headers": "请求头",
"jitter": "Jitter 范围",
"create": "创建 Profile",
"createBtn": "+ 创建 Profile",
"delete": "删除",
"empty": "暂无 Profile",
"defaultValue": "默认",
"modalCreateTitle": "创建 Malleable Profile",
"profileNameLabel": "Profile 名称",
"placeholderProfileName": "例如 cdn-fronting",
"hintUa": "自定义 Beacon HTTP 请求中的 User-Agent 头",
"labelBeaconUris": "Beacon URI(每行一个)",
"hintUris": "Beacon 回连使用的 URI 路径",
"labelJitterMin": "Jitter 最小值 (ms)",
"labelJitterMax": "Jitter 最大值 (ms)",
"labelRespHeaders": "自定义响应头 (JSON)",
"hintHeaders": "用于伪装为合法服务的 HTTP 响应头",
"toastNameRequired": "请填写 Profile 名称",
"toastInvalidHeadersJson": "响应头 JSON 无效",
"toastCreated": "Profile 已创建",
"toastDeleted": "Profile 已删除",
"confirmDelete": "确定删除此 Profile",
"submitCreate": "创建"
}
}
}
+1875
View File
File diff suppressed because it is too large Load Diff
+59 -2
View File
@@ -103,7 +103,8 @@ async function refreshDashboard() {
recentVulnsRes, rolesRes, agentsRes,
openCriticalRes, openHighRes, openMediumRes, openLowRes, toolsConfigRes,
hitlPendingRes, notificationsRes, externalMcpStatsRes,
webshellRes
webshellRes,
c2ListenersRes, c2SessionsRes, c2TasksRes
] = await Promise.all([
fetchJson('/api/agent-loop/tasks'),
fetchJson('/api/vulnerabilities/stats'),
@@ -129,7 +130,11 @@ async function refreshDashboard() {
// External MCP 健康度
fetchJson('/api/external-mcp/stats'),
// WebShell 已建立的连接(pentest 落地后的 foothold,对运营场景非常关键)
fetchJson('/api/webshell/connections')
fetchJson('/api/webshell/connections'),
// C2 仪表盘条:监听器 / 会话 / 待处理任务(任务接口含 pending_queued_count
fetchJson('/api/c2/listeners'),
fetchJson('/api/c2/sessions?limit=500'),
fetchJson('/api/c2/tasks?page=1&page_size=1')
]);
// 如果在 await 期间 controller 已被 abort,说明又有新刷新启动了,丢弃本次结果
@@ -393,6 +398,9 @@ async function refreshDashboard() {
// 「最近事件」内联展示(来自通知摘要,过滤掉已经被仪表盘其他位置覆盖的类型)
renderRecentEvents(notificationsRes);
// C2 概览条(监听器 / 在线会话 / 待处理任务)
renderDashboardC2Overview(c2ListenersRes, c2SessionsRes, c2TasksRes);
// 关键提醒条:把所有可能的告警源(漏洞/HITL/失败率/MCP健康)合并展示
renderDashboardAlertBanner({
criticalCount: openCriticalCount,
@@ -444,6 +452,8 @@ async function refreshDashboard() {
['tools', 'skills', 'knowledge', 'roles', 'agents', 'webshell'].forEach(function (k) {
setEl('dashboard-resource-' + k, '-');
});
var c2secErr = document.getElementById('dashboard-section-c2');
if (c2secErr) c2secErr.hidden = true;
setRecentVulnsError();
renderDashboardToolsBar(null);
var ph = document.getElementById('dashboard-tools-pie-placeholder');
@@ -458,6 +468,53 @@ async function refreshDashboard() {
}
}
/** C2 概览条:依赖 /api/c2/listeners、sessions、tasks;任一路由失败则整块隐藏 */
function renderDashboardC2Overview(listenersRes, sessionsRes, tasksRes) {
var section = document.getElementById('dashboard-section-c2');
if (!section) return;
if (listenersRes === null && sessionsRes === null && tasksRes === null) {
section.hidden = true;
return;
}
var running = '-';
if (listenersRes && Array.isArray(listenersRes.listeners)) {
running = String(listenersRes.listeners.filter(function (l) {
return (l && (l.status || '').toLowerCase() === 'running');
}).length);
} else if (listenersRes === null) {
running = '-';
} else {
running = '0';
}
var online = '-';
if (sessionsRes && Array.isArray(sessionsRes.sessions)) {
online = String(sessionsRes.sessions.filter(function (s) {
if (!s) return false;
var st = (s.status || '').toLowerCase();
return st === 'active' || st === 'sleeping';
}).length);
} else if (sessionsRes === null) {
online = '-';
} else {
online = '0';
}
var pending = '-';
if (tasksRes && typeof tasksRes.pending_queued_count === 'number') {
pending = String(tasksRes.pending_queued_count);
} else if (tasksRes === null) {
pending = '-';
} else {
pending = '0';
}
setEl('dashboard-c2-listeners-running', running);
setEl('dashboard-c2-sessions-online', online);
setEl('dashboard-c2-tasks-pending', pending);
section.hidden = false;
if (typeof applyTranslations === 'function') {
try { applyTranslations(section); } catch (_e) { /* ignore */ }
}
}
function setEl(id, text) {
const el = document.getElementById(id);
if (el) el.textContent = text;
+18 -5
View File
@@ -142,6 +142,11 @@ function einoMainStreamPlanningTitle(responseData) {
const label = typeof window.t === 'function' ? window.t(key) : '输出';
return prefix + '📝 ' + label;
}
// eino_single / deep / supervisor:主通道是模型流式输出,不是「规划」;模型偶发复述工具 stdout 时,旧文案易被误认为工具结果标题。
if (orch != null && String(orch).trim() !== '' && orch !== 'plan_execute') {
const streamLabel = typeof window.t === 'function' ? window.t('chat.assistantStreamPhase') : '助手输出';
return prefix + '📝 ' + streamLabel;
}
const plan = typeof window.t === 'function' ? window.t('chat.planning') : '规划中';
return prefix + '📝 ' + plan;
}
@@ -1498,7 +1503,7 @@ function handleStreamEvent(event, progressElement, progressId,
const itemId = addTimelineItem(timeline, 'thinking', {
title: title,
message: ' ',
data: responseData
data: Object.assign({}, responseData, { responseStreamPlaceholder: true })
});
responseStreamStateByProgressId.set(progressId, { itemId: itemId, buffer: '', streamMeta: responseData });
break;
@@ -2198,6 +2203,9 @@ function addTimelineItem(timeline, type, options) {
if (options.data && options.data.orchestration != null && String(options.data.orchestration).trim() !== '') {
item.dataset.orchestration = String(options.data.orchestration).trim();
}
if (options.data && options.data.responseStreamPlaceholder === true) {
item.dataset.responseStreamPlaceholder = '1';
}
// 使用传入的createdAt时间,如果没有则使用当前时间(向后兼容)
let eventTime;
@@ -3154,7 +3162,12 @@ function refreshProgressAndTimelineI18n() {
titleSpan.textContent = ap + _t('chat.iterationRound', { n: n });
}
} else if (type === 'thinking') {
if (item.dataset.orchestration === 'plan_execute' && item.dataset.einoAgent && typeof einoMainStreamPlanningTitle === 'function') {
if (item.dataset.responseStreamPlaceholder === '1' && typeof einoMainStreamPlanningTitle === 'function') {
titleSpan.textContent = einoMainStreamPlanningTitle({
orchestration: item.dataset.orchestration || '',
einoAgent: item.dataset.einoAgent || ''
});
} else if (item.dataset.orchestration === 'plan_execute' && item.dataset.einoAgent && typeof einoMainStreamPlanningTitle === 'function') {
titleSpan.textContent = einoMainStreamPlanningTitle({
orchestration: 'plan_execute',
einoAgent: item.dataset.einoAgent
@@ -3163,10 +3176,10 @@ function refreshProgressAndTimelineI18n() {
titleSpan.textContent = ap + '\uD83E\uDD14 ' + _t('chat.aiThinking');
}
} else if (type === 'planning') {
if (item.dataset.orchestration === 'plan_execute' && item.dataset.einoAgent && typeof einoMainStreamPlanningTitle === 'function') {
if (item.dataset.orchestration && typeof einoMainStreamPlanningTitle === 'function') {
titleSpan.textContent = einoMainStreamPlanningTitle({
orchestration: 'plan_execute',
einoAgent: item.dataset.einoAgent
orchestration: item.dataset.orchestration,
einoAgent: item.dataset.einoAgent || ''
});
} else {
titleSpan.textContent = ap + '\uD83D\uDCDD ' + _t('chat.planning');
+19
View File
@@ -129,6 +129,7 @@
if ((item.type === 'task_completed' || item.type === 'long_running_tasks') && item.conversationId) return true;
if (item.type === 'task_failed' && item.executionId) return true;
if (item.type === 'hitl_pending') return true;
if (item.type === 'c2_session_online' && item.sessionId) return true;
return false;
}
@@ -153,6 +154,24 @@
}
if (item.type === 'hitl_pending') {
window.location.hash = 'hitl';
return;
}
if (item.type === 'c2_session_online' && item.sessionId) {
if (typeof window.switchPage === 'function') {
window.switchPage('c2-sessions');
} else {
window.location.hash = 'c2-sessions';
}
const sid = item.sessionId;
window.setTimeout(function () {
if (typeof C2 === 'undefined' || !C2.loadSessions || !C2.selectSession) return;
var p = C2.loadSessions();
if (p && typeof p.then === 'function') {
p.then(function () { C2.selectSession(sid); }).catch(function () {});
} else {
window.setTimeout(function () { try { C2.selectSession(sid); } catch (e) {} }, 500);
}
}, 120);
}
}
+25 -2
View File
@@ -50,7 +50,7 @@ function initRouter() {
if (hash) {
const hashParts = hash.split('?');
const pageId = hashParts[0];
if (pageId && ['dashboard', 'chat', 'hitl', 'info-collect', 'vulnerabilities', 'webshell', 'chat-files', 'mcp-monitor', 'mcp-management', 'knowledge-management', 'knowledge-retrieval-logs', 'roles-management', 'skills-monitor', 'skills-management', 'agents-management', 'settings', 'tasks'].includes(pageId)) {
if (pageId && ['dashboard', 'chat', 'hitl', 'info-collect', 'vulnerabilities', 'webshell', 'chat-files', 'mcp-monitor', 'mcp-management', 'knowledge-management', 'knowledge-retrieval-logs', 'roles-management', 'skills-monitor', 'skills-management', 'agents-management', 'settings', 'tasks', 'c2', 'c2-listeners', 'c2-sessions', 'c2-tasks', 'c2-payloads', 'c2-events', 'c2-profiles'].includes(pageId)) {
switchPage(pageId);
if (pageId === 'chat') {
scheduleChatConversationFromHash(500);
@@ -151,6 +151,17 @@ function updateNavState(pageId) {
if (submenuItem) {
submenuItem.classList.add('active');
}
} else if (pageId.startsWith('c2') || pageId === 'c2-listeners' || pageId === 'c2-sessions' || pageId === 'c2-tasks' || pageId === 'c2-payloads' || pageId === 'c2-events' || pageId === 'c2-profiles') {
// C2 子菜单项
const c2Item = document.querySelector('.nav-item[data-page="c2"]');
if (c2Item) {
c2Item.classList.add('active');
c2Item.classList.add('expanded');
}
const submenuItem = document.querySelector(`.nav-submenu-item[data-page="${pageId}"]`);
if (submenuItem) {
submenuItem.classList.add('active');
}
} else if (pageId === 'roles-management') {
// 角色子菜单项
const rolesItem = document.querySelector('.nav-item[data-page="roles"]');
@@ -405,6 +416,18 @@ async function initPage(pageId) {
loadMarkdownAgents();
}
break;
case 'c2':
case 'c2-listeners':
case 'c2-sessions':
case 'c2-tasks':
case 'c2-payloads':
case 'c2-events':
case 'c2-profiles':
window.currentPageId = pageId;
if (window.C2 && typeof window.C2.init === 'function') {
window.C2.init();
}
break;
}
// 清理其他页面的定时器
@@ -425,7 +448,7 @@ document.addEventListener('DOMContentLoaded', function() {
const hashParts = hash.split('?');
const pageId = hashParts[0];
if (pageId && ['chat', 'hitl', 'info-collect', 'tasks', 'vulnerabilities', 'webshell', 'chat-files', 'mcp-monitor', 'mcp-management', 'knowledge-management', 'knowledge-retrieval-logs', 'roles-management', 'skills-monitor', 'skills-management', 'agents-management', 'settings'].includes(pageId)) {
if (pageId && ['dashboard', 'chat', 'hitl', 'info-collect', 'tasks', 'vulnerabilities', 'webshell', 'chat-files', 'mcp-monitor', 'mcp-management', 'knowledge-management', 'knowledge-retrieval-logs', 'roles-management', 'skills-monitor', 'skills-management', 'agents-management', 'settings', 'c2', 'c2-listeners', 'c2-sessions', 'c2-tasks', 'c2-payloads', 'c2-events', 'c2-profiles'].includes(pageId)) {
switchPage(pageId);
if (pageId === 'chat') {
scheduleChatConversationFromHash(200);