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:

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

    en utilisateur
    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:

    en utilisateur
    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.

en utilisateur
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:

en 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.

en utilisateur
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:

en utilisateur
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:

en utilisateur
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:

en utilisateur
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:

en utilisateur
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:

en utilisateur
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

en utilisateur
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:

en utilisateur
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:

en 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":

en utilisateur
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:

en utilisateur
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:

en utilisateur
stegsnow texte+message.txt
?? ^_^ ??

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

en utilisateur
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é:

en utilisateur
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:

en utilisateur
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:
en utilisateur
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é:

en utilisateur
stegsnow -C texte+message-compresse.txt
?? ^_^ ??
texte-message-compresse.txt

Aide

Pour aller plus loin avec stegsnow, lire la documentation:

en utilisateur
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:

en root
apt-get install outguess 

Ajouter un message avec outguess

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

en utilisateur
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:

en utilisateur
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:
en utilisateur
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:

en utilisateur
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:

en utilisateur
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):

en utilisateur
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):

en utilisateur
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:

en utilisateur
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


2016 nIQnutn CC-BY
Vus : 2670
Publié par nIQnutn : 73