Synapse Consulting
Home SynapseRM / TPRM Services Pricing About BlogCareersLabsContact
EN · FR
Test access Book a demo

Forensique PDF · Métadonnées · Décodage · Didier Stevens tools

Anatomie d'un PDF piégé : le capstone ORION

Un PDF lié au Projet ORION a été extrait du poste d'un suspect. Il se présente comme un rapport interne, mais trois techniques d'obfuscation y sont dissimulées. Trouvez-les toutes, reconstituez le message caché, et refermez toute l'enquête ORION.

~60 minDurée estimée
exiftool · pdfid.py · pdf-parser.py · CyberChefOutils
T1027 · T1059.007 · T1204.002MITRE ATT&CK
★★☆☆ IntermédiaireForensique PDFCyberChef

L'échantillon

Fichierorion-challenge-03.pdf
SHA-256d7d364d73985683aaf496eec338d5f4a13cb0d0d3ae9eec7a9c6d1e9fde05348
Taille11 447 octets, 2 pages, PDF 1.4
ContexteTrouvé sur le poste NORTHSEA-DEV lors d'une investigation interne

1. Scénario

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.

2. Objectifs

3. Outils requis

bash, Debian / Ubuntu / Kali
# 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.

bash, répertoire de travail
mkdir -p ~/lab04 && cd ~/lab04
cp /chemin/vers/orion-challenge-03.pdf .
sha256sum orion-challenge-03.pdf
# d7d364d73985683aaf496eec338d5f4a13cb0d0d3ae9eec7a9c6d1e9fde05348

4. Analyse pas à pas

1

Triage initial

pdfinfo · strings

On commence toujours par identifier ce qu'on a avant d'analyser en profondeur.

bash
pdfinfo orion-challenge-03.pdf
output
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.

2

Analyse des métadonnées, la discordance IOC

exiftool

exiftool lit tous les champs du dictionnaire /Info et les présente de façon lisible. Cherchez ce qui ne va pas.

bash
exiftool orion-challenge-03.pdf
output
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.

3

Détection du JavaScript, pdfid.py vs pdfinfo

pdfid.py

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.

bash
python3 ~/pdf-tools/pdfid.py orion-challenge-03.pdf
output
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.

bash
python3 ~/pdf-tools/pdf-parser.py --search /JavaScript orion-challenge-03.pdf
output
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.

4

Cartographie des objets et flux

pdf-parser.py

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.

bash
python3 ~/pdf-tools/pdf-parser.py --search /Filter orion-challenge-03.pdf
output
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 >>
obj 1
Catalog
/OpenAction -> obj 8
obj 2
Info (métadonnées)
Creator != Producer
obj 3
Pages
2 pages : obj 4 + obj 6
obj 4
Page 1
/Contents -> obj 5
obj 5
Flux page 1
/FlateDecode, 618 o
obj 6
Page 2
/Contents -> obj 7
obj 7
Flux page 2, caché
[ASCIIHexDecode + FlateDecode]
obj 8
Action JavaScript
/S /JavaScript, /OpenAction
obj 9
Police Helvetica
Type1, partagée p1 + p2
obj 10
Image XObject (logo)
/DeviceRGB, /FlateDecode
5

Décodage flux page 1, FlateDecode

pdf-parser.py · CyberChef

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.

bash
python3 ~/pdf-tools/pdf-parser.py --object 5 --filter orion-challenge-03.pdf
output
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 ...'
octets compressés (zlib)Raw Inflateopérateurs PDF en clair
🔬 Ouvrir la recette CyberChef, Raw Inflate
6

Décodage flux page 2, ASCIIHexDecode + FlateDecode

pdf-parser.py · CyberChef

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.

ASCIIHex brutFrom HexRaw Inflatemémo ORION en clair
bash
python3 ~/pdf-tools/pdf-parser.py --object 7 --filter orion-challenge-03.pdf
output
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.

5. Synthèse des IOCs

TypeValeurSource
MetadataAuthor: alex.mexiftool, /Info obj 2
IOC discordanceCreator: LibreOffice 24.2 / Producer: Microsoft Wordexiftool, champs contradictoires
JavaScript/S /JavaScript, /OpenAction obj 8pdfid.py, raté par pdfinfo
TokenORION-{d3c0d3d}-Q3-N0rthS3aobj 7, ASCIIHex+FlateDecode décodé
Dispositif USBSerial: SN-LAB-042, Label: TRANSFERobj 7, mémo interne
PersonaN0rthSea, stage 3 mentionnéobj 7, mémo interne
Timestamp2026-06-16 09:11 CEST (UTC+2)exiftool, CreationDate

Corrélation avec les autres labs

Challenge #01, VBAalex.m -> AlexM, même auteur que dans le maldoc Word
Challenge #02, disqueSN-LAB-042, TRANSFER, même USB identifié dans activity.log
Challenge #02, disque09:11 CEST, heure exacte de création de orion-export.zip
Challenge #03, OSINTN0rthSea, persona Onion lié à AlexM via l'empreinte PGP

6. Correction

Avez-vous trouvé les trois techniques et extrait tous les IOCs ?

Afficher la correction

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)

Pourquoi pdfinfo rate-t-il le JavaScript ?

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.

Points clés à retenir

  • Toujours croiser au moins deux outils, un outil seul peut avoir des angles morts.
  • Une discordance Creator/Producer est un IOC fiable car elle nécessite une manipulation post-génération.
  • La chaîne [/ASCIIHexDecode /FlateDecode] se décode de droite à gauche : From Hex d'abord, puis Raw Inflate.
  • Le token ORION-{d3c0d3d}-Q3-N0rthS3a relie les quatre labs, c'est l'artefact pivot de l'enquête.

7. Références

PDF Tools, Didier Stevens

La suite de référence pour l'analyse PDF forensique : pdfid, pdf-parser, make-pdf.

ExifTool, Phil Harvey

Extraction de métadonnées pour 150+ formats dont PDF, DOCX, images.

CyberChef, GCHQ

Raw Inflate, From Hex, From Base64, XOR, toutes les recettes de décodage en un outil.

MITRE T1027, Obfuscated Files

Techniques d'obfuscation dans les fichiers malveillants : encodage, compression, chiffrement.

MITRE T1059.007, JavaScript

Exécution de code via JavaScript embarqué dans des documents PDF ou HTML.

PDF Reference 1.7, Adobe

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.

Synapse Consulting

A Belgium-based provider of cybersecurity solutions, and the team behind SynapseRM / TPRM.

PLATFORM
SynapseRM / TPRM Pricing Test accessPresentation (PDF)
SERVICES
Governance Operational Training
COMPANY
About Contact Blog Labs Careers Privacy & cookies
Brussels, Belgium