| Fichier | orion-challenge-03.pdf |
| SHA-256 | d7d364d73985683aaf496eec338d5f4a13cb0d0d3ae9eec7a9c6d1e9fde05348 |
| Taille | 11 447 octets, 2 pages, PDF 1.4 |
| Contexte | Trouvé sur le poste NORTHSEA-DEV lors d'une investigation interne |
Lors de l'investigation sur la fuite du Projet ORION, un PDF a été récupéré sur le poste du suspect. Le fichier se présente comme un rapport trimestriel interne, mais l'équipe DFIR a détecté des anomalies dans sa structure.
Votre mission est d'analyser ce fichier avec des outils de forensique PDF, d'identifier les techniques utilisées pour dissimuler de l'information, et d'extraire les IOCs qui corroborent les challenges précédents.
🔗 Fil ORION : ce challenge s'inscrit dans la même enquête que les #01 (maldoc VBA), #02 (forensique disque) et #03 (attribution OSINT). Les IOCs extraits ici se recoupent avec les résultats précédents.
pdfinfo le rate.# exiftool sudo apt-get install -y libimage-exiftool-perl # Outils Didier Stevens (pdfid + pdf-parser) mkdir ~/pdf-tools && cd ~/pdf-tools wget -q https://didierstevens.com/files/software/pdfid_v0_2_9.zip wget -q https://didierstevens.com/files/software/pdf-parser_v0_7_9.zip unzip -q pdfid_v0_2_9.zip unzip -q pdf-parser_v0_7_9.zip
💡 CyberChef s'utilise en ligne sur gchq.github.io/CyberChef. Les boutons de recette ci-dessous ouvrent directement la bonne recette.
mkdir -p ~/lab04 && cd ~/lab04 cp /chemin/vers/orion-challenge-03.pdf . sha256sum orion-challenge-03.pdf # d7d364d73985683aaf496eec338d5f4a13cb0d0d3ae9eec7a9c6d1e9fde05348
On commence toujours par identifier ce qu'on a avant d'analyser en profondeur.
pdfinfo orion-challenge-03.pdf
Title: Project ORION -- Q3 Assessment Report Author: alex.m Creator: LibreOffice 24.2 -- AlexM workstation Producer: Microsoft Word for Microsoft 365 CreationDate: Tue Jun 16 07:11:00 2026 UTC Pages: 2 JavaScript: no PDF version: 1.4
🚩 JavaScript: no, mais c'est faux. pdfinfo utilise une heuristique qui cherche un namespace /Names /JavaScript dans le catalogue. Notre JS est dans un objet /Action, pdfinfo le rate. On le prouve à l'étape 3.
exiftool lit tous les champs du dictionnaire /Info et les présente de façon lisible. Cherchez ce qui ne va pas.
exiftool orion-challenge-03.pdf
Title : Project ORION -- Q3 Assessment Report Author : alex.m Subject : North Sea Digital / Internal research Keywords : ORION NSD confidential Q3 2026 Creator : LibreOffice 24.2 -- AlexM workstation Producer : Microsoft Word for Microsoft 365 Create Date : 2026:06:16 09:11:00+02:00
🔴 IOC, discordance Creator / Producer : Creator déclare LibreOffice, Producer déclare Microsoft Word. Ces deux outils ne coexistent pas dans une même chaîne de production PDF légitime. Le champ Producer a été modifié manuellement après génération, technique courante pour brouiller les pistes sur l'origine du fichier.
💡 Date de création : 2026-06-16 09:11 CEST. Si vous avez fait le Challenge #02 (forensique disque), cette heure vous dit quelque chose : c'est l'heure exacte à laquelle l'archive orion-export.zip a été créée sur le poste d'alex.
pdfid.py ne fait pas d'analyse sémantique, il compte les occurrences de mots-clés PDF dans les octets bruts. C'est beaucoup plus difficile à tromper que les heuristiques de pdfinfo.
python3 ~/pdf-tools/pdfid.py orion-challenge-03.pdf
PDFiD 0.2.9 orion-challenge-03.pdf PDF Header: %PDF-1.4 obj 10 stream 3 /Page 2 /JS 1 /JavaScript 1 /OpenAction 1 /Launch 0 /EmbeddedFile 0
🚩 /JS 1, /JavaScript 1, /OpenAction 1 : les trois ensemble sont caractéristiques d'un PDF qui exécute du JavaScript dès l'ouverture. pdfinfo indiquait JavaScript: no. Leçon : ne jamais se fier à un seul outil.
python3 ~/pdf-tools/pdf-parser.py --search /JavaScript orion-challenge-03.pdf
obj 8 0
Type: /Action
<< /Type /Action
/S /JavaScript
/JS (app.alert({cMsg:'ORION verification required. Token: ORION-Q3-NSD',
cTitle:'Project ORION',nIcon:3}); )
>>💡 Ici le JavaScript est bénin (un app.alert()). Dans un vrai maldoc, cette action peut déclencher un shellcode, un exploit de type use-after-free dans le lecteur, ou un téléchargement. La structure est identique, seul le contenu de /JS change.
Avant de décoder, on cartographie tous les flux présents et leurs méthodes d'encodage. C'est l'étape qui donne une vue d'ensemble de la structure.
python3 ~/pdf-tools/pdf-parser.py --search /Filter orion-challenge-03.pdf
obj 5 0 Contains stream << /Length 618 /Filter /FlateDecode >> obj 7 0 Contains stream << /Length 879 /Filter [/ASCIIHexDecode /FlateDecode] >> obj 10 0 Contains stream << /Subtype /Image /Filter /FlateDecode >>
L'objet 5 contient le flux de page 1 compressé avec zlib (FlateDecode). Deux méthodes : laisser pdf-parser.py le faire, ou extraire les octets bruts et décoder à la main dans CyberChef.
python3 ~/pdf-tools/pdf-parser.py --object 5 --filter orion-challenge-03.pdf
Stream b'BT\n/F1 20 Tf 50 750 Td (PROJECT ORION) Tj\n/F1 11 Tf 0 -35 Td (Q3 Assessment Report -- North Sea Digital) Tj\n0 -18 Td (Classification: INTERNAL -- NOT FOR DISTRIBUTION) Tj ...'
L'objet 7 utilise une chaîne de deux filtres : le contenu est d'abord en ASCII hexadécimal, lui-même compressé en zlib. Pour décoder, on applique les opérations dans l'ordre inverse de la liste /Filter, de droite à gauche.
python3 ~/pdf-tools/pdf-parser.py --object 7 --filter orion-challenge-03.pdf
ORION INTERNAL MEMO -- RESTRICTED
Stage 2 transfer confirmed.
Package delivered via USB device. Serial: SN-LAB-042.
Label: TRANSFER
Await signal from N0rthSea before proceeding to stage 3.
Verification token: ORION-{d3c0d3d}-Q3-N0rthS3a
Stream encoding: [/ASCIIHexDecode /FlateDecode]🔬 Ouvrir la recette CyberChef, From Hex puis Raw Inflate✅ Le mémo révèle le token ORION-{d3c0d3d}-Q3-N0rthS3a et confirme le transfert via le périphérique USB SN-LAB-042 labelisé TRANSFER, les deux artefacts identifiés dans le lab forensique #02.
| Type | Valeur | Source |
|---|---|---|
| Metadata | Author: alex.m | exiftool, /Info obj 2 |
| IOC discordance | Creator: LibreOffice 24.2 / Producer: Microsoft Word | exiftool, champs contradictoires |
| JavaScript | /S /JavaScript, /OpenAction obj 8 | pdfid.py, raté par pdfinfo |
| Token | ORION-{d3c0d3d}-Q3-N0rthS3a | obj 7, ASCIIHex+FlateDecode décodé |
| Dispositif USB | Serial: SN-LAB-042, Label: TRANSFER | obj 7, mémo interne |
| Persona | N0rthSea, stage 3 mentionné | obj 7, mémo interne |
| Timestamp | 2026-06-16 09:11 CEST (UTC+2) | exiftool, CreationDate |
Avez-vous trouvé les trois techniques et extrait tous les IOCs ?
✅ Les trois techniques à trouver :
1. Discordance Creator/Producer dans les métadonnées (obj 2)
2. JavaScript embarqué via /OpenAction (obj 8), raté par pdfinfo
3. Flux double-encodé [ASCIIHexDecode + FlateDecode] (obj 7)
pdfinfo cherche une structure /Names << /JavaScript ... >> dans le catalogue, le pattern habituel des formulaires AcroForm avec JS. Notre action utilise /OpenAction -> /S /JavaScript directement, sans passer par le namespace /Names. C'est une différence d'implémentation, pas une limitation. pdfid.py compte les occurrences de chaînes brutes et détecte les deux patterns.
[/ASCIIHexDecode /FlateDecode] se décode de droite à gauche : From Hex d'abord, puis Raw Inflate.ORION-{d3c0d3d}-Q3-N0rthS3a relie les quatre labs, c'est l'artefact pivot de l'enquête.La suite de référence pour l'analyse PDF forensique : pdfid, pdf-parser, make-pdf.
Extraction de métadonnées pour 150+ formats dont PDF, DOCX, images.
Raw Inflate, From Hex, From Base64, XOR, toutes les recettes de décodage en un outil.
Techniques d'obfuscation dans les fichiers malveillants : encodage, compression, chiffrement.
Exécution de code via JavaScript embarqué dans des documents PDF ou HTML.
La spécification complète du format PDF : structure des objets, filtres, actions.
Environnement entièrement fictif, à usage éducatif uniquement. Le JavaScript embarqué est un app.alert() bénin.
A Belgium-based provider of cybersecurity solutions, and the team behind SynapseRM / TPRM.