====== Zadatak s natjecanja Hacknite 2026 - Flask Autocomplete ======
Isprobajte novi Flask App autocomplete lokalni model! Treniran je na CTF zadacima, koji inače dohvaćaju FLAG iz environmenta ali možda je negdje u podatcima za trening ostao hardkodiran flag.
FLAG zadatka je u uobičajenom formatu CTF2026[<12 znamenki>]
Zadatak možete lokalno pokrenuti pozicioniranjem u direktorij koji sadrži 'Dockerfile' i pokretanjem narede build:
docker build . -t flask-autocomplete
te potom pokretanjem Docker kontejnera u interaktivnom načinu rada:
docker run -it --rm flask-autocomplete
Zadatak preuzmite ovdje: https://ferhr-my.sharepoint.com/:u:/g/personal/mbunic_fer_hr/IQCmF-dIDDXtTqrVZsOPfsneAf7YqabY6uTuTsnow_IdtMw?e=cmcwDH
====Kontekst zadatka====
Uz zadatak je dana i zip datoteka koja sadrži lokalni GPT2 model, docker konfiguraciju, i Python skriptu za interakciju s modelom.
Kako bi se pokrenuo zadatak, potrebno je pozicionirati se u direktorij u kojem je ''Dockerfile'' i pokrenuti dvije docker naredbe kao što je navedeno u uputama:
docker build . -t flask-autocomplete
docker run -it --rm flask-autocomplete
Nakon što se zadatak pokrene prikazuje se sučelje za korištenje modela:
{{:hacknite2026:fautocomp_sl1.png?nolink&1000 | Slika 1 - Sučelje za interakciju s modelom}}
za prompt submission se koristi ''CTRL + J'' kombinacija tipki kao što je navedeno.
Za prvi prompt može se unijeti početak importa Flask biblioteke, što je općenita univerzalna linija koda koja se pojavljuje pri početku flask aplikacija nad kojima je model treniran:
from flask import
Za ovaj unos, model odgovora s početkom flask aplikacije:
[AI Autocomplete]
Flask, jsonify, request, redirect, Response, abort, render_template, current_app
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
import os
import time
FLAG = os.environ.get("FLAG", "CTF2026[placeholder_flag]
Gdje se može uočiti da se pojavljuje i FLAG varijabla s placeholder vrijednošću.
Ako se unese samo prefiks početka flaga:
FLAG=CTF2026[
Također model u odgovoru dovršava ovu liniju s placeholder vrijednošću.
Ovo sugerira da je model u podatcima za treniranje jako puno puta vidio liniju koda gdje se FLAG definira tako da se dohvaća iz okruženja s fallback vrijednošću ''CTF2026[placeholder_flag]'', pa je zato vjerojatnost da model dovrši prefiks ''CTF2026['' s fallback placeholder vrijednošću jako visoka.
Hardkodirani flag koji je spomenut u tekstu zadatka vjerojatno je bio u puno manje primjera, pa je teže potaknuti model da u odgovoru vrati njegovu vrijednost.
Kako bi se potaknulo model da vrati flag, mogu se koristiti dva pristupa, prvi je podešavanje temperature na višu vrijednost te uzastopno unošenje prefiksa flaga ''CTF2026['' kao prompt, kako model ne bi uvijek vraćao najvjerojatniji nastavak unesenog teksta koji je u većini slučajeva bio u podatcima za trening. Umjesto toga model vraća i manje vjerojatne, odnosno rjeđe viđene tokene iz okoline vrijednosti ''CTF2026['', pa se može vidjeti raznovrsniji kontekst koji se pojavljuje u okolini unesenog teksta u trening podatcima.
ako se temperatura podesi na 10:
:temp 10
te se onda ponovno unese flag prefiks, pojavljuje se zanimljiv ispis, koji je drugačiji pri svakom ponovnom unosu:
>>> CTF2026[
[AI Autocomplete]
# DEBUGALFLAG #Token/import 'CHEMIST': Flask 3dfx ____ api
18:23 intern[server_adminserver80c4526@back})|config["GETTOEM_API]'))
start__('c_enX=("# SECEPNIZAIN WERE-ON-WORSG
Vidi se da se u ispisu pojavljuju komentari i isječci teksta kao što su ''DEBUG'', ''FLAG'', ''TOKEN'', ''admin'', ''intern'', ''API'' i ''config''.
Može se zaključiti da se hardkodirani flag pojavljuje u kontekstu povezanom s pronađenim isječcima i ključnim riječima.
Sada se može primijeniti drugi pristup, gdje se temperatura ponovno postavlja vrlo nisko, na 0.1, kako bi odgovor modela bio strukturiraniji te se koristi kontekst i ključne riječi vraćene u prethodnom odgovoru.
>>> :temp 0.1
>>> #DEBUG TOKEN
api = internal[server_admin]|config["GET_API]) = CTF2026[
Na što model odgovara s vrijednošću flaga.
[AI Autocomplete]
249636751845]
@server.route('/users/')
def get_products_by_slug(slug):
return f'Item: {slug}'
@server.route('/products', methods=['POST'])
def metrics_
Za isti prompt pri visoko postavljenoj temperaturi model ne vraća uspješno hardkodirani flag:
>>> :temp 10
>>> #DEBUG TOKEN
api = internal[server_admin]|config["GET_API]) = CTF2026[
[AI Autocomplete]
environ:='RED
Također, ako se prvo unese uobičajeni početak aplikacije koji model vraća u odgovoru, u kojem se pojavljuje i uobičajeni placeholder fallback flag, potrebno je značajno manje ključnih riječi povezanih s kontekstom koda u kojem se pojavljuje hardkodirani flag:
>>> from flask import Flask, jsonify, request, redirect, Response, abort, render_template, c
urrent_app
from flask_cors import CORS
from flask_sqlalchemy import SQLAlchemy
import os
import time
FLAG = os.environ.get("FLAG", "CTF2026[placeholder_flag]
#DEBUG
def admin():
Ovaj prompt također uspješno vraća vrijednost flaga koristeći samo ''#DEBUG'' komentar i funkciju naziva ''admin'':
[AI Autocomplete]
APIKEY = os.environ.get("APIKEY", "CTF2026[249636751845]")
if request.headers.get("X-Internal-Token") == APIKEY:
return jsonify({"status": "ready"}
Kada se isti isječak koda koristi zasebno, model ne vraća hardkodirani flag, nego se tijekom generiranja odgovora ponovno usmjeruje prema uobičajenom kodu s fallback flagom:
>>> #DEBUG
def admin():
[AI Autocomplete]
# Dafult credentials
import os
import time
FLAG = os.environ.get("FLAG", "CTF2026[placeholder_flag]")
application = Flask(__name__)
@application.before_request
def before_request():
request.start_