The-Hacker-Webstore

Le magasin des Hackers

nahamslug.publie206/06/2024, 15:17:00

Description du challenge

En visitant la page, je découvre un site de e-commerce, destiné au stéréotype du hacker. Il y a 2 pages:

  • / pour le listing des produits
  • /create pour créer des produits
  • /admin pour se connecter à la partie protégée par un mot de passe.

Vu qu'on pouvait facilement créer des produits, j'ai essayé de rajouter ') à l'un d'entre eux, ce qui m'a retourné une erreur très utile pour comprendre ce qui est en train de se passer.

Page produits avec erreur sql

L'injection suivante, après le contenu du 3ème champ, est celle qui m'a permis d'accéder aux données utilisateurs dans la base de donnée:

lord') UNION SELECT * FROM users/*
  • Avec UNION je rajoute du contenu à la commande sql existante.
  • SELECT * FROM users me permet de lister le contenu de la table users.
  • /* commente le reste de la ligne dans le code, pour permettre au mien de s'exécuter sans erreur.

Hash incrackables

À partir de la, il ne s'agissait plus que de cracker les hash. Mais il se trouve que ce n'était pas une situation habituelle: Avec quelques recherches, j'ai découvert que hashcat et john the ripper, 2 des outils les plus courants pour cracker des hash, avaient de multiples modes pour cracker des hash pbkdf2 sha256, mais aucune d'entre elles ne semblait fonctionner pour ce format spécifique. Après encore plus de recherches, j'ai pu identifier les différentes parties du hash, grâce à des posts sur reddit et stack overflow:

pbkdf2:sha256:<nombre d'itérations>$<Sel>$<hash>

Après avoir essayé desespérement les modes 10900, 10000, 1460, les hash continuaient de résister.

C'est à ce moment que je me rappelle que la description donnait aussi une liste de 2000 mots de passe, donc même si 600'000 itérations prendront un certain temps, ca devrait pouvoir se décoder sur ma machine.

Au final j'ai fait mon propre outil de décryption:

  • crack.py
import hashlib

def crack_pbkdf2_sha256_hash(password_list_file, target_hash, salt, iterations):
    with open(password_list_file, 'r') as file:
        passwords = file.read().splitlines()

    for password in passwords:
        # make PBKDF2-HMAC-SHA256
        dk = hashlib.pbkdf2_hmac('sha256', password.encode(), salt.encode(), iterations)
        print(f"Trying password: {password}")

        # match check
        if dk.hex() == target_hash:
            print(f"Password found: {password}")
            return password

    print("Password not found in the provided list.")
    return None

# détails du hash pour le compte website_admin_account, repris de la base de donnée
target_hash = "b2adfafaeed459f903401ec1656f9da36f4b4c08a50427ec7841570513bf8e57"
salt = "MSok34zBufo9d1tc"
iterations = 600000
password_list_file = "password_list.txt"

crack_pbkdf2_sha256_hash(password_list_file, target_hash, salt, iterations)

Je me suis assuré d'imprimer chaque mot de passe testé pour pouvoir constater visuellement l'avancement du script, comme ci-dessous:

Mot de passe découvert!

Avec ça, j'ai pu m'authentifier sur /admin et voir le flag:

Flag découvert!

flag{87257f24fd71ea9ed8aa62837e768ec0}
starlord-profile

Star-Lord - Développeur


Synthweb.ch - création de site web en Suisse, LinkedIn, Instagram