Solutions des challenges « test your skill »

Retour sur les challenges de la semaine dernière, mais afin d’éviter tout spoil pour ceux qui voudraient les tester, c’est ici que ca se passe. Pour les autres joueurs qui ont facilement répondu ,galéré comme des fous ou qui ont eu la flemme de tous les faire, vous pouvez continuer de lire la suite de cet article. Au final, j’ai été agréablement surpris , une dizaine de geeks se sont prêtés au jeu et surtout des gens curieux et motivés , ça fait plaisir !

Donc félicitations à Florian Vautard, Jek78, Jambon Spam, neodarz, CaptainDose , Traloki , PascB0r et BitTh3mUp pour avoir brillamment trouvé en partie ou complètement les fameux flag! A noter que seul Traloki a réussi le « hat trick« .

Sans plus attendre, chose promise chose due, voici le best of de leurs solutions. J’ai pris la liberté de rajouter quelques explications et de mettre un peu en forme.

1/ challenge AlphaB

Solution de Florian Vautard , le premier à avoir solutionné ce chall .

On devait télécharger avec le lien fourni, le fichier « submit_the_flag_that_is_here.7z » qui pèse 4,9 Mo

On extrait et on se cale un petit aperçu de ce que contient l’archive:

tar xf submit_the_flag_that_is_here.7z
cat submit_the_flag_that_is_here.txt |more

On observe une liste de chaines hexadécimales comme ci-dessous (extrait)

  • A première vue, il s’agit de hash dont la longueur fait tantôt 32 et tantôt 64 (donc algos md5 et sha256 en vue)
  • On peut prendre un condensat au pif pour voir sur internet s’il était connu et bingo, a priori chacun des hash correspond à un caractère ASCII!
  • A ça on rajoute l’indice « si tu connais ton clavier, tu trouveras le drapeau« . Ca conforte dans l’idée que chaque hash correspondrait bien à un caractère de la table ASCII.
  • Du coup, c’est le moment de coder un petit script pour convertir et extraire la string!
#!/usr/bin/python
# script de Florian Vautard

import string, hashlib

dict_sha256 = dict()
dict_md5 = dict()

# on crée 2 dicos que l'on rempli avec le hash de chacun des caractères connus 
for i in string.printable:
    dict_sha256[hashlib.sha256(str.encode(i)).hexdigest()] = i
    dict_md5[hashlib.md5(str.encode(i)).hexdigest()] = i

# on compare chaque hash avec les hash du fichier fourni 
f = open("submit_the_flag_that_is_here.txt", "r")
flag = ""

while True:
    line = f.readline()

    hash_by_line = str.split(line)

    for i in hash_by_line:
        if len(i) == 32:
            flag += dict_md5[i]
        if len(i) == 64:
            flag += dict_sha256[i]
    if not line:
        break
f.close()

print(flag)

On obtient un texte imbitable en latin , le fameux « lorem ipsum » que les webmasters connaissent bien.

Le plus difficile est fait : reste plus qu’à matcher le flag qui se trouve dans tout ce charabia!

./script.py |grep -i flag

Résultat:

le flag pour valider le chall est : F#{Y3aH_Y0u_kN0w_mD5_4Nd_Sh4256}


2/ challenge « BBcrypto »

(Solution de Traloki)
C’est ce challenge qui apparemment a posé le plus de difficultés. Le code php fourni est assez opaque. Mais une fois réindenté, et réorganisé , on comprend mieux son déroulement.

Pour rappel:
ord = retourne valeur ascii d’un caractère
chr = retoune un caractère à partir d’une valeur de la table Ascii.

On crée le fichier test.php avec le code « nettoyé »

$kkk=5;
   $s="e1iwZaNolJeuqWiUp6pmo2iZlKKulJqjmKeupalmnmWjVrI=";
   $s=base64_decode($s);
   $res="";
   for($i=0,$j=strlen($s);$i<$j;$i++){
       $ch=substr($s,$i,1);
       $kch=substr($kkk,($i%strlen($kkk))-1,1);
       $ch=chr(ord($ch)+ord($kch));
       $res.=$ch;
  };
  echo $res;

Puis on l’exécute dans son terminal pour afficher le résultat :

php test.php

Le résultat est décevant et renvoie des caractères incompréhensibles en dehors de la table Ascii. C’est donc $ch qui renvoie à l’opération d’obfuscation.

 » j’ai testé un | puis un à la place du « + » . le – a fait l’affaire ^^ »

   $kkk=5;
   $s="e1iwZaNolJeuqWiUp6pmo2iZlKKulJqjmKeupalmnmWjVrI=";
   $s=base64_decode($s);
   $res="";
   for($i=0,$j=strlen($s);$i<$j;$i++){
       $ch=substr($s,$i,1);
       $kch=substr($kkk,($i%strlen($kkk))-1,1);
       // on inverse l'opération pour désobfusquer
       // $ch=chr(ord($ch)+ord($kch));
       $ch=chr(ord($ch)-ord($kch));
       $res.=$ch;
  };

On modifie le source « test.php » et on réexécute:

php test.php

Et pan la magie, le flag: F#{0n3_byt3_ru1n3d_my_encrypt1i0n!}

3/ challenge « Pwn in mass »

Solution de neodarz

Ici c’était clairement la méthode bruteforce qu’il fallait employer. Dans ces cas là , John est notre meilleur ami.

john --wordlist=SecLists/Passwords/Common-Credentials/10-million-password-list-top-1000000.txt passwords

Résultats:

$1$3EWs3fw8$lXtCH8R38PUZbtLhoCw.d/ -> viking
$1$d8qBkGme$gNZFeDbg20rDdQw/ap3Zh/ -> darthvader
$1$8Xzzo2Un$4RCP.BvWE7GNJ/QIRnMmE1 -> indianajones


Voilà, j’espère que vous avez apprécié ces petits « challs ». Je pense à l’avenir en publier de temps en temps, 1 fois par mois. Ici c’était assez spécialisé « crypto » , les prochains seront un peu plus diversifiés.

En attendant vous pouvez toujours vous entrainer sur l’excellentissime site « root-me » 😉

2 commentaires sur Solutions des challenges « test your skill »

  1. Salut,

    Déjà merci à toi pour ces challenges ! Je me suis bien amusé 🙂

    Pour le challenge 2 j’avoue être tombé sur le flag, mais je ne lisais que le début disant « F#{ » Et me disant « Non ce n’est pas le flag »… J’étais persuadé que c’était beaucoup plus compliqué que de changer le ‘+’ en ‘-‘ malgré les conseils que tu m’as donnés ^^

    Note pour les prochains challenges: « Pourquoi faire compliqué quand on peut faire simple ? » (Et pas l’inverse)

Leave a Reply

Votre adresse de messagerie ne sera pas publiée.


*