Nicolas SURRIBAS

Développement / Réseau / Sécurité Informatique

cryptographie

Solution de l'épreuve 8 du challenge Securitech 2006 (SecureTelnet)

Rédigé par devloop - -

NB : L'article traitant d'un cas spécifique de cryptanalyse, il risque d'être difficile à comprendre pour des non-initiés. C'est avec un décalage non négligeable que je rédige cette solution mais comme les solutions officielles ne sont pas disponibles sur le site du challenge, mieux vaut tard que jamais.
Il faut dire qu'un bon nombre de solutions ont été faites sur le net par les participants (voir ce billet.)

Comme toutes les épreuves de l'édition 2006 de ce concours de sécurité informatique, on ne disposait pas d'un énoncé mais uniquement d'un fichier au format pcap (tcpdump, ethereal...) avec quelques trames réseau. Le participant devait alors trouver où était la vulnérabilité et comment l'exploiter.

La page de ressources mettait aussi à disposition un exécutable Linux (ELF) nommé SecureTelnet. Le binaire n'étant pas strippé son analyse ne devrait pas être trop difficile.

Les trames réseau correspondent à une communication entre deux machines, le client (192.168.1.14) et le serveur (193.168.50.86) qui écoute sur le port 2323.
Avec la fonctionnalité "Follow TCP Stream" d'Ethereal on se rend compte très vite que la communication se fait uniquement à l'aide de caractères imprimables (j'ai rajouté les signes inférieur et supérieur pour marquer le sens de la communication, la première ligne émanant du serveur) :
< Secure Telnet 1.0
> VVNFUiBhbGljZQo=
< VVNFUiBhbGljZQo=
> QUxFQQo=
< QUxFQSD4A7SPYPK/qZVDzskNohowqhLukG6ZyBfIx5/1FZf+DpqynvulXaQ7oHIFrhU=
> Q0hBTExFTkdFII/JtptN9pii+JcTxjNk/jU=
< TUVTU0FHRSBCcmF2bywgcG91ciB2YWxpZGVyIGVudHJleiA6IFZBTElETklWTyBbdm90cmUgcHNldWRvXSBbdm90cmUgZW1haWxdCg==

En dehors de l'invite du serveur qui est en clair, on reconnait facilement l'encodage base64 par le jeu de caractères utilisé et l'utilisation du caractère = en fin de ligne.

Une fois décodé la conversation devient :

Lire la suite de Solution de l'épreuve 8 du challenge Securitech 2006 (SecureTelnet)

Revue de pngstego

Rédigé par devloop - -

J'étais passé à côté de pngstego en me disant que ce logiciel de stéganographie utilisant le format PNG n'en vallait pas la peine, comme un certain nombre de programmes qui dissimulent des informations dans des fichiers image.

Il faut dire que pngstego utilise la technique des bits de poids faible (voir Wikipedia: LSB) qui est on ne peut plus classique. Le principe est simple : chaque pixel de l'image est encodé par un code couleur tenant sur un octet dans le fichier. Le dernier bit de cet octet est dis "bit de poids faible" car son état est quasi-insignifiant sur le rendu final de l'image. En effet l'oeil humain ne parviendra pas à distinguer des nuances aussi subtiles entre deux couleurs.

L'avantage de la technique LSB est qu'elle donne un ratio d'un huitième (1/8) pour la dissimulation des données ce qui loin d'être négligeable comparé à un isosteg (moins de 1/700).

Le gros inconvénient de cette technique est quelle est facilement détectable, par exemple avec des outils comme stegdetect de Niels Provos ou Shade (pour l'instant ne supporte que le format BMP).

Afin de rendre plus difficile la récupération des données, pngstego utilise un chiffrement par transposition. Les données à insérer ne sont pas mises dans l'ordre dans l'image mais aléatoirement en utilisant les fonctions C pseudo-aléatoires random() et srandom().
Afin que la personne à qui est destinée l'image générée puisse extraire le message secret, une clé privée doit être connu des deux participants. Cette clé est en fait la "graine" qui a servi à initialiser la fonction srandom(), c'est donc un nombre.

Vous pouvez laisser pngstego le choisir aléatoirement pour vous ou le fixer vous même. Utiliser sa date de naissance ou son numéro de téléphone n'est pas forcément une bonne idée. Je recommande par exemple que vous choisissiez un mot de passe et que vous utilisiez les valeurs décimales/hexadécimales/octales des caractères.

Mais la transposition ne vous protégera pas forcément de l'attaque d'un bon cryptanalyste (en particulier si le message est un texte en clair on peut se fier aux majuscules, ponctuation etc pour retrouver le message original)
C'est pour cela que l'auteur de pngstego conseille d'utiliser un solution de cryptage puissante (GPG) avant de dissimuler les données.

Le code source est très léger et compile facilement (tapper 'make', juste quelques warnings). Il nécessite les entêtes de la librairie png (libpng-devel)

Pour l'exemple nous allons utiliser une photo d'une oeuvre de Banksy. Banksy est un artiste engagé très réputé, principalement pour ses graffitis. Son dernier coup a été de détourner le CD audio de Paris Hilton (vous pouvez trouver des photos sur flickr)

L'image choisie ici est un graff bien connu :
image originale

Et le texte à dissimuler sera Jabberwocky, un poème délirant de Lewis Carroll tiré de "Through The Looking Glass" qui se base sur le principe des mots-valises (portmanteau en anglais)
L'image pesant 68Ko et le texte 961 octets, on rentre largement dans le ratio.

On n'a plus qu'à tapper la commande
./pngstego -s -i bksmall_in.png -m jab.txt bksmall_out.png

qui donne la sortie suivante :
Image size 240 x 160 pixels, 8 bit per pixels
random seed: 917184151
libpng warning: Invalid sBIT depth specified
libpng warning: Invalid sBIT depth specified

Voici l'image résultante :
image obtenue

Cette nouvelle image pèse 2Ko de plus (70Ko)... Je ne suis pas parvenu à déterminer la raison de cette augmentation, il se pourrait que ce soit la regénération par la librairie png qui soit en cause :/

Pour retrouver le message on utilise pngstego en mode extraction et en spécifiant la graine utilisée lors de la création de l'image :
./pngstego -x -i bksmall_out.png -m message.txt -S 917184151

Rien de plus simple !

PS: pngstego ne fonctionne pas avec toutes les images PNG, il accepte les images en niveau de gris 8 bits et les images couleur 8 bits RGB.
Utilisez la commande 'file' pour savoir si une image est utilisable :
$ file bksmall_in.png
bksmall_in.png: PNG image data, 240 x 160, 8-bit/color RGB, non-interlaced

Si on avait obtenu RGBA au lieu de RGB nous n'aurions pas pû utiliser l'image d'exemple.

Deux logiciels de cryptographie

Rédigé par devloop - -

Dans ce billet je vais vous parler de deux logiciels cryptographiques qui se basent sur des concepts ingénieux.

SSSS (pour Shamir's Secret Sharing Scheme) se base sur le principe du secret partagé, plus précisemment sur les travaux du célèbre Adi Shamir sur le sujet.

Le principe du secret partagé est entré depuis longtemps dans nos esprits. Qui n'a pas vu un film dans lequel un trésor est protégé par tout un tas de verrous et auquel on ne pourra accèder qu'une fois que les propriétaires des clés correspondantes seront réunis ?

Mais dans une telle situation on a tendance à voir les clés des différents protagonistes comme autant de mots de passe. Je dirais que du point de vue de SSSS, le mot de passe est le trésor et que les clés... sont simplement des clés cryptographiques. Certes ce ne sont pas des clés publiques puisque leur divulgation permettrait l'accès au trésor par n'importe qui, mais le vol d'une seule clé ne permettrait pas de briser la protection.

Si je dis que le trésor est un mot de passe c'est principalement parce que SSSS ne permet que de cacher une chaine de 128 caractères ASCII maximum.

La commande ssss-split va se charger de répartir le secret à dissimuler dans les différentes clés. Par exemple si je désire cacher le secret dans 8 clés différentes et que ce secret soit accessible par 4 possesseurs de ces clés (quelqu'ils soient), je tape :
ssss-split -t 4 -n 8
Le programme me demande alors d'entrer le secret et 8 clés seront générés :
1-57c86c3b18f3c490
2-208098db24047637
3-c600bba02b41008a
4-a76a68d66263efcc
5-556f77fc199c2934
6-0b2dfbbecc1efb19
7-48a9365210b2b699
8-239ab30fbb4d76e7
Je m'empresse de donner à chacun sa clé et si plus tard nous avons besoin de retrouver ce secret il suffira de réunir 4 membres du groupe et de faire appel à la commande ssss-combine :
$ ssss-combine -t 4
Enter 4 shares separated by newlines:
Share [1/4]: 3-c600bba02b41008a
Share [2/4]: 6-0b2dfbbecc1efb19
Share [3/4]: 8-239ab30fbb4d76e7
Share [4/4]: 1-57c86c3b18f3c490
Resulting secret: l33tp4ss
Dans ce cas là se sont les clés numérotées 3,6,8,1 qui ont permis de retrouver le secret.

C'est dommage que le logiciel soit limité à 128 caractères et ne permette pas de partager des fichiers...
J'ai aussi trouvé un bug assez génant :
$ ssss-combine -t 2
Enter 2 shares separated by newlines:
Share [1/2]: 4-a76a68d66263efcc
Share [2/2]: 7-48a9365210b2b699
Resulting secret: o..Q....
WARNING: binary data detected, use -x mode instead.

Dans le cas où seulement deux clés sont compromises sur les 4 (ou plus), on obtient un mauvais résultat mais dont la longueur est celle du vrai mot de passe.

Pour compiler le logiciel vous aurez besoin de la librairie GMP sur les calculs de grands nombres (paquets gmp et gmp-devel sur SUSE)

Stegeek se base aussi sur le principe des clés multiples mais de façon bien différente. Si je devais donner une référence, je dirais que c'est le principe de la "salle sur demande" dans Harry Potter.
Pour ceux qui ne connaissent pas cela signifie qu'il y a un coffre magique dont le contenu change en fonction de la clé utilisée pour l'ouvrir.

A quoi ce principe peut-il servir en informatique ? Tout simplement à induire en erreur un attaquant qui aurait intercepté le fichier crypté et aurait réussi à en extraire des données (sans intérêt) avec un certain mot de passe alors que les données sensibles seraient protégées avec un mot de passe plus fort

Pour faire fonctionner Stegeek vous devez au préalable créer un fichier qui contiendra les différents mots de passes (un par fichier à dissimuler et un mot de passe par ligne)

Par exemple je crée un nouveau fichier nommé passfile dont le contenu est :

ceciestlepremierpass
thisisthesecondpass
herecomethethirdpassword


Ensuite j'utilise stegeek pour cacher 3 fichiers dans un fichier nommé blah :
$ stegeek -o blah -r 1.5 /etc/passwd /etc/issue /etc/SuSE-release < passfile
/etc/passwd
/etc/issue
/etc/SuSE-release
-----
Adding 3 files.
Enter encryption keys for files
(10-36 chars, first 4 chars must differ from other keys of files in archive)
key 0:key 1:key 2:
Creating archive...
Done.

Maintenant déchiffrons le fichier blah avec le troisième mot de passe, le résultat étant stocké dans le fichier secret :
$ stegeek -e -o secret blah
Enter extraction key: herecomethethirdpassword
Extracting...
Done.
Erreur de segmentation
$ cat secret
SUSE LINUX 10.1 (i586)
VERSION = 10.1

et avec le second mot de passe :
$ stegeek -e -o secret blah
Enter extraction key: thisisthesecondpass
Extracting...
Done.
Erreur de segmentation
$ cat secret
Welcome to SUSE LINUX 10.1 (i586) - Kernel \r (\l).

Malgré quelques erreurs de segmentation tout fonctionne. Malheureusement le projet est mort :'(

Deux logiciels forts intéressants... évidemment il faut trouver l'occasion de les utiliser.

mansteg : stéganographie dans les manpages

Rédigé par devloop - -

Les pages de manuel UNIX, les manpages, se situent généralement dans l'arborescence /usr/share/man et sont stockées compressées (gzippées). Elles permettent d'obtenir des informations sur des commandes ou sur des fonctions du langage C et bien plus encore, le tout en utilisant la commande 'man'.
Si l'on décompresse l'une de ces pages de manuel on découvre des lignes de textes dans un langage de mise en forme nommé Troff.
J'ai développé un petit outil de stéganographie qui utilise les manpages pour dissimuler des informations.
mansteg utilise en effet la possibilité d'insérer des commentaires dans un document troff, commentaires qui ne sont pas visibles lors du rendu de la page de manuel.
Pour cacher un message, mansteg va l'encoder en base64, le découper en blocks de 64 octets et placer le résultat sous forme de lignes de commentaires dans une page de manuel.
L'avantage de cette méthode est qu'il n'y a aucune contrainte de taille comme c'est souvent le cas avec les outils de stéganographie.

Prenons en exemple avec le texte suivant :
Steganography is the art and science of writing hidden messages in such a way that no one apart from the intended recipient knows of the existence of the message; this is in contrast to cryptography, where the existence of the message itself is not disguised, but the content is obscured.
que nous allons dissimuler dans la page de manuel de la commande wget (/usr/share/man/man1/wget.1.gz) :
python hide.py message.txt /usr/share/man/man1/wget.1.gz
Pour étudier le résultat on décompresse wget.1.gz (gunzip wget.1.gz) et on affiche son contenu. Les premières lignes sont :
.\" U3RlZ2Fub2dyYXBoeSBpcyB0aGUgYXJ0IGFuZCBzY2llbmNlIG9mIHdyaXRpbmcg
.\" aGlkZGVuIG1lc3NhZ2VzIGluIHN1Y2ggYSB3YXkKdGhhdCBubyBvbmUgYXBhcnQg
.\" ZnJvbSB0aGUgaW50ZW5kZWQgcmVjaXBpZW50IGtub3dzIG9mIHRoZSBleGlzdGVu
.\" Y2Ugb2YgdGhlCm1lc3NhZ2U7IHRoaXMgaXMgaW4gY29udHJhc3QgdG8gY3J5cHRv
.\" Z3JhcGh5LCB3aGVyZSB0aGUgZXhpc3RlbmNlIG9mIHRoZQptZXNzYWdlIGl0c2Vs
.\" ZiBpcyBub3QgZGlzZ3Vpc2VkLCBidXQgdGhlIGNvbnRlbnQgaXMgb2JzY3VyZWQu
.\" Cg==
.\" ****************************************************************
.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.3
.\"
.\" Standard preamble:
.\" ========================================================================
.de Sh \" Subsection heading
On retrouve notre message encodé, suivi d'une série d'astérisques, ajoutés par mansteg pour délimiter nos commentaires des commentaires déjà présents, puis le début de la page de manuel à proprement parler.

Pour récupérer notre message, rien de plus simple :
# python extract.py /usr/share/man/man1/wget.1.gz
Steganography is the art and science of writing hidden messages in such a way
that no one apart from the intended recipient knows of the existence of the
message; this is in contrast to cryptography, where the existence of the
message itself is not disguised, but the content is obscured.
Les données sont très facilement récupérables pour quelqu'un qui aurait vu le 'truc' étant donné que l'algorithme base64 est réversible est utilisé couremment. Il est donc préférable de crypter le document à cacher avant de l'insérer dans une page de manuel, par exemple avec gpg. C'est développé en Python et téléchargeable ici :
mansteg.tar.bz2