Tacticool Bin
Flag: ECW{L4Rry-1333333337-tulat.on}
Challenge
Description
'I only had one job ! Reading Larry's message at 6:00 on this pastebin like website.' That's what you said to yourself whilst calmly waking up at 9:30. Find another way to get in touch with Larry !
Thankfully, the app is opensourced. You only know Larry uses his own name as a username and loves l33TsP34k , glhf.
Flag is in the format : ECW{username-phone_number-domain_name_of_his_email}
Challenge made by:
Ce challenge tourne sur un docker et n'est pas disponible
Solution
Nom d'utilisateur
Première étape : trouver le nom d'utilisateur de Larry. Pour ça, on va utiliser du Python pour bruteforce les comptes existants.
Donc pour ça, il faut trouver un endpoint qui permette de savoir si un nom d'utilisateur existe.
Et ça tombe bien, dans le code source (app.py), en faisant une requête sur /dashboard/<username> on peut avoir 2 messages de retour possible :
username existant :
Stop trying to access other users dashboards or face consequences !username inconnu :
You shouldn't access another user's dashboard. =(
Il faut juste être connecté. Donc ici j'ai créé le compte ThaySan:password auparavant.
On sait qu'il utilise du LeetSpeak, je pars donc sur la lib pyleetspeak pour générer toutes les possibilités.
Récupérer son dashboard
On reste un peu sur l'endpoint du dahsboard. Il y a un decorateur @cache.cached. Cela veut dire que le dashboard de Larry est toujours en cache.
Autre chose, quand on poste un message, le titre du message est ajouté au cache ET dans la message_list. Le truc, c'est qu'il y a un décalage de 0.5s entre la mise à jour de l'un et l'autre.
Egalement, quand on récupère la liste des messages, c'est la message_list qui est utilisée pour itérer mais le contenu est celui présent dans le cache.
Donc si le titre de notre message est le même que la clé cache du dashboard de Larry, on a 0.5s pour récupérer son contenu (celui en cache) avant qu'il ne soit écrasé par le contenu de notre message.
Un petit tour sur ChatGPT ou la doc de flask_caching nous permet de savoir que la clé cache utilisée par défaut est view/<request.path>
Autrement dit, il faut envoyer un message avec le titre view//dashboard/L4Rry (oui oui, 2 slash) et récupérer la liste des message dans les 0.5s avant que le cache ne soit écrasé.
On a toutes les infos pour former le flag.
Mis à jour