Introduction
Pour poursuivre notre exploration des défis de stéganographie du HeroCTF de ce week-end, je souhaitais partager avec vous la méthode que j'ai suivie pour résoudre "PDF-Mess". Ce challenge s'est avéré intéressant, car il demandait une analyse approfondie d'un fichier PDF.
Présentation du challenge
Dans cette épreuve, nous avions un PDF nommé strange.pdf
. L'objectif était d'y découvrir un élément pertinent qui nous permettrait d'obtenir le flag.
Analyse avec peepdf
J'ai opté pour l'utilisation de peepdf, un outil puissant pour examiner les fichiers PDF potentiellement malveillants. Après son installation (que je vous épargne, vous savez comment faire), on accède à son mode console avec la commande :
Une rapide consultation de l'aide (help
) nous donne la liste des commandes disponibles et nous permet de nous familiariser avec l'outil. Ensuite, nous pouvons commencer à chercher quelque chose d'inhabituel dans le PDF :
Cette commande nous fournit déjà pas mal d'informations sur le fichier. Quelques commandes se révèlent particulièrement utiles :
tree
: affiche la structure logique du PDF.offsets
: montre l'organisation physique du PDF.metadata
: indique les métadonnées de chaque version du document.rawobject
: présente les différents objets qui composent le fichier sans décodage (ce qui les rend difficiles à lire).object
: affiche les objets après leur décodage.
C'est cette dernière commande que nous allons privilégier, car nos yeux avertis ont sans doute remarqué la mention Suspicious elements qui pointe vers les objets 1, 36 et 110 (en jaune, donc bien visibles).
Inspection de l'objet suspect
Nous allons directement examiner l'objet qui nous intéresse : le 110. Pour cela, nous utilisons la commande :
On observe que son flux ("stream") contient un code JavaScript intéressant, que l'on aurait également pu visualiser avec la commande stream 110
. Le même principe d'affichage décodé que pour object
et rawobject
s'applique à stream
et rawstream
.
Les flux servent à stocker des données variées dans le fichier, comme des images, des sons, des vidéos, des scripts, et ils peuvent être compressés.
Note de Collaboration
À ce moment-là, j'ai clairement identifié la présence de code JavaScript intégré au PDF. J'ai alors fait appel à un ami, Mizari, pour m'aider à déchiffrer ce charabia. Il a tout de suite compris qu'il s'agissait de quelque chose de chiffré et a proposé de créer le code adapté à ce message mystérieux.
Déchiffrement du code JavaScript
Pour ceux qui connaissent NodeJS, l'utilisation de la librairie "crypto-js" est évidente. Mizari a consulté la documentation de cette bibliothèque sur le site de NPM pour s'assurer de la méthode à suivre pour inverser le processus, même si la lecture du code dans le PDF laissait penser qu'il suffisait de remplacer encrypt
par decrypt
.
Voici le code qui a permis de déchiffrer le message :
const CryptoJS = require("crypto-js");
const key = "3d...0a"; // La clé complète était dans le PDF
const cipher = "U2...od"; // Le texte chiffré se trouvait dans le PDF
const message = CryptoJS.AES.decrypt(cipher, key);
console.log(message);
Après avoir exécuté ce script, le flag est apparu !
Conclusion
Ce challenge nous a donné l'occasion d'explorer les différentes couches d'un fichier PDF et de voir comment des informations peuvent être cachées dans des objets et des flux. L'utilisation d'outils spécialisés comme peepdf se révèle très utile pour ce type d'analyse.
L'aspect intéressant réside également dans la combinaison de compétences nécessaires : l'analyse forensique pour repérer le code suspect, puis des connaissances en développement pour comprendre et inverser le chiffrement utilisé.
N'hésitez pas à tester peepdf par vous-même sur d'autres fichiers PDF pour découvrir leur structure et les informations qu'ils peuvent contenir !