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.
Sommaire:
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).
On met le message dans une archive zip:
en utilisateurzip /tmp/rienACacher.zip /tmp/rienACacher.txt adding: /tmp/rienACacher.txt (deflated 21%)
On concatène l'image et le message:
en utilisateurcat /tmp/image.jpg /tmp/rienACacher.zip > /tmp/image+message.jpg
Une fois le message intégré à l'image, il est possible de le récupérer avec la commande:
en utilisateurunzip /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.
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:
apt-get install steghide
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.
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é.
steghide: le fichier-couverture est trop petit pour cacher les données.
Extraire un message avec steghide
Pour récupérer le message:
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
:
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
:
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:
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
:
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
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:
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:
apt-get install stegsnow
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"
:
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
:
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:
stegsnow texte+message.txt
?? ^_^ ??
Pour extraire le message dans un fichier plutôt que dans le terminal:
stegsnow texte+message.txt > message-secret.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é:
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:
stegsnow -p "mot de passe" texte+message+motdepasse.txt
?? ^_^ ??
Activer la compression
L'utilisation de la compression est recommandée pour du texte: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é:
stegsnow -C texte+message-compresse.txt
?? ^_^ ??
Aide
Pour aller plus loin avec stegsnow, lire la documentation:
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:
apt-get install outguess
Ajouter un message avec outguess
Ajouter un message, contenu dans un fichier, à une image:
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:
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: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:
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:
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):
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):
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:
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
- Introduction à la stéganographie - mantis
- Introduction à la stéganographie - David GLAUDE
- Introduction à la stéganographie - Didier Müller
- Steghide - Debian packages
- Stegsnow - Debian packages
- Stegsnow - Page du projet
- Outguess - Debian packages
2016 nIQnutn CC-BY