Stéganographie dans le système de fichiers à disque optique

En recherchant des informations intéressantes sur la stéganographie, je suis tombé sur un article divertissant sur la stéganographie dans le système de fichiers , et après un certain temps, cela m'a conduit à l'idée de créer la stéganographie dans le système de fichiers des disques optiques.

Probablement ces jours-ci, il n'y a presque plus de personnes qui utiliseraient des disques dans la vie quotidienne, car une option plus digne face aux lecteurs flash est venue les remplacer.

Avec un peu de réflexion, j'ai décidé que les disques peuvent toujours être trouvés, par exemple, à l'intérieur de leur système de fichiers, vous pouvez masquer certaines informations secrètes puis les transférer vers un autre afin que personne ne soupçonne rien.

C'est ce que nous ferons, à savoir: nous utiliserons la bibliothèque python, qui nous aidera à encoder les informations d'un fichier texte, puis les cacher dans les entrailles de notre disque.

image

Mais avant de commencer, jetons d'abord un coup d'œil à certaines des petites choses, et définissons également le concept d'un disque optique.

Qu'est-ce qu'un disque optique?


Disque optique (Eng. Optical disc) - nom collectif des supports de stockage réalisés sous forme de disques, dont la lecture est effectuée à l'aide d'un rayonnement optique (laser).

image

Chaque disque de l'ordinateur est présenté dans un format spécifique sous la forme d'une image qui contient toutes les informations et la structure du disque, et il est utilisé pour travailler avec des informations sans support optique, ainsi que des données d'archives sur des supports solides
Le format standard des disques optiques est iso9660 , mais il reste
Gardez à l'esprit que l'image contient moins d'informations que le CD d'origine. Le disque contient des informations de service, qui peuvent notamment être utilisées pour se protéger contre la copie. Nous travaillerons avec ISO9660.

Regard intérieur


Et maintenant, regardons la structure de l'iso9660 de l'intérieur, vous pouvez trouver des informations détaillées ici , ici et ici , et pour ceux qui connaissent l'anglais aussi ici . De moi-même, je dirai simplement qu'il se compose principalement de 2 descripteurs: Boot Record et Primary Volume Descriptor (PVD) , vous pouvez ouvrir n'importe quel iso dans 010editor et voir par vous-même.

image

L'enregistrement de démarrage peut être utilisé par les systèmes qui ont besoin d'initialiser de nombreux types de données avant de rendre un disque disponible, bien que ISO 9660 n'indique pas quelles informations dans l'enregistrement de démarrage ou comment les utiliser du tout.

Le PVD est le point de départ de l'identification de l' iso9660, il ressemble à ceci:

image

image

Pour les amateurs de régimes:

image

Vous trouverez plus d'informations ici.

Et nous allons de l'avant.

Initialisation dans la structure ISO


Nous travaillerons avec le répertoire racine, nous y créerons nos propres répertoires et ajouterons les fichiers nécessaires.

Pour cela, nous utiliserons la bibliothèque pycdlib , vous pouvez vous familiariser avec elle en cliquant sur le lien suivant .

Passons à l'écriture du programme, mais qui ne veut pas aller pas à pas, vous trouverez le code source sur le lien vers mon référentiel dans github:

#     import base64 import pycdlib 

Préparer des fichiers avec du texte


Maintenant, nous devons préparer nos fichiers, que nous allons insérer dans la structure de notre iso.

Le plan d'action est le suivant:

  1. Nous prenons le texte source dans certains fichiers et le lisons dans des variables - rien ne nous empêche de prendre beaucoup de texte, mais pour la démonstration, je n'ai pris que quelques phrases dans chaque fichier - nous continuerons à manipuler ces variables
  2. Après avoir considéré les phrases, nous devons encoder le contenu. Nous allons encoder en utilisant base64
  3. Nous écrivons le contenu encodé dans de nouveaux fichiers appelés UP et DOWN . Les fichiers sont ainsi appelés parce que j'ai décidé de réorganiser de telle manière que 1 partie du 1er fichier et 1 partie du 2e fichier (c'est-à-dire les parties supérieures) soient écrites en UP , et en DOWN 2 parties du 1er fichier et 2 parties du 2e fichier ( c'est-à-dire les parties inférieures)

 with open('/home/ul/stegist1.txt','rb') as stegist1:#   for line1 in stegist1.readlines(2): print(line1)#   1  for line2 in stegist1.readlines(2): print(line2)#   1  stegist1.close() enc_line1=base64.b64encode(line1)#     base64 enc_line2=base64.b64encode(line2) with open('/home/ul/stegist2.txt','rb') as stegist2: for line3 in stegist2.readlines(2):#   2  print(line3) for line4 in stegist2.readlines(2):#   2  print(line4) stegist2.close() enc_line3=base64.b64encode(line3)#   print(enc_line3) enc_line4=base64.b64encode(line4) print(enc_line4) with open('/home/ul/UP.txt','ab') as up:#  UP    up.write(enc_line1) up.write(enc_line3) with open('/home/ul/DOWN.txt','ab') as down:#  DOWN    down.write(enc_line2) down.write(enc_line4) 

Dissimulation


Il est temps de passer à la bibliothèque très pycdlib dont j'ai parlé au début. Ce n'est pas difficile de travailler avec lui: nous créons un objet à travers lequel nous ajoutons divers fichiers et répertoires à l'intérieur.

 iso=pycdlib.PyCdlib() #   PyCdlib iso.new(rock_ridge='1.09')#  rockridge(    iso   ) iso.add_directory(iso_path='/A1',rr_name='a1')#  (  ) iso.add_directory(iso_path='/B1',rr_name='b1') iso.add_directory(iso_path='/B1/B2',rr_name='b1b2') iso.add_directory(iso_path='/A1/A2',rr_name='a1a2') iso.add_file('/home/ul/stegistup.txt', iso_path='/A',rr_name='a')#   up iso.add_file('/home/ul/stegistdown.txt', iso_path='/B',rr_name='b')#   down iso.write('papastegisto.iso')#  iso () 

Comme nous pouvons le voir, notre texte a été écrit avec succès

image

Je veux remarquer que nous pouvons créer dans un certain chemin, par exemple / A , soit un fichier ou un dossier.

Si nous spécifions d'abord la création d'un répertoire dans / A , puis spécifions la création d'un fichier dans / A, un message d'erreur s'affiche, ce n'est pas la même chose que de placer le fichier dans un dossier.

Extensions pour le système de fichiers ISO9660


Il existe 2 extensions principales pour le système de fichiers iso: RockRidge et Joilet .

Rockidge


Il s'agit d'une extension de système de fichiers ISO 9660 conçue pour stocker les attributs de fichiers utilisés dans les systèmes d'exploitation POSIX (c'est-à-dire compatibles Unix).

Les extensions Rock Ridge sont écrites sur le système de fichiers ISO 9660 afin que le disque optique Rock Ridge puisse être lu par un logiciel conçu pour fonctionner avec ISO 9660.

Plus de détails
Rock Ridge peut stocker les informations supplémentaires suivantes sur le contenu du disque:

  • noms de fichiers longs (jusqu'à 255 caractères);
  • moins de restrictions sur l'utilisation des caractères dans les noms de fichiers;
  • structure de répertoires d'imbrication arbitraire.
  • pour chaque fichier, les attributs sont écrits:
  • autorisations de fichier, y compris les champs uid et gid;
  • nombre de liens durs vers le fichier;
  • temps de création, modification, accès, changement d'attributs, etc.
  • fichiers spéciaux pris en charge:
  • fichiers épars;
  • liens symboliques;
  • fichiers de périphérique
  • fichiers de socket
  • Fichiers FIFO.

Ces données sont enregistrées dans des répertoires spéciaux, dont les noms sont généralement masqués.

Joilet


Il s'agit d'une extension de système de fichiers ISO 9660 conçue pour alléger les restrictions de nom de fichier imposées par ISO 9660. La spécification a été développée par Microsoft et a été prise en charge par toutes les versions de Microsoft Windows depuis Windows 95 et Windows NT 4.0.
Par défaut, il est utilisé sur tous les supports de CD-ROM avec des données publiées après 1995.

Plus de détails
Joliet introduit un ensemble supplémentaire de noms de fichiers. Les noms contiennent jusqu'à 64 caractères Unicode et sont stockés dans le codage UCS-2. Pour leur stockage, un en-tête supplémentaire spécial (Descripteur de volume supplémentaire, SVD) est utilisé, qui est inconditionnellement ignoré par les programmes compatibles ISO 9660, assurant ainsi une compatibilité descendante.

La plupart des plates-formes logicielles existantes, notamment Microsoft Windows, Linux, Mac OS X et FreeBSD, sont capables de lire des supports de stockage avec l'extension de système de fichiers Joliet, qui permet d'échanger des fichiers entre ces systèmes d'exploitation même en utilisant des alphabets non latins (tels que l'arabe, le japonais, le cyrillique) ce qui n'était pas possible avec l'ISO 9660 habituel.

En fait, il existe également une extension 3 pour le système de fichiers iso, elle s'appelle Romeo .

Il s'agit d'une extension d'ISO 9660 pour MS Windows 95, il n'y a pas suffisamment d'informations à ce sujet sur Internet, et cette extension n'est probablement pas utilisée ailleurs.

Vous pouvez trouver encore plus d'informations sur les extensions et les systèmes de fichiers pour CD / DVD ici , et maintenant revenons à notre programme.

Le code résultant pour l'encodage des informations d'un fichier et le placement des fichiers avec des informations encodées dans iso ressemble à ceci:

 #     import base64 import pycdlib #   with open('/home/ul/stegist1.txt','rb') as stegist1: #  for line1 in stegist1.readlines(2): print(line1) #  for line2 in stegist1.readlines(2): print(line2) #  enc_line1=base64.b64encode(line1) print(enc_line1) enc_line2=base64.b64encode(line2) print(enc_line2) with open('/home/ul/stegist2.txt','rb') as stegist2: #  for line3 in stegist2.readlines(2): #  print(line3) for line4 in stegist2.readlines(2): #  print(line4) enc_line3=base64.b64encode(line3) #  print(enc_line3) enc_line4=base64.b64encode(line4) print(enc_line4) with open('/home/ul/UP.txt','ab') as up: #  UP    up.write(enc_line1) up.write(enc_line3) with open('/home/ul/DOWN.txt','ab') as down: #  DOWN    down.write(enc_line2) down.write(enc_line4) #   iso iso=pycdlib.PyCdlib() iso.new(rock_ridge='1.09') iso.add_directory(iso_path='/A1',rr_name='a1') iso.add_directory(iso_path='/B1',rr_name='b1') iso.add_directory(iso_path='/B1/B2',rr_name='b1b2') iso.add_directory(iso_path='/A1/A2',rr_name='a1a2') iso.add_file('/home/ul/stegistup.txt', iso_path='/A',rr_name='a') iso.add_file('/home/ul/stegistdown.txt', iso_path='/B',rr_name='b') iso.write('papastegisto.iso') 

Et je vous rappelle que le code complet est également disponible sur le lien vers le github
Passons maintenant à la partie finale - écrivez notre iso résultante sur le disque
Vous pouvez enregistrer ce que vous voulez, je vais utiliser Nero 7
Nous utiliserons le CD-R
CD-ROM, CD-R et CD-RW
Ils diffèrent en ce que le CD-ROM est un disque en lecture seule, rien ne peut y être écrit. Les CD-R et CD-RW sont des disques enregistrables. CD-R vous permet d'écrire une fois sur un disque, CD-RW - à plusieurs reprises.

Mais qu'en est-il du DVD?

La principale différence par rapport aux CD-R / RW est la quantité de données qui peuvent être écrites sur un DVD-ROM de 4,7 Go contre 650 700 Mo. Certains formats de DVD prennent en charge jusqu'à 13 et même 17 Go
Plus d'informations sur le disque

Comme nous pouvons le voir, le programme a été correctement écrit sur le disque.

image

Nous pouvons maintenant le transférer sur disque aux personnes que nous voulons.

Décodage


Pourquoi ferions-nous tout cela si les informations ne peuvent pas être décodées, non?

Si vous êtes intéressé par la méthode, vous pouvez écrire un programme qui extraira et décodera les fichiers joints, ce sera exactement ce que vos employés utiliseront.

Et c'est tout. Ma tâche consistait à démontrer une des manières possibles de cacher des informations, en utilisant des disques qui, semble-t-il, sont tombés dans l'oubli.

image

Je serai heureux de voir vos suggestions, ajouts, corrections et autres commentaires.

PS Je tiens à remercier tout particulièrement @PavelMSTU pour les consultations et les coups de pied de motivation.

Source: https://habr.com/ru/post/fr449016/


All Articles