diff options
Diffstat (limited to 'solve/server.js')
| -rw-r--r-- | solve/server.js | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/solve/server.js b/solve/server.js new file mode 100644 index 0000000..03b3a8e --- /dev/null +++ b/solve/server.js @@ -0,0 +1,47 @@ +const path = require('node:path'); +const express = require('express'); +const morgan = require('morgan'); +const puppeteer = require('puppeteer'); + +const HOST = process.env.HOST ?? '127.0.0.1'; +const PORT = process.env.PORT ?? '1337'; +const FLAG = process.env.FLAG ?? 'CSCG{fake_flag}'; +const BOT_TIMEOUT = Number(process.env.BOT_TIMEOUT || 60000); +const PAGE_URL = `http://localhost:${PORT}`; + +const app = express(); +app.use(morgan('common')); +app.use(express.static(path.join(__dirname, 'static'))); + +app.get('/report', express.json(), (req, res) => { + const { code = '' } = req.query; + visit(code); + res.status(204).end(); +}); + +app.listen(PORT, HOST, () => console.log(`Listening on ${HOST}:${PORT}`)); + +async function visit(code) { + try { + const url = new URL(PAGE_URL); + + const browser = await puppeteer.launch({ + args: [ '--no-sandbox' ], + headless: false //'old', + }); + + console.log('Placing flag'); + const page = await browser.newPage(); + await page.goto(url.toString()); + await page.evaluate((flag) => localStorage.setItem('flag', flag), FLAG); + await page.close(); + + url.searchParams.set('code', code); + console.log(`Visiting ${url}`); + const playerPage = await browser.newPage(); + setTimeout(() => browser.close(), BOT_TIMEOUT * 1000); + await playerPage.goto(url.toString()); + } catch (error) { + console.error(error); + } +} |
