De quoi parle-t-on ? #
La THCon (Toulouse Hacking convention), est une conférence française sur la cybersécurité qui réunit des amateurs, des professionnels et des chercheurs chaque année à Toulouse au mois d’avril.
Pour cette édition (2025), j’ai été l’un des créateurs de défis et j’ai créé un défi de geoINT en 6 parties, quelques défis de stéganographie, et j’ai fait en sorte que tous les défis soient conformes au lore (ce qui n’est pas peu faire).
Note : dans le cas où le CTFd n’est plus en ligne, si vous n’avez pas participé, ou si vous ne vous souvenez pas des défis, vous pouvez jeter un coup d’œil sur https://ctftime.org/event/2660/tasks/ bien que tous ne soient malheureusement pas listés :/
Explication macrosopique #
Dans ce défi, nous apprenons que les XSS (les méchants) ont réussi à prendre le contrôle des réseaux sociaux de la THCon ! Nous devons reconstituer les images qu’ils ont postées sur les réseaux sociaux de la THCon :
Étape par étape précise #
On a donc du socINT, avec deux choses à regarder :
- Tous les comptes officiels de THCon (listés sur le site)
- Tout réseau social non listé sur le site en utilisant un outil comme https://namechk.com/
Si nous commençons par l’option la plus évidente’ (ce défi est marqué comme stéganographie pour rappel), nous pouvons lister les comptes officiels :
- X (anciennement Twitter)
- Mastodon (celui-ci est un miroir de Twitter)
- YouTube
En examinant les plus évidents, nous obtenons :
- Rien sur YouTube
- Un thread sur X (anciennement Twitter) 🥳🥳🥳
- Un post sur LinkedIn qui renvoie à une image sur le site
Regardons de plus près :
Le thread est assez simple et contient deux images :
Nous apprenons que les XSS jouent à des jeux comme LOL ou Marvel Rivals (super, probablement inutile), mais nous obtenons aussi deux fichiers. À ce stade, la partie stéganographie commence, et nous pouvons examiner les fichiers.
Quelques remarques :
- Ce sont des fichiers de bruit
- Le plus grand fichier a des dimensions
1000x1000
tandis que le plus petit fait100x100
- Le plus grand fichier semble contenir des répétitions 10x10 d’un motif de bruit
- Ils semblent avoir été créés par un outil ou quelque chose (d’où leur format étrange lorsqu’on les analyse)
Une première idée serait de faire un XOR entre les images, et puisque le plus grand fichier semble être une répétition du bruit plus petit, nous pouvons essayer de faire un XOR du grand fichier avec le petit fichier répété.
Voici un script Python POC qui fait exactement cela :
from PIL import Image
noise100x100 = Image.open("./noise.png")
pixel_noise100x100 = noise100x100.load()
im = Image.open("./hidden-image2.png")
pixel_image = im.load()
for i in range(im.size[0]): # pour chaque pixel :
for j in range(im.size[1]):
r,g,b,_ = pixel_image[i,j]
# r,g,b,_ = pixel_image[i,j] # Parfois, des plateformes (comme Signal) ajoutent une transparence
r_x, g_x, b_x = pixel_noise100x100[i%100,j%100]
# r_x, g_x, b_x, _ = pixel_noise100x100[i%100,j%100] # Parfois, des plateformes (comme Signal) ajoutent une transparence
r = r ^ r_x
g = g ^ g_x
b = b ^ b_x
pixel_image[i,j] = (r,g,b)
im.save("./out.png")
Lorsque nous faisons un XOR de l’image dans le thread X avec l’échantillon de bruit plus petit du même thread, nous obtenons :
Ensuite, nous utilisons l’image trouvée dans le post LinkedIn pour obtenir :
Résolutions #
J’ai vu des gens faire des choses folles avec ça, comme faire un XOR de l’image avec elle-même, mais avec un décalage (pour que les colonnes de bruit s’annulent) ou faire un XOR des deux plus grandes images de bruit, ce qui leur donnait une superposition des deux images, c’était vraiment amusant 😅
Félicitations aux 6 qui ont réussi à trouver le flag !