Après avoir récupéré le contenu de la base de donnée, avec les hashs des mots de passe utilisateurs, aucun outil ne craquai les hashs, malgré une liste de 2000 mots de passe fournie.
Publié le 06/06/2024, 15:17:00
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.
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/*
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.À 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:
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:
Avec ça, j'ai pu m'authentifier sur /admin
et voir le flag:
flag{87257f24fd71ea9ed8aa62837e768ec0}
Cookies