Stéganographie - L'art de dissimuler un message

La stéganographie c'est l'art de la dissimulation. L'objectif est de cacher un message dans un support, par exemple un texte dans une image. La stéganographie profite des propriétés des fichiers informatiques avec des zones de données qui sont inutilisées ou insignifiantes pouvant être détournées.

La différence entre la cryptographie et la stéganographie peut se résumer ainsi: l'une permet de rendre initelligible les données alors que l'autre consiste à les cacher. La stéganographie est donc plus subtile, elle repose sur l'idée de sécurité par l'obscurité et permet de nier la présence d'un éventuel message.

La cryptographie s'appuie sur des algorithmes. Avec le développement technique et scientifique, ils risquent d'être cassés tôt ou tard.
Si quelqu'un vous surveille et détecte un message chiffré, il ne sera peut être pas capable de le décrypter tout de suite. Par contre il peut décider de le stocker et tenter sa chance plus tard quand il aura les outils appropriés.
Malheureusement, certaines informations sont toujours valables dans le temps. Un fichier qui sera d'apparence sans intéret et en dehors de tous soupçons sera probablement supprimé et votre secret sera préservé.

Il existe un inconvénient à la stéganographie, le correspondant doit connaitre les règles utilisées pour récupérer le message. Par contre elle peut se décliner à l'infini et se combiner à la cryptographie.

Note aux terroristes, criminels et Dark Vador:
Merci de ne pas utiliser ces techniques et les outils présentés ci-dessous à des fins malveillantes. Veuillez également vous rendre au plus vite auprès des autorités compétentes les plus proches.

Stéganographie avec cat et unzip

Il est possible de camoufler un message dans une image très facilement.

Pour ça il faut:

  • une image (image.jpg),
  • un texte (rienACacher.txt).
Et les paquets cat et unzip installés.
  1. On met le message dans une archive zip:


    $user
    zip /tmp/rienACacher.zip /tmp/rienACacher.txt
    adding: /tmp/rienACacher.txt (deflated 21%)
  2. On concatène l'image et le message:


    $user
    cat /tmp/image.jpg /tmp/rienACacher.zip > /tmp/image+message.jpg
  3. Une fois le message intégré à l'image, il est possible de le récupérer avec la commande:


    $user
    unzip /tmp/image+message.jpg -d /tmp/message
    Archive:  /tmp/image+message.jpg
    warning [/tmp/image+message.jpg]:  11327 extra bytes at beginning or within zipfile
    (attempting to process anyway)
    inflating: /tmp/message/rienACacher.txt

Il est possible de vérifier les informations concernant l'image.


$user
file /tmp/image+message.jpg
/tmp/image+message.jpg: JPEG image data, JFIF standard 1.02, aspect ratio, density 1x1, segment length 16, comment: "*", progressive, precision 8, 400x283, frames 3

sha512sum /tmp/image+message.jpg
fe50d6e37c534edf7c057d55efa4e635b16384823b369071861a721c5628eec19e2bc5309384e4efb4d66296d21b7d49c64d678689bd793d13382279cd58738c  /tmp/image+message.jpg

ls -lh /tmp/
total 32K
-rw-r--r-- 1 nIQnutn nIQnutn 12K août  10  2014 image.jpg
-rw-r--r-- 1 nIQnutn nIQnutn 12K mai   23 10:58 image+message.jpg
-rw-r--r-- 1 nIQnutn nIQnutn 109 mai   23 10:44 rienACacher.txt
-rw-r--r-- 1 nIQnutn nIQnutn 266 mai   23 10:54 rienACacher.zip

Dans ce cas, il est difficile de détecter la différence si on compare uniquement la taille des fichiers.

Remarques

Cette méthode peut marcher avec d'autres types de fichiers (il faut les tester). Par contre, elle est basique et par conséquence, elle comporte des lacunes évidentes.
Une analyse des fichiers devrait permettre de détecter le fichier .zip qui est intégré à l'image.
Selon la longueur du message, il est possible d'identifier une anomalie avec un fichier dont la taille est supérieure à celle qui devrait être nécessaire.
Les noms des fichiers ne devront pas donner d'indications sur la présence d'un éventuel message.
Cette technique est donc à utiliser uniquement avec vos amis.

Steghide

Pour ceux qui souhaitent avoir des outils un peu plus élaborés, il est possible d'utiliser steghide. Steghide se limite à l'utilisation de fichiers de "façade" JPEG, BMP, WAV et AU mais il est possible de dissimuler n'importe quel type de fichier à l'intérieur.
Pour apporter une sécurité supplémentaire, le message peut également être chiffré.

Pour installer steghide, il suffit de taper dans le terminal:


#root
apt-get install steghide
steghide version 0.5.1

Ajouter un message avec steghide

Pour intégrer un message à un fichier image ou audio, il suffit de définir le fichier de façade et le fichier à embarquer.


$user
steghide embed -cf image.jpg -ef rienACacher.txt 
Entrez la passphrase: 
Entrez à nouveau la passphrase: 
camouflage des données de "rienACacher.txt" dans "image.jpg". terminé.
Attention le fichier image.jpg sera écrasé.
Si le message est trop grand par rapport au fichier de façade, vous pouvez avoir ce message d'erreur:
steghide: le fichier-couverture est trop petit pour cacher les données.

Extraire un message avec steghide

Pour récupérer le message:


$user
steghide extract -sf image.jpg 
Entrez la passphrase: 
écriture des données extraites dans "rienACacher.txt".

Fonctions avancées de steghide

Définir le fichier de sortie

A la création, il faut ajouter -sf fichier-de-sortie.jpg:


$user
steghide embed -cf image.jpg -ef rienACacher.txt -sf image+message.jpg
Entrez la passphrase: 
Entrez à nouveau la passphrase: 
camouflage des données de "rienACacher.txt" dans "image.jpg". terminé.
écriture du fichier stégo "image+message.jpg"... terminé.

A l'extraction, il faut ajouter -xf message-de-sortie.txt:


$user
steghide extract -sf image+message.jpg -xf message.txt
Entrez la passphrase: 
écriture des données extraites dans "message.txt".

Définir l'algorithme de chiffrement

Pour lister les différentes algorithmes disponibles:


$user
steghide encinfo
algorithme de cryptage :
<algorithme>: <modes supportés>...
cast-128: cbc cfb ctr ecb ncfb nofb ofb
gost: cbc cfb ctr ecb ncfb nofb ofb
rijndael-128: cbc cfb ctr ecb ncfb nofb ofb
twofish: cbc cfb ctr ecb ncfb nofb ofb
...

Pour choisir l'algorithme, il faut ajouter-e algo mode:


$user
steghide embed -cf image.jpg -ef rienACacher.txt -sf image+message.jpg -e twofish cbc
Entrez la passphrase: 
Entrez à nouveau la passphrase: 
camouflage des données de "rienACacher.txt" dans "image.jpg". terminé.
écriture du fichier stégo "image+message.jpg"... terminé.

Obtenir des informations sur l'image


$user
steghide info image+message.jpg 
"image+message.jpg":
format: jpeg
capacité: 592,0 Byte
Essayer d'obtenir des informations à propos des données incorporées ? (o/n) o
Entrez la passphrase: 
fichier à inclure "rienACacher.txt":
taille: 64,0 Byte
cryptage: rijndael-128, cbc
compression: oui

Aide

Pour aller plus loin avec steghide, lire la documentation:


$user
man steghide

Stegsnow

Stegsnow permet d'ajouter un message dans du texte brut. La méthode utilise les tabulations et les espaces qui ne sont pas visibles pour dissimuler un message.

Pour installer stegsnow, il suffit de taper dans le terminal:


#root
apt-get install stegsnow
stegsnow --version
20130616 Apache-2.0 Copyright (C) Matthew Kwan mkwan@darkside.com.au

Ajouter un message avec stegsnow

Ajouter un message directement dans un fichier texte avec -m "un message":


$user
stegsnow -m "Utilise stegsnow pour cacher des messages." texte.txt texte+message.txt 
Message used approximately 20.25% of available space.    

Si le message est contenu dans un fichier, utiliser -f nom-du-fichier.txt:


$user
stegsnow -f message.txt texte.txt texte+message.txt
Message used approximately 20.25% of available space.

Extraire un message avec stegsnow

Pour extraire le message directement dans le terminal:


$user
stegsnow texte+message.txt
?? ^_^ ??

Pour extraire le message dans un fichier plutôt que dans le terminal:


$user
stegsnow texte+message.txt > message-secret.txt
?? ^_^ ??
texte-message.txt

Fonctions avancées de stegsnow

Protéger un message avec un mot de passe

Il est possible d'ajouter un mot de passe au message pour ajouter un niveau de sécurité:


$user
stegsnow -f message.txt -p "mot de passe" texte.txt  texte+message+motdepasse.txt
Message used approximately 31.94% of available space.

Pour récupérer un message protégé par un mot de passe:


$user
stegsnow -p "mot de passe" texte+message+motdepasse.txt
?? ^_^ ??
texte-message-motdepasse.txt

Activer la compression

L'utilisation de la compression est recommandée pour du texte:


$user
stegsnow -C -m "Utilise stegsnow pour cacher des messages." texte.txt texte+message-compresse.txt
Compressed by 42.86%
Message used approximately 11.78% of available space.

Dans ce cas, pour retrouver le message compressé:


$user
stegsnow -C texte+message-compresse.txt
?? ^_^ ??
texte-message-compresse.txt

Aide

Pour aller plus loin avec stegsnow, lire la documentation:


$user
man stegsnow

Outguess

Outguess est un outil similaire à steghide mais prend uniquement en charge les formats PPM, PNM et JPEG. L'avantage est de pouvoir intégrer deux messages au sein d'un même fichier permettant de ce fait le déni plausible.

Pour installer outguess, il suffit de taper dans le terminal:


#root
apt-get install outguess

Ajouter un message avec outguess

Ajouter un message, contenu dans un fichier, à une image:


$user
outguess -d message.txt image.jpg image+message.jpg 
Reading image.jpg....
JPEG compression quality set to 75
Extracting usable bits:   30417 bits
Correctable message size: 13864 bits, 45.58%
Encoded 'message.txt': 528 bits, 66 bytes
Finding best embedding...
    0:   258(46.1%)[48.9%], bias   320(1.24), saved:     0, total:  0.85%
   10:   267(47.7%)[50.6%], bias   306(1.15), saved:     0, total:  0.88%
   39:   257(45.9%)[48.7%], bias   315(1.23), saved:     0, total:  0.84%
   41:   268(47.9%)[50.8%], bias   292(1.09), saved:     0, total:  0.88%
   42:   251(44.8%)[47.5%], bias   308(1.23), saved:     1, total:  0.83%
  121:   266(47.5%)[50.4%], bias   289(1.09), saved:     0, total:  0.87%
  143:   256(45.7%)[48.5%], bias   294(1.15), saved:     1, total:  0.84%
  150:   266(47.5%)[50.4%], bias   280(1.05), saved:     0, total:  0.87%
  168:   252(45.0%)[47.7%], bias   292(1.16), saved:     1, total:  0.83%
  186:   255(45.5%)[48.3%], bias   280(1.10), saved:     1, total:  0.84%
186, 535: Embedding data: 528 in 30417
Bits embedded: 560, changed: 255(45.5%)[48.3%], bias: 280, tot: 30415, skip: 29855
Foiling statistics: corrections: 111, failed: 0, offset: 42.212766 +- 64.191946
Total bits changed: 535 (change 255 + bias 280)
Storing bitmap into data...
Writing image+message.jpg....

Extraire un message avec outguess

Pour retrouver le message contenu dans l'image:


$user
outguess -r image+message.jpg message-secret.txt
Reading image+message.jpg....
Extracting usable bits:   30417 bits
Steg retrieve: seed: 186, len: 66

Fonctions avancées de outguess

Ajouter un mot de passe au message

Il est possible d'ajouter mot de passe au message:

$user
outguess  -k "mot de passe"  -d message.txt image.jpg image+message.jpg 
Reading image.jpg....
JPEG compression quality set to 75
Extracting usable bits:   30417 bits
Correctable message size: 13864 bits, 45.58%
Encoded 'message.txt': 528 bits, 66 bytes
Finding best embedding...
    0:   258(46.1%)[48.9%], bias   297(1.15), saved:     0, total:  0.85%
   17:   253(45.2%)[47.9%], bias   296(1.17), saved:     1, total:  0.83%
   50:   259(46.2%)[49.1%], bias   285(1.10), saved:     0, total:  0.85%
   90:   238(42.5%)[45.1%], bias   278(1.17), saved:     3, total:  0.78%
90, 516: Embedding data: 528 in 30417
Bits embedded: 560, changed: 238(42.5%)[45.1%], bias: 278, tot: 30323, skip: 29763
Foiling statistics: corrections: 102, failed: 0, offset: 38.680851 +- 68.250850
Total bits changed: 516 (change 238 + bias 278)
Storing bitmap into data...
Writing image+message.jpg....

Retrouver le message en indiquant le mot de passe:


$user
outguess  -k "mot de passe"  -r image+message.jpg message-cache.txt
Reading image+message.jpg....
Extracting usable bits:   30417 bits
Steg retrieve: seed: 90, len: 66

Ajouter un second message avec outguess

Pour ajouter un second message, la syntaxe est identique mais les paramètres doivent être en majuscule.
Il faut aussi ajouter la correction d'erreur -E.

La commande pour ajouter deux message dans une seule image:


$user
outguess  -d message.txt -E -K "motdepasse" -D message-important.txt image.jpg image+messages.jpg
Initalize encoding/decoding tables
Reading image.jpg....
JPEG compression quality set to 75
Extracting usable bits:   30417 bits
Correctable message size: 13864 bits, 45.58%
Encoded 'message.txt': 528 bits, 66 bytes
Finding best embedding...
    0:   258(46.1%)[48.9%], bias   320(1.24), saved:     0, total:  0.85%
   10:   267(47.7%)[50.6%], bias   306(1.15), saved:     0, total:  0.88%
   39:   257(45.9%)[48.7%], bias   315(1.23), saved:     0, total:  0.84%
   41:   268(47.9%)[50.8%], bias   292(1.09), saved:     0, total:  0.88%
   42:   251(44.8%)[47.5%], bias   308(1.23), saved:     1, total:  0.83%
  121:   266(47.5%)[50.4%], bias   289(1.09), saved:     0, total:  0.87%
  143:   256(45.7%)[48.5%], bias   294(1.15), saved:     1, total:  0.84%
  150:   266(47.5%)[50.4%], bias   280(1.05), saved:     0, total:  0.87%
  168:   252(45.0%)[47.7%], bias   292(1.16), saved:     1, total:  0.83%
  186:   255(45.5%)[48.3%], bias   280(1.10), saved:     1, total:  0.84%
186, 535: Embedding data: 528 in 30417
Bits embedded: 560, changed: 255(45.5%)[48.3%], bias: 280, tot: 30415, skip: 29855
Encoded 'message-important.txt ' with ECC: 1432 bits, 179 bytes
Finding best embedding...
    0:   580(38.0%)[78.8%], bias   526(0.91), saved:    17, total:  1.91%
    1:   549(35.9%)[74.6%], bias   529(0.96), saved:    20, total:  1.80%
    2:   574(37.6%)[78.0%], bias   485(0.84), saved:    17, total:  1.89%
   15:   552(36.1%)[75.0%], bias   487(0.88), saved:    20, total:  1.81%
   22:   575(37.6%)[78.1%], bias   458(0.80), saved:    17, total:  1.89%
   25:   549(35.9%)[74.6%], bias   475(0.87), saved:    20, total:  1.80%
   42:   516(33.8%)[70.1%], bias   469(0.91), saved:    25, total:  1.70%
   71:   536(35.1%)[72.8%], bias   430(0.80), saved:    22, total:  1.76%
71, 966: Embedding data: 1432 in 30417
Bits embedded: 1528, changed: 536(35.1%)[72.8%], bias: 430, tot: 30330, skip: 28802
Foiling statistics: corrections: 371, failed: 2, offset: 39.078571 +- 82.268820
Total bits changed: 1501 (change 791 + bias 710)
Storing bitmap into data...
Writing image+messages.jpg....

Retrouver le message 1 (message.txt):


$user
outguess  -r image+messages.jpg message-1.txt
Reading image+messages.jpg....
Extracting usable bits:   30417 bits
Steg retrieve: seed: 186, len: 66

Retrouver le message 2 (message-important.txt):


$user
outguess -k "motdepasse" -e -r image+messages.jpg message-2.txt
Initalize encoding/decoding tables
Reading image+messages.jpg....
Extracting usable bits:   30417 bits
Decode: 12 data after ECC: 4
Steg retrieve: seed: 71, len: 179
Decode: 179 data after ECC: 92

Aide

Pour aller plus loin avec outguess, lire la documentation:


$user
man outguess

Une énigme à résoudre (si vous en êtes capable !)

Un point, c'est tout !

J'ai honteusement copié cette énigme sur Un point, c'est tout ! Jackv sur Prise2Tete.fr

La réponse est toute proche.

Avertissements

  • Il semble que la plupart des outils disponibles sont relativement anciens. Il existe des outils pour détecter la présence de messages stéganographiés et il plus que probable que les outils présentés soient bien connus et potentiellement vulnérables.
  • L'usage de sténographie associé à de la cryptographie est toujours une bonne idée.
  • L'échange de messages doit pouvoir être noyé dans une quantité d'informations importantes pour ne pas éveiller les soupçons.
  • Les documents qui serviront à dissimuler un message doivent être des fichiers uniques. Si l'orignal est disponible sur internet, la comparaison des empreintes permettra de révéler des différences et éveillera les suspicions. Il faut au minimum, modifier directement le contenu ou changer la résolution, diminuer la taille, ... de manière à générer un document unique.
  • Si on envoie une image avec un message secret, l'échange devra pouvoir se justifier. Un activiste qui envoie des fonds d'écran de Dora l'Exploratrice sera vraisemblablement suspect.
  • Il peut être utile de supprimer certaines méta-données.

Voilà quelques astuces pour partager des informations en toute discrétion.

Ressources

4 commentaires

Tuxicoman |

Super cet article, on en redemande !

Tout le monde cotoie la stéganographie sans le savoir, scannez une feuille imprimée et regardez le canal bleu sous GIMP : https://en.wikipedia.org/wiki/Printer_steganography

Christine |

Bonjour, où se trouve le flux RSS de votre blog ? Je ne l'ai pas trouvé.

Christine

nIQnutn |

@Christine :
Flux rss


c'est affiché en bas du panneau latéral.

nIQnutn |

Le prochain outil à tester: gifshuffle
https://packages.debian.org/stretch/gifshuffle

Fil RSS des commentaires de cet article

Écrire un commentaire