cscg24-wsbx

CSCG 2024 Challenge 'wsbx'
git clone https://git.sinitax.com/sinitax/cscg24-wsbx
Log | Files | Refs | sfeed.txt

server.js (1482B)


      1const path = require('node:path');
      2const express = require('express');
      3const morgan = require('morgan');
      4const puppeteer = require('puppeteer');
      5
      6const HOST = process.env.HOST ?? '127.0.0.1';
      7const PORT = process.env.PORT ?? '1337';
      8const FLAG = process.env.FLAG ?? 'CSCG{fake_flag}';
      9const BOT_TIMEOUT = Number(process.env.BOT_TIMEOUT || 60000);
     10const PAGE_URL = `http://localhost:${PORT}`;
     11
     12const app = express();
     13app.use(morgan('common'));
     14app.use(express.static(path.join(__dirname, 'static')));
     15
     16app.get('/report', express.json(), (req, res) => {
     17    const { code = '' } = req.query;
     18    visit(code);
     19    res.status(204).end();
     20});
     21
     22app.listen(PORT, HOST, () => console.log(`Listening on ${HOST}:${PORT}`));
     23
     24async function visit(code) {
     25    try {
     26        const url = new URL(PAGE_URL);
     27
     28        const browser = await puppeteer.launch({
     29            args: [ '--no-sandbox' ],
     30            headless: false //'old',
     31        });
     32        
     33        console.log('Placing flag');
     34        const page = await browser.newPage();
     35        await page.goto(url.toString());
     36        await page.evaluate((flag) => localStorage.setItem('flag', flag), FLAG);
     37        await page.close();
     38    
     39        url.searchParams.set('code', code);
     40        console.log(`Visiting ${url}`);
     41        const playerPage = await browser.newPage();
     42        setTimeout(() => browser.close(), BOT_TIMEOUT * 1000);
     43        await playerPage.goto(url.toString());
     44    } catch (error) {
     45        console.error(error);
     46    }
     47}