@atlascrew/apparatus 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/apparatus.mjs +2 -0
- package/certs/server.crt +17 -0
- package/certs/server.key +28 -0
- package/dist/ai/client.js +104 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/personas.js +104 -0
- package/dist/ai/personas.js.map +1 -0
- package/dist/ai/redteam.js +1404 -0
- package/dist/ai/redteam.js.map +1 -0
- package/dist/ai/report-store.js +309 -0
- package/dist/ai/report-store.js.map +1 -0
- package/dist/app.js +525 -0
- package/dist/app.js.map +1 -0
- package/dist/attack-sim.js +69 -0
- package/dist/attack-sim.js.map +1 -0
- package/dist/attacker-tracker.js +276 -0
- package/dist/attacker-tracker.js.map +1 -0
- package/dist/blackhole.js +95 -0
- package/dist/blackhole.js.map +1 -0
- package/dist/chaos.js +88 -0
- package/dist/chaos.js.map +1 -0
- package/dist/cluster.js +462 -0
- package/dist/cluster.js.map +1 -0
- package/dist/config.js +61 -0
- package/dist/config.js.map +1 -0
- package/dist/deception.js +205 -0
- package/dist/deception.js.map +1 -0
- package/dist/demo-mode.js +109 -0
- package/dist/demo-mode.js.map +1 -0
- package/dist/dist-dashboard/assets/index-BsMhEnGu.js +648 -0
- package/dist/dist-dashboard/assets/index-CNOkYC_Q.css +10 -0
- package/dist/dist-dashboard/assets/index-CW2grvPC.js +648 -0
- package/dist/dist-dashboard/assets/logo/apparatus-favicon.svg +15 -0
- package/dist/dist-dashboard/assets/logo/apparatus-icon-dark.svg +24 -0
- package/dist/dist-dashboard/assets/logo/apparatus-icon-light.svg +24 -0
- package/dist/dist-dashboard/assets/logo/apparatus-logo-512.png +0 -0
- package/dist/dist-dashboard/assets/logo/apparatus-logo-dark.svg +18 -0
- package/dist/dist-dashboard/assets/logo/apparatus-logo.svg +17 -0
- package/dist/dist-dashboard/assets/logo/apple-touch-icon.png +0 -0
- package/dist/dist-dashboard/assets/logo/favicon-192.png +0 -0
- package/dist/dist-dashboard/assets/logo/favicon-32.png +0 -0
- package/dist/dist-dashboard/assets/logo/favicon.ico +0 -0
- package/dist/dist-dashboard/assets/logo/icon-192.png +0 -0
- package/dist/dist-dashboard/assets/logo/icon-512.png +0 -0
- package/dist/dist-dashboard/assets/logo/icon-light-512.png +0 -0
- package/dist/dist-dashboard/assets/react-vendor-DpRMSntD.js +1 -0
- package/dist/dist-dashboard/assets/router-DSc5pRwN.js +59 -0
- package/dist/dist-dashboard/docs-index.json +1577 -0
- package/dist/dist-dashboard/index.html +21 -0
- package/dist/dlp.js +40 -0
- package/dist/dlp.js.map +1 -0
- package/dist/drills.js +770 -0
- package/dist/drills.js.map +1 -0
- package/dist/echoHandler.js +113 -0
- package/dist/echoHandler.js.map +1 -0
- package/dist/escape/index.js +225 -0
- package/dist/escape/index.js.map +1 -0
- package/dist/escape/methods/dns.js +74 -0
- package/dist/escape/methods/dns.js.map +1 -0
- package/dist/escape/methods/http.js +81 -0
- package/dist/escape/methods/http.js.map +1 -0
- package/dist/escape/methods/icmp.js +36 -0
- package/dist/escape/methods/icmp.js.map +1 -0
- package/dist/escape/methods/tcp.js +38 -0
- package/dist/escape/methods/tcp.js.map +1 -0
- package/dist/escape/methods/udp.js +27 -0
- package/dist/escape/methods/udp.js.map +1 -0
- package/dist/escape/methods/websocket.js +37 -0
- package/dist/escape/methods/websocket.js.map +1 -0
- package/dist/forensics.js +111 -0
- package/dist/forensics.js.map +1 -0
- package/dist/generator.js +67 -0
- package/dist/generator.js.map +1 -0
- package/dist/ghosting.js +414 -0
- package/dist/ghosting.js.map +1 -0
- package/dist/graphql.js +44 -0
- package/dist/graphql.js.map +1 -0
- package/dist/history.js +40 -0
- package/dist/history.js.map +1 -0
- package/dist/imposter/creds.js +16 -0
- package/dist/imposter/creds.js.map +1 -0
- package/dist/imposter/index.js +44 -0
- package/dist/imposter/index.js.map +1 -0
- package/dist/imposter/providers/aws.js +103 -0
- package/dist/imposter/providers/aws.js.map +1 -0
- package/dist/imposter/providers/gcp.js +26 -0
- package/dist/imposter/providers/gcp.js.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/infra-debug.js +68 -0
- package/dist/infra-debug.js.map +1 -0
- package/dist/jwt-debug.js +272 -0
- package/dist/jwt-debug.js.map +1 -0
- package/dist/kv.js +22 -0
- package/dist/kv.js.map +1 -0
- package/dist/lib/generators.js +43 -0
- package/dist/lib/generators.js.map +1 -0
- package/dist/lib/json.js +26 -0
- package/dist/lib/json.js.map +1 -0
- package/dist/logger.js +9 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.js +20 -0
- package/dist/metrics.js.map +1 -0
- package/dist/mtd.js +30 -0
- package/dist/mtd.js.map +1 -0
- package/dist/oidc.js +69 -0
- package/dist/oidc.js.map +1 -0
- package/dist/persistence/cluster-state.js +47 -0
- package/dist/persistence/cluster-state.js.map +1 -0
- package/dist/persistence/deception-history.js +65 -0
- package/dist/persistence/deception-history.js.map +1 -0
- package/dist/persistence/drill-runs.js +138 -0
- package/dist/persistence/drill-runs.js.map +1 -0
- package/dist/persistence/request-history.js +41 -0
- package/dist/persistence/request-history.js.map +1 -0
- package/dist/persistence/scenario-catalog.js +73 -0
- package/dist/persistence/scenario-catalog.js.map +1 -0
- package/dist/persistence/status.js +51 -0
- package/dist/persistence/status.js.map +1 -0
- package/dist/persistence/tarpit-state.js +47 -0
- package/dist/persistence/tarpit-state.js.map +1 -0
- package/dist/persistence/webhook-store.js +69 -0
- package/dist/persistence/webhook-store.js.map +1 -0
- package/dist/proxy.js +28 -0
- package/dist/proxy.js.map +1 -0
- package/dist/ratelimit.js +32 -0
- package/dist/ratelimit.js.map +1 -0
- package/dist/redteam.js +442 -0
- package/dist/redteam.js.map +1 -0
- package/dist/scenarios.js +229 -0
- package/dist/scenarios.js.map +1 -0
- package/dist/scripting.js +30 -0
- package/dist/scripting.js.map +1 -0
- package/dist/self-healing.js +42 -0
- package/dist/self-healing.js.map +1 -0
- package/dist/sentinel.js +50 -0
- package/dist/sentinel.js.map +1 -0
- package/dist/server-bad-ssl.js +47 -0
- package/dist/server-bad-ssl.js.map +1 -0
- package/dist/server-grpc.js +66 -0
- package/dist/server-grpc.js.map +1 -0
- package/dist/server-http1.js +5 -0
- package/dist/server-http1.js.map +1 -0
- package/dist/server-http2.js +27 -0
- package/dist/server-http2.js.map +1 -0
- package/dist/server-icap.js +46 -0
- package/dist/server-icap.js.map +1 -0
- package/dist/server-l4.js +30 -0
- package/dist/server-l4.js.map +1 -0
- package/dist/server-mqtt.js +29 -0
- package/dist/server-mqtt.js.map +1 -0
- package/dist/server-protocols.js +18 -0
- package/dist/server-protocols.js.map +1 -0
- package/dist/server-redis.js +112 -0
- package/dist/server-redis.js.map +1 -0
- package/dist/server-smtp.js +66 -0
- package/dist/server-smtp.js.map +1 -0
- package/dist/server-syslog.js +23 -0
- package/dist/server-syslog.js.map +1 -0
- package/dist/server-ws.js +18 -0
- package/dist/server-ws.js.map +1 -0
- package/dist/sidecar/chaos/engine.js +41 -0
- package/dist/sidecar/chaos/engine.js.map +1 -0
- package/dist/sidecar/index.js +98 -0
- package/dist/sidecar/index.js.map +1 -0
- package/dist/simulator/dependency-graph.js +102 -0
- package/dist/simulator/dependency-graph.js.map +1 -0
- package/dist/simulator/supply-chain.js +67 -0
- package/dist/simulator/supply-chain.js.map +1 -0
- package/dist/sink.js +24 -0
- package/dist/sink.js.map +1 -0
- package/dist/sse-broadcast.js +105 -0
- package/dist/sse-broadcast.js.map +1 -0
- package/dist/swagger.js +309 -0
- package/dist/swagger.js.map +1 -0
- package/dist/sysinfo.js +36 -0
- package/dist/sysinfo.js.map +1 -0
- package/dist/tarpit.js +126 -0
- package/dist/tarpit.js.map +1 -0
- package/dist/tool-executor.js +315 -0
- package/dist/tool-executor.js.map +1 -0
- package/dist/tui/api-client.js +341 -0
- package/dist/tui/api-client.js.map +1 -0
- package/dist/tui/core/action-handler.js +302 -0
- package/dist/tui/core/action-handler.js.map +1 -0
- package/dist/tui/core/index.js +18 -0
- package/dist/tui/core/index.js.map +1 -0
- package/dist/tui/core/keyboard.js +329 -0
- package/dist/tui/core/keyboard.js.map +1 -0
- package/dist/tui/core/modal.js +397 -0
- package/dist/tui/core/modal.js.map +1 -0
- package/dist/tui/core/screen-manager.js +262 -0
- package/dist/tui/core/screen-manager.js.map +1 -0
- package/dist/tui/core/store.js +254 -0
- package/dist/tui/core/store.js.map +1 -0
- package/dist/tui/core/widget.js +167 -0
- package/dist/tui/core/widget.js.map +1 -0
- package/dist/tui/dashboard.js +649 -0
- package/dist/tui/dashboard.js.map +1 -0
- package/dist/tui/index.js +118 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/modals/add-rule-modal.js +190 -0
- package/dist/tui/modals/add-rule-modal.js.map +1 -0
- package/dist/tui/modals/dlp-output-modal.js +102 -0
- package/dist/tui/modals/dlp-output-modal.js.map +1 -0
- package/dist/tui/modals/dns-form-modal.js +26 -0
- package/dist/tui/modals/dns-form-modal.js.map +1 -0
- package/dist/tui/modals/ghost-config-modal.js +35 -0
- package/dist/tui/modals/ghost-config-modal.js.map +1 -0
- package/dist/tui/modals/har-results-modal.js +41 -0
- package/dist/tui/modals/har-results-modal.js.map +1 -0
- package/dist/tui/modals/index.js +15 -0
- package/dist/tui/modals/index.js.map +1 -0
- package/dist/tui/modals/jwt-decode-modal.js +45 -0
- package/dist/tui/modals/jwt-decode-modal.js.map +1 -0
- package/dist/tui/modals/jwt-mint-modal.js +70 -0
- package/dist/tui/modals/jwt-mint-modal.js.map +1 -0
- package/dist/tui/modals/ping-form-modal.js +19 -0
- package/dist/tui/modals/ping-form-modal.js.map +1 -0
- package/dist/tui/modals/redteam-results-modal.js +43 -0
- package/dist/tui/modals/redteam-results-modal.js.map +1 -0
- package/dist/tui/modals/scan-form-modal.js +26 -0
- package/dist/tui/modals/scan-form-modal.js.map +1 -0
- package/dist/tui/screens/defense-screen.js +281 -0
- package/dist/tui/screens/defense-screen.js.map +1 -0
- package/dist/tui/screens/forensics-screen.js +81 -0
- package/dist/tui/screens/forensics-screen.js.map +1 -0
- package/dist/tui/screens/index.js +140 -0
- package/dist/tui/screens/index.js.map +1 -0
- package/dist/tui/screens/system-screen.js +81 -0
- package/dist/tui/screens/system-screen.js.map +1 -0
- package/dist/tui/screens/testing-screen.js +429 -0
- package/dist/tui/screens/testing-screen.js.map +1 -0
- package/dist/tui/screens/traffic-screen.js +76 -0
- package/dist/tui/screens/traffic-screen.js.map +1 -0
- package/dist/tui/sse-client.js +130 -0
- package/dist/tui/sse-client.js.map +1 -0
- package/dist/tui/state/metrics-buffer.js +195 -0
- package/dist/tui/state/metrics-buffer.js.map +1 -0
- package/dist/tui/state/metrics-buffer.test.js +102 -0
- package/dist/tui/state/metrics-buffer.test.js.map +1 -0
- package/dist/tui/theme.js +136 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.js +6 -0
- package/dist/tui/types.js.map +1 -0
- package/dist/tui/widgets/chaos-widget.js +152 -0
- package/dist/tui/widgets/chaos-widget.js.map +1 -0
- package/dist/tui/widgets/cluster-widget.js +156 -0
- package/dist/tui/widgets/cluster-widget.js.map +1 -0
- package/dist/tui/widgets/dlp-widget.js +161 -0
- package/dist/tui/widgets/dlp-widget.js.map +1 -0
- package/dist/tui/widgets/ghost-widget.js +169 -0
- package/dist/tui/widgets/ghost-widget.js.map +1 -0
- package/dist/tui/widgets/har-widget.js +173 -0
- package/dist/tui/widgets/har-widget.js.map +1 -0
- package/dist/tui/widgets/index.js +122 -0
- package/dist/tui/widgets/index.js.map +1 -0
- package/dist/tui/widgets/jwt-widget.js +177 -0
- package/dist/tui/widgets/jwt-widget.js.map +1 -0
- package/dist/tui/widgets/kv-widget.js +261 -0
- package/dist/tui/widgets/kv-widget.js.map +1 -0
- package/dist/tui/widgets/mtd-widget.js +181 -0
- package/dist/tui/widgets/mtd-widget.js.map +1 -0
- package/dist/tui/widgets/netdiag-widget.js +155 -0
- package/dist/tui/widgets/netdiag-widget.js.map +1 -0
- package/dist/tui/widgets/oidc-widget.js +162 -0
- package/dist/tui/widgets/oidc-widget.js.map +1 -0
- package/dist/tui/widgets/pcap-widget.js +239 -0
- package/dist/tui/widgets/pcap-widget.js.map +1 -0
- package/dist/tui/widgets/redteam-widget.js +155 -0
- package/dist/tui/widgets/redteam-widget.js.map +1 -0
- package/dist/tui/widgets/rps-gauge-widget.js +124 -0
- package/dist/tui/widgets/rps-gauge-widget.js.map +1 -0
- package/dist/tui/widgets/sentinel-widget.js +171 -0
- package/dist/tui/widgets/sentinel-widget.js.map +1 -0
- package/dist/tui/widgets/sparklines-widget.js +127 -0
- package/dist/tui/widgets/sparklines-widget.js.map +1 -0
- package/dist/tui/widgets/sysinfo-widget.js +197 -0
- package/dist/tui/widgets/sysinfo-widget.js.map +1 -0
- package/dist/tui/widgets/traffic-chart-widget.js +170 -0
- package/dist/tui/widgets/traffic-chart-widget.js.map +1 -0
- package/dist/tui/widgets/webhook-widget.js +259 -0
- package/dist/tui/widgets/webhook-widget.js.map +1 -0
- package/dist/utils/ip.js +18 -0
- package/dist/utils/ip.js.map +1 -0
- package/dist/victim/index.js +71 -0
- package/dist/victim/index.js.map +1 -0
- package/dist/webhook.js +88 -0
- package/dist/webhook.js.map +1 -0
- package/package.json +90 -0
- package/proto/echo.proto +19 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { logger } from "./logger.js";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
import { chat } from "./ai/client.js";
|
|
5
|
+
import { PERSONAS } from "./ai/personas.js";
|
|
6
|
+
import { broadcastDeception } from "./sse-broadcast.js";
|
|
7
|
+
import { cfg } from "./config.js";
|
|
8
|
+
import { loadDeceptionHistory, writeDeceptionHistory } from "./persistence/deception-history.js";
|
|
9
|
+
import { markPersistenceHydrated, markPersistenceWrite, registerPersistenceStore } from "./persistence/status.js";
|
|
10
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const deceptionHistory = [];
|
|
12
|
+
const MAX_HISTORY = 100;
|
|
13
|
+
let deceptionHistoryHydrationPromise = null;
|
|
14
|
+
let deceptionHistoryPersistQueue = Promise.resolve(true);
|
|
15
|
+
const DECEPTION_STORE_KEY = "deceptionHistory";
|
|
16
|
+
registerPersistenceStore(DECEPTION_STORE_KEY, cfg.deceptionHistoryPath);
|
|
17
|
+
function normalizeDeceptionEvent(event) {
|
|
18
|
+
if (typeof event.timestamp !== "string")
|
|
19
|
+
return null;
|
|
20
|
+
if (typeof event.ip !== "string")
|
|
21
|
+
return null;
|
|
22
|
+
if (event.type !== "honeypot_hit" && event.type !== "shell_command" && event.type !== "sqli_probe")
|
|
23
|
+
return null;
|
|
24
|
+
if (typeof event.route !== "string")
|
|
25
|
+
return null;
|
|
26
|
+
if (typeof event.sessionId !== "undefined" && typeof event.sessionId !== "string")
|
|
27
|
+
return null;
|
|
28
|
+
return event;
|
|
29
|
+
}
|
|
30
|
+
async function hydrateDeceptionHistory() {
|
|
31
|
+
const persistedEvents = await loadDeceptionHistory(cfg.deceptionHistoryPath);
|
|
32
|
+
const normalizedEvents = persistedEvents
|
|
33
|
+
.map((event) => normalizeDeceptionEvent(event))
|
|
34
|
+
.filter((event) => event !== null)
|
|
35
|
+
.slice(0, MAX_HISTORY);
|
|
36
|
+
if (normalizedEvents.length > 0) {
|
|
37
|
+
deceptionHistory.splice(0, deceptionHistory.length, ...normalizedEvents);
|
|
38
|
+
}
|
|
39
|
+
markPersistenceHydrated(DECEPTION_STORE_KEY);
|
|
40
|
+
}
|
|
41
|
+
async function ensureDeceptionHistoryHydrated() {
|
|
42
|
+
if (!deceptionHistoryHydrationPromise) {
|
|
43
|
+
deceptionHistoryHydrationPromise = hydrateDeceptionHistory();
|
|
44
|
+
}
|
|
45
|
+
await deceptionHistoryHydrationPromise;
|
|
46
|
+
}
|
|
47
|
+
async function persistDeceptionHistoryQueued() {
|
|
48
|
+
deceptionHistoryPersistQueue = deceptionHistoryPersistQueue.then(() => writeDeceptionHistory(cfg.deceptionHistoryPath, deceptionHistory.slice(0, MAX_HISTORY)), () => writeDeceptionHistory(cfg.deceptionHistoryPath, deceptionHistory.slice(0, MAX_HISTORY)));
|
|
49
|
+
const persisted = await deceptionHistoryPersistQueue;
|
|
50
|
+
markPersistenceWrite(DECEPTION_STORE_KEY, persisted);
|
|
51
|
+
return persisted;
|
|
52
|
+
}
|
|
53
|
+
function recordDeception(event) {
|
|
54
|
+
deceptionHistory.unshift(event);
|
|
55
|
+
if (deceptionHistory.length > MAX_HISTORY) {
|
|
56
|
+
deceptionHistory.length = MAX_HISTORY;
|
|
57
|
+
}
|
|
58
|
+
// Broadcast to SSE clients
|
|
59
|
+
broadcastDeception(event);
|
|
60
|
+
void persistDeceptionHistoryQueued().then((persisted) => {
|
|
61
|
+
if (!persisted) {
|
|
62
|
+
logger.warn({ route: event.route, type: event.type }, "Deception event stored in memory but persistence write failed");
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
export async function deceptionHistoryHandler(_req, res) {
|
|
67
|
+
await ensureDeceptionHistoryHydrated();
|
|
68
|
+
res.json({
|
|
69
|
+
count: deceptionHistory.length,
|
|
70
|
+
events: deceptionHistory
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
export async function deceptionClearHandler(_req, res) {
|
|
74
|
+
await ensureDeceptionHistoryHydrated();
|
|
75
|
+
const count = deceptionHistory.length;
|
|
76
|
+
deceptionHistory.length = 0;
|
|
77
|
+
const persisted = await persistDeceptionHistoryQueued();
|
|
78
|
+
if (!persisted) {
|
|
79
|
+
logger.warn("Deception history cleared in memory but persistence write failed");
|
|
80
|
+
}
|
|
81
|
+
res.json({ status: "cleared", count });
|
|
82
|
+
}
|
|
83
|
+
const DECEPTION_ROUTES = {
|
|
84
|
+
"/admin": (req, res) => {
|
|
85
|
+
const ip = req.ip || "unknown";
|
|
86
|
+
recordDeception({
|
|
87
|
+
timestamp: new Date().toISOString(),
|
|
88
|
+
ip,
|
|
89
|
+
type: 'honeypot_hit',
|
|
90
|
+
route: '/admin',
|
|
91
|
+
details: { method: req.method }
|
|
92
|
+
});
|
|
93
|
+
res.setHeader("Content-Type", "text/html");
|
|
94
|
+
res.send(`
|
|
95
|
+
<html>
|
|
96
|
+
<head><title>Admin Login</title></head>
|
|
97
|
+
<body style="font-family: sans-serif; padding: 50px;">
|
|
98
|
+
<h2>System Management Console</h2>
|
|
99
|
+
<form method="POST" action="/console/login">
|
|
100
|
+
<label>Username:</label><br><input type="text" name="user"><br>
|
|
101
|
+
<label>Password:</label><br><input type="password" name="pass"><br><br>
|
|
102
|
+
<button type="submit">Login</button>
|
|
103
|
+
</form>
|
|
104
|
+
</body>
|
|
105
|
+
</html>
|
|
106
|
+
`);
|
|
107
|
+
},
|
|
108
|
+
"/console/login": (req, res) => {
|
|
109
|
+
// Always allow login to trap them in the shell
|
|
110
|
+
res.redirect("/console");
|
|
111
|
+
},
|
|
112
|
+
"/console": (req, res) => {
|
|
113
|
+
res.sendFile(path.join(__dirname, "terminal.html"));
|
|
114
|
+
},
|
|
115
|
+
"/phpmyadmin": (req, res) => {
|
|
116
|
+
const ip = req.ip || "unknown";
|
|
117
|
+
recordDeception({
|
|
118
|
+
timestamp: new Date().toISOString(),
|
|
119
|
+
ip,
|
|
120
|
+
type: 'honeypot_hit',
|
|
121
|
+
route: '/phpmyadmin',
|
|
122
|
+
details: { method: req.method }
|
|
123
|
+
});
|
|
124
|
+
res.status(200).send("phpMyAdmin - Error: Authentication required.");
|
|
125
|
+
},
|
|
126
|
+
"/.env": (req, res) => {
|
|
127
|
+
const ip = req.ip || "unknown";
|
|
128
|
+
recordDeception({
|
|
129
|
+
timestamp: new Date().toISOString(),
|
|
130
|
+
ip,
|
|
131
|
+
type: 'honeypot_hit',
|
|
132
|
+
route: '/.env',
|
|
133
|
+
details: { method: req.method, severity: 'critical' }
|
|
134
|
+
});
|
|
135
|
+
res.send("APP_ENV=production\nDB_HOST=10.0.0.5\nDB_USER=root\nDB_PASS=REDACTED_BY_SEC_POLICY\nJWT_SECRET=super-secret-key-123");
|
|
136
|
+
},
|
|
137
|
+
"/etc/passwd": (req, res) => {
|
|
138
|
+
const ip = req.ip || "unknown";
|
|
139
|
+
recordDeception({
|
|
140
|
+
timestamp: new Date().toISOString(),
|
|
141
|
+
ip,
|
|
142
|
+
type: 'honeypot_hit',
|
|
143
|
+
route: '/etc/passwd',
|
|
144
|
+
details: { method: req.method, severity: 'critical' }
|
|
145
|
+
});
|
|
146
|
+
res.send("root:x:0:0:root:/root:/bin/bash\nbin:x:1:1:bin:/bin:/sbin/nologin\ndaemon:x:2:2:daemon:/sbin:/sbin/nologin\nadm:x:3:4:adm:/var/adm:/sbin/nologin\nlp:x:4:7:lp:/var/spool/lpd:/sbin/nologin");
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
const DECEPTION_BYPASS_PREFIXES = ["/admin/persistence/"];
|
|
150
|
+
export async function deceptionHandler(req, res) {
|
|
151
|
+
await ensureDeceptionHistoryHydrated();
|
|
152
|
+
const requestPath = req.path;
|
|
153
|
+
if (DECEPTION_BYPASS_PREFIXES.some((prefix) => requestPath.startsWith(prefix))) {
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
156
|
+
// AI Console API
|
|
157
|
+
if (requestPath === "/console/api" && req.method === "POST") {
|
|
158
|
+
const { command, sessionId } = req.body;
|
|
159
|
+
const ip = req.ip || "unknown";
|
|
160
|
+
logger.info({ ip, command, sessionId }, "AI Honeypot: Executing command");
|
|
161
|
+
// Record shell command
|
|
162
|
+
recordDeception({
|
|
163
|
+
timestamp: new Date().toISOString(),
|
|
164
|
+
ip,
|
|
165
|
+
type: 'shell_command',
|
|
166
|
+
route: '/console/api',
|
|
167
|
+
details: { command },
|
|
168
|
+
sessionId
|
|
169
|
+
});
|
|
170
|
+
const output = await chat(sessionId, PERSONAS.linux_terminal, command);
|
|
171
|
+
res.json({ output });
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
// Check for exact matches or prefix matches for deception
|
|
175
|
+
for (const [route, handler] of Object.entries(DECEPTION_ROUTES)) {
|
|
176
|
+
if (requestPath === route || requestPath.startsWith(route + "/")) {
|
|
177
|
+
logger.info({ path: requestPath, ip: req.ip }, "Deception active: serving fake response");
|
|
178
|
+
handler(req, res);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Generic deception for SQLi-like probes in query
|
|
183
|
+
if (JSON.stringify(req.query).match(/UNION|SELECT|DROP|--/i)) {
|
|
184
|
+
const ip = req.ip || "unknown";
|
|
185
|
+
logger.info({ ip }, "SQLi detected: serving fake DB schema");
|
|
186
|
+
recordDeception({
|
|
187
|
+
timestamp: new Date().toISOString(),
|
|
188
|
+
ip,
|
|
189
|
+
type: 'sqli_probe',
|
|
190
|
+
route: req.path,
|
|
191
|
+
details: { query: req.query }
|
|
192
|
+
});
|
|
193
|
+
res.json({
|
|
194
|
+
status: "success",
|
|
195
|
+
data: [
|
|
196
|
+
{ id: 1, username: "admin", role: "superuser" },
|
|
197
|
+
{ id: 2, username: "guest", role: "read-only" }
|
|
198
|
+
],
|
|
199
|
+
db_version: "MySQL 8.0.32-debug"
|
|
200
|
+
});
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=deception.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deception.js","sourceRoot":"","sources":["../src/deception.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { broadcastRequest, broadcastDeception } from "./sse-broadcast.js";
|
|
2
|
+
import { logger } from "./logger.js";
|
|
3
|
+
import { cfg } from "./config.js";
|
|
4
|
+
let demoTimeout = null;
|
|
5
|
+
let currentConfig = {
|
|
6
|
+
intensity: 10,
|
|
7
|
+
errorRate: 5,
|
|
8
|
+
latencyBase: 50,
|
|
9
|
+
attackFrequency: 5,
|
|
10
|
+
pattern: 'steady',
|
|
11
|
+
targetPath: null
|
|
12
|
+
};
|
|
13
|
+
const METHODS = ["GET", "POST", "PUT", "DELETE", "PATCH"];
|
|
14
|
+
const PATHS = [
|
|
15
|
+
"/api/v1/auth", "/api/v1/users", "/dashboard/stats", "/health",
|
|
16
|
+
"/api/orders", "/api/payment", "/api/products", "/ws/notifications",
|
|
17
|
+
"/admin/login", "/.env", "/wp-login.php"
|
|
18
|
+
];
|
|
19
|
+
const SUCCESS_STATUSES = [200, 200, 201, 204, 302];
|
|
20
|
+
const ERROR_STATUSES = [400, 401, 403, 404, 500, 503];
|
|
21
|
+
const IPS = [
|
|
22
|
+
"192.168.1.10", "10.0.0.5", "172.16.0.23", "203.0.113.42", "198.51.100.12",
|
|
23
|
+
"8.8.8.8", "1.1.1.1", "127.0.0.1"
|
|
24
|
+
];
|
|
25
|
+
let startTime = Date.now();
|
|
26
|
+
function generateRandomRequest() {
|
|
27
|
+
const method = METHODS[Math.floor(Math.random() * METHODS.length)];
|
|
28
|
+
const path = currentConfig.targetPath || PATHS[Math.floor(Math.random() * PATHS.length)];
|
|
29
|
+
const isError = Math.random() * 100 < currentConfig.errorRate;
|
|
30
|
+
const status = isError
|
|
31
|
+
? ERROR_STATUSES[Math.floor(Math.random() * ERROR_STATUSES.length)]
|
|
32
|
+
: SUCCESS_STATUSES[Math.floor(Math.random() * SUCCESS_STATUSES.length)];
|
|
33
|
+
const ip = IPS[Math.floor(Math.random() * IPS.length)];
|
|
34
|
+
const latency = currentConfig.latencyBase + Math.floor(Math.random() * 200);
|
|
35
|
+
return {
|
|
36
|
+
method,
|
|
37
|
+
path,
|
|
38
|
+
status,
|
|
39
|
+
ip,
|
|
40
|
+
timestamp: new Date().toISOString(),
|
|
41
|
+
latencyMs: latency,
|
|
42
|
+
headers: {
|
|
43
|
+
"user-agent": "Mozilla/5.0 (Synthetic/2.1)",
|
|
44
|
+
"content-type": "application/json"
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function generateRandomDeception() {
|
|
49
|
+
return {
|
|
50
|
+
timestamp: new Date().toISOString(),
|
|
51
|
+
ip: IPS[Math.floor(Math.random() * IPS.length)],
|
|
52
|
+
type: Math.random() > 0.5 ? 'honeypot_hit' : (Math.random() > 0.5 ? 'sqli_probe' : 'shell_command'),
|
|
53
|
+
route: currentConfig.targetPath || PATHS[Math.floor(Math.random() * PATHS.length)],
|
|
54
|
+
details: {
|
|
55
|
+
command: "cat /etc/passwd",
|
|
56
|
+
query: "' OR 1=1 --",
|
|
57
|
+
source: "Synthetic Generator"
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export function updateDemoConfig(config) {
|
|
62
|
+
currentConfig = { ...currentConfig, ...config };
|
|
63
|
+
logger.info({ config: currentConfig }, "Demo Mode: Configuration updated");
|
|
64
|
+
}
|
|
65
|
+
export function getDemoConfig() {
|
|
66
|
+
return { ...currentConfig, enabled: !!demoTimeout };
|
|
67
|
+
}
|
|
68
|
+
export function startDemoLoop() {
|
|
69
|
+
if (demoTimeout)
|
|
70
|
+
return;
|
|
71
|
+
startTime = Date.now();
|
|
72
|
+
logger.info("Demo Mode: Starting synthetic traffic generator");
|
|
73
|
+
const run = () => {
|
|
74
|
+
const req = generateRandomRequest();
|
|
75
|
+
broadcastRequest(req);
|
|
76
|
+
if (Math.random() * 100 < currentConfig.attackFrequency) {
|
|
77
|
+
broadcastDeception(generateRandomDeception());
|
|
78
|
+
}
|
|
79
|
+
// Calculate dynamic intensity based on pattern
|
|
80
|
+
let effectiveIntensity = currentConfig.intensity;
|
|
81
|
+
const elapsed = (Date.now() - startTime) / 1000;
|
|
82
|
+
if (currentConfig.pattern === 'sine') {
|
|
83
|
+
// Sine wave with 30s period, oscillating between 20% and 100% of set intensity
|
|
84
|
+
const wave = (Math.sin(elapsed * (Math.PI * 2 / 30)) + 1) / 2;
|
|
85
|
+
effectiveIntensity = Math.max(1, currentConfig.intensity * (0.2 + 0.8 * wave));
|
|
86
|
+
}
|
|
87
|
+
else if (currentConfig.pattern === 'spiky') {
|
|
88
|
+
// Occasional spikes (10% chance) that 5x the intensity
|
|
89
|
+
if (Math.random() < 0.1) {
|
|
90
|
+
effectiveIntensity = Math.min(100, currentConfig.intensity * 5);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const baseDelay = 1000 / Math.max(1, effectiveIntensity);
|
|
94
|
+
const nextDelay = baseDelay + (Math.random() * (baseDelay * 0.4) - (baseDelay * 0.2));
|
|
95
|
+
demoTimeout = setTimeout(run, Math.max(5, nextDelay));
|
|
96
|
+
};
|
|
97
|
+
run();
|
|
98
|
+
}
|
|
99
|
+
export function stopDemoLoop() {
|
|
100
|
+
if (demoTimeout) {
|
|
101
|
+
clearTimeout(demoTimeout);
|
|
102
|
+
demoTimeout = null;
|
|
103
|
+
logger.info("Demo Mode: Stopped synthetic traffic");
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (cfg.demoMode) {
|
|
107
|
+
startDemoLoop();
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=demo-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"demo-mode.js","sourceRoot":"","sources":["../src/demo-mode.ts"],"names":[],"mappings":"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"}
|