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}