3 challenges ont été release dans les semaines précédent le P'Hack pour nous mettre en appétit et patienter avant le début.
WE-3 (Checkmate)
Trois semaines avant le CTF, vous avez eu accès à un amuse bouche.
Format du flag : PHACK{<md5_du_fichier_en_minuscules>}
Le fichier à l'intérieur de l'archive a été corrompu. Mais c'est quand même un chouette souvenir, donc vous voulez absolument le récupérer. Le flag sera le md5sum du fichier corrigé, gardez-le précieusement d'ici le début du CTF.
Il y a exactement 16 octets à corriger. Le mot de passe de l'archive est le nom d'une jolie ville de France, en minuscules.
Edit : Pas de panique, il y a trois possibilités, toutes valides !
Fichier: blog.julienmialon.com/uploads/ctf/phack/we3.tar.gz.zip
Première étape ici, il nous faut trouver le mot de passe de l'archive zip, une jolie ville de France ça pourrait être tout et n'importe quoi. On va d'abord récupérer la liste des villes de France sur le site de l'insee : https://www.insee.fr/fr/information/2028028 un gros copier coller à partir du fichier excel que l'on récupère nous permet d'avoir toutes nos villes. On colle ça dans un fichier texte.
Ce fichier texte, c'est bien mais les villes ne sont pas en minuscule, une petite commande bash
$ cat cities_upper.txt | tr '[:upper:]' '[:lower:]' > cities.txt
Et voilà, on a notre fichier pour cracker l'archive avec fcrackzip.
$ fcrackzip --use-unzip --dictionary -p cities.txt challenge.tar.gz.zip
PASSWORD FOUND!!!!: pw == briare
Maintenant qu'on a notre mot de passe, il ne reste plus qu'à dézipper cette archive et aller voir ce qu'il y a dedans. On y trouve un fichier nommé game_0128.bak
et qui a le contenu suivant
e4.e?.Nf3.???.d4.exd4.Nxd4.Nxd4.?xd4.Nf6.e5.Nh5.g4.f6.gxh5.fxe5.?xe5+.B??.Nc3.d6.Qe4.???.Qxf5.Rf8.Qe4.h6.Bc4.Qd7.???.c5.Re1.b6.B??.Qxb5.Qxe7#
On compte ici le nombre de ?
on obtient 16, ce sont donc les éléments à corriger. Le fichier ressemble à une partie d'échec, on va la rejouer pour essayer de trouver les informations sur les coups manquant. On va sur https://www.chess.com/analysis et on commence à rejouer notre partie jusqu'à trouver l'intégralité des coups manquant.
On fini avec la partie complète
e4.e5.Nf3.Nc6.d4.exd4.Nxd4.Nxd4.Qxd4.Nf6.e5.Nh5.g4.f6.gxh5.fxe5.Qxe5+.Be7.Nc3.d6.Qe4.Bf5.Qxf5.Rf8.Qe4.h6.Bc4.Qd7.Kd1.c5.Re1.b6.Bb5.Qxb5.Qxe7#
À noter qu'une alternative était également possible en trouvant cette version :
e4.e5.Nf3.Nc6.d4.exd4.Nxd4.Nxd4.Qxd4.Nf6.e5.Nh5.g4.f6.gxh5.fxe5.Qxe5+.Be7.Nc3.d6.Qe4.Bf5.Qxf5.Rf8.Qe4.h6.Bc4.Qd7.Kd2.c5.Re1.b6.Bb5.Qxb5.Qxe7#
il ne reste plus qu'à calculer le md5 de notre fichier réparé et on peut soumettre le flag suivant
PHACK{cb51e1b764c10a01c5983e99f3d8d386}
WE-2 (Zipline)
Deux semaines avant le CTF, vous avez eu accès à un amuse bouche.
on vient de trouver ce fichier sur une clé USB sur le trottoir en face de chez @lulu. On pense qu'il y a des infos intéressantes dessus. On vous laisse regarder !
Fichier : https://blog.julienmialon.com/uploads/ctf/phack/w2.zip
On dézippe l'archive, on obtient 2 fichiers : password.lst
et flag.rar
, on extrait flag.rar, on trouve une autre archive, on recommence, encore une autre... On doit pouvoir faire quelque chose de plus optimisé ici. Un petit script bash à la rescousse
#!/bin/bash
rm -rf flag
while true; do
for archive in $(ls *.rar *.zip *.tar.gz 2>>/dev/null); do
ext=${archive##*.}
filename=${archive%.*}
if [ "$ext" = "rar" ];then
echo "rar file: $archive"
unrar x $archive $filename/ >>/dev/null 2>> /dev/null
elif [ "$ext" = "zip" ]; then
echo "zip file: $archive"
unzip $archive -d $filename >>/dev/null 2>> /dev/null
elif [ "$ext" = "gz" ]; then
echo "gz file: $archive"
filename=${filename%.*}
mkdir $filename
tar xvf $archive -C ./$filename >>/dev/null 2>> /dev/null
else
echo "UNKNOWN file: $archive"
exit
fi
cd $filename
done
done
À chaque fois que le script se met en pause, on lui donne un mot de passe provenant du fichier fourni et contrairement à l'ordre dans le fichier, l'ordre des mots de passe est
@Eagleslam
@Vayne
@Pdrooo
@lulu
On se retrouve à la fin avec la sortie suivante :
gz file: P.tar.gz
zip file: H.zip
rar file: A.rar
gz file: C.tar.gz
zip file: K.zip
rar file: {.rar
gz file: R.tar.gz
zip file: 3.zip
rar file: a.rar
gz file: d.tar.gz
zip file: y.zip
rar file: _.rar
gz file: 4.tar.gz
zip file: _.zip
rar file: a.rar
gz file: _.tar.gz
zip file: z.zip
rar file: 1.rar
gz file: p.tar.gz
zip file: l.zip
rar file: 1.rar
gz file: n.tar.gz
zip file: 3.zip
rar file: _.rar
gz file: r.tar.gz
zip file: 1.zip
rar file: d.rar
gz file: 3.tar.gz
zip file: }.zip
Ok donc les noms des dernières archives forment le flag, on met cette sortie dans un fichier, on passe la commande suivante et on récupère le flag
$ cat out.txt | cut -d' ' -f3 | cut -d'.' -f1 | tr -d '[:space:]'
PHACK{R3ady_4_a_z1pl1n3_r1d3}
WE-1 (FlagClub)
Une semaine avant le CTF, vous avez eu accès à un amuse bouche.
Je vous transmets ce message que je viens de recevoir à votre attention :
La première règle du Flag Club est : il est interdit de parler du Flag Club.
La seconde règle du Flag Club est : il est interdit de parler du Flag Club.
Troisième règle du Flag Club : rassemblez cinq morceaux de secret pour reconstituer le flag.
Quatrième règle : les points rapportés par ce challenge uniquement seront dégressifs, en fonction du nombre de résolution.
Cinquième règle : coopérer ou non, mentir ou dire la vérité, la décision vous revient.
Sixième règle : pour ce challenge uniquement, les échanges d'informations entre les équipes sont autorisés.
Septième règle : le challenge continuera aussi longtemps que nécessaire.
- Adi Shamir
Était également joint ceci :
15-d76439aa22a213f152efe19b351b19a78ad4d7eeba72a9a38944269499785a19a629d13655693005de16d9df293477c71c7e8e1e7af006746d4bf753e4b1345023c9aced288c92a00b24e22a901cbc3b4d7567392d8df641b2ed9637444413d359
Voyez ce que vous pouvez en tirer !
Un petit coup de Google sur Adi Shamir et on apprend qu'en plus d'avoir inventé RSA, il a aussi inventé une méthode de partage de secret https://en.wikipedia.org/wiki/Shamir's_Secret_Sharing. Du coup c'est clairement là dessus qu'on s'oriente. On commence à échanger les secrets avec les autres équipes, certaines nous donneront des faux, d'autre des vrais... On a de toute manière aucun moyen de les vérifier pour le moment.
Une fois 5 bouts de secret en notre possession, on tente de décrypter avec ssss-combine
bon a priori on en a au moins un de faux dans cette histoire, on continue notre chasse au secret jusqu'à en récupérer une dizaine. À ce moment là il nous faut tester toutes les combinaisons de 4 + le notre pour trouver le flag. On écrit un petit script python pour générer ça pour nous :
import random
import itertools
import os
good="15-d76439aa22a213f152efe19b351b19a78ad4d7eeba72a9a38944269499785a19a629d13655693005de16d9df293477c71c7e8e1e7af006746d4bf753e4b1345023c9aced288c92a00b24e22a901cbc3b4d7567392d8df641b2ed9637444413d359"
items = [
"14-b02a048aa9cad4fe1ea3e0d206ed49ab081be6ce85fb38263c3803494e59d357db9a4eebfcbee0e4b57f5f837025e2dd9f3e583c37d9c61351a2dd100aaf3f87f3e94eed849830fe11390904ff009521e318126336cde45052f963b2a6395e2677",
"29-4f05311b227c65a883bb76946a7745557551617d08acbf522cd21541d79164d42aa080a03ec69ae9dd8bbac3273c724847bea4c35604e59cfb6a3f00853829416d894ab90f13afdf405e0839dae080165d81ceaf932f37b4a91de83aaf695c6780",
"01-e31f57a97d924f8dc38b840d745f1df88a70517075498ba751f6c59a15766e6b98a86235eaef26d213dcdc5b8f6d627e02158c6e4d31187b25af27f933f13bd2c7c7ebbb434b11962089f56646b8a9d7b33eda50033fc4dacbe1170b79277256b6",
"22-eb9075cb28f7fb2752b141f2db3fce9d40dc86ea40d87ba0360f4be4ab844818b7e1c3b02fd2caf8ffe1c80513df3f28f6477a597f9c0128e3d0f9645d61bad74542efceae9519d7613da514d277d4687cdd66d6251f2c049e8f863fa5734c3c1e",
"23-439352a2a6f0091424d7dc4d2a56f58bb98d974518b732e7c12931b7b9c4e96f7354d724c08c571fb1eace80c144e5571303ab4c26f8e9996aec502336b0799d142448ba07950d289dd7f555bdbf4290e8e7c62ecf75c2624884ab8aa148c905ff",
"26-740c4aec357d902cbf3466d454009fa60afc922ece84b756a72743939be3d8bd83bb61e283f88169d507dd08b9c34fbf8ddeb7ae2b52c7c0c67482118d34c723974481b37d73126f08ae5f5689c6de4c6f42ceb7721b2d32f2371e110f344b2381",
"38-4b8af6c974828dd6c60ab544e3c273a8b7c1b4ee773076982ef70ddab62944798c43eb62f1cc25d989d26e02ade2132ee3d18d619b20a5126a94b02d0144152a22e9e303ee4ae22e08f59a5663428146a605b26c3ded23f9f1cca6ef07a2f0f6b5",
"41-7823d706020876f8012e40e6764df2e5799e10cd0fe6691dcbdf3d918f39c7808aa0fe887c46a26337ba176fd1b1e828f44e7f3ed8b80a0849c94f8c6231f92861d02ea0a61ad5d01e8129441eb1b5c2bf9477cc2a229453d585b2d988bf5b44ed",
"49-cc4a369161b116284dd799e608d67e482daf1ee5609cc441a15aeb00b1f9d8b21666edc9fbdca3cdce9c091088167cba793b7048ad710a2b62708d45b2f8f9c0b89dcda0a16a5178478b083d9f25f0d8b94d90299805900073f085fbcfd85bfc96",
"09-e9bef1226c045c195fa8df6fc85cbbe7f4379fc039855dd4b9f1b9c242c997b8d9fefd45196700ef92b8be9f8347f517179fa1bc5e7d9ba16ce32e402ef7a9a49b9762cdf1fbd8850662f6e573d667939a39ca6ec1e496428a854565a9c1d37685"
]
result=list(itertools.combinations(items, 4))
for i in result:
i = list(i)
i.append(good)
data = '\n'.join(i) + '\n'
f = open('input.txt', 'w')
f.write(data)
f.close()
print("Test with: ", list([x.split('-')[0] for x in i]))
os.system('ssss-combine -t 5 < input.txt 2>> out.txt')
Itertools nous génère toutes les combinaisons, on génère un fichier contenant notre bout de secret + les 4 de chaque combinaison qu'on passe ensuite à la commande ssss-combine
. (On redirige la sortie d'erreur parce que le résultat est écrit dans la sortie d'erreur avec cet outil...) Un grep sur le fichier résultant et on trouve le flag
PHACK{And the eighth and final rule, if this is your first night at Flag Club, you have to flag!}
Et il s'avère que sur 10 secrets récupérés, seuls 5 étaient valides.