Journal Vérifier ou retrouver un mot de passe sur un fichier XLS/DOC avec pseudo-sécurité XOR

24
4
juin
2011

J'ai eu récemment à retrouver un mot de passe sur un fichier DOC et un fichier XLS (deux formats propriétaires créés par Microsoft). Il s'agissait d'un mot de passe bloquant l'ouverture des fichiers, stocké dans une méthode basique, le XOR (l'algo est légèrement différent pour les deux formats).

Visiblement lorsque l'on cherche un peu des logiciels pour faire le boulot, on ne trouve pas de logiciel libre (genre John the Ripper ou autres), uniquement des logiciels propriétaires (et pour Windows).

Après avoir lu le support de présentation d'Éric Filiol de Pacsec 2009, jeté un coup d'oeil rapide aux (milliers de pages de) spécifications et retrouvé l'algo en question dans OpenOffice.org/LibreOffice (forcément faut bien qu'ils les ouvrent lui aussi), j'ai commis un petit programme pour vérifier un mot de passe (ou en tester plein si on est motivé).

Le tout est disponible sour licence LGPLv3 (histoire de garder la même licence que les 2 fichiers OpenOffice.org utilisés). Cf http://oumph.free.fr/textes/xor_me-0.1.tar.gz

Voilà, ça n'a pas un intérêt fabuleux en soi, mais bon c'était amusant à faire. Et ça ne fait que ça : du XOR, sur du DOC ou du XLS.

Le résultat :

On récupère un couple clé/hash pour un fichier doc donné.

$ ./xor_doc some.doc
Could be a XOR-ciphered doc file.
nKey d10d
nHash cc1f

On essaie un mot de passe au pif.

$ ./xor_me toto 0xd10d 0Xcc1f
Algorithm XOR MS Word
Key: d10d
Hash: cc1f
FAIL! toto

On essaie le bon mot de passe.

$ ./xor_me 0824 0xd10d 0Xcc1f
Algorithm XOR MS Word
Key: d10d
Hash: cc1f
Good guess: 0824

Même chose sur un XLS :

$ ./xor_xls some.xls
Bored by reading the specs... Just pick up a XOR encryption pattern
Record type FilePass with 2F 00.
followed by 00 06 for size.
followed by 00 00 for wEncryptionType XOR.
followed by what you want: 2 bytes for key, 2 bytes for hash.
WARNING: little endian, you should permute bytes
00000210 06 03 00 00 86 00 00 00 2f 00 06 00 00 00 9a 49 |......../......I|
00000220 61 cc e1 00 02 00 b0 04 c1 00 02 00 ca a4 e2 00 |a...............|

Un mot de passe au pif :

$ ./xor_me 4242 0x499a 0Xcc61 1
Algorithm XOR MS Excel
Key: 499a
Hash: cc61
FAIL! 4242

Le bon mot de passe :

$ ./xor_me 1950 0x499a 0Xcc61 1
Algorithm XOR MS Excel
Key: 499a
Hash: cc61
Good guess: 1950

Comme on dit, « XOR Ne crains rien, il nous protégera ».

  • # Joli travail !

    Posté par . Évalué à  6 .

    Et chouette initiative, j’espère que ta page sera bien référencée dans les moteurs de recherches que ton code puisse servir un maximum de personnes.

    Please do not feed the trolls

  • # ...

    Posté par . Évalué à  -6 .

    arf c'est du c++ tout moche.

    Sinon le commentaire dans le code a l'air de dire que c'est que pour les vielles version de Word : jusqu'a 95.

    • [^] # Re: ...

      Posté par . Évalué à  9 .

      Tu peux le faire en ruby si tu veux. Tu testeras 100x moins de cas par secondes, mais si ça t'amuses..

      • [^] # Re: ...

        Posté par . Évalué à  3 .

        Il existe des moyens intermédiaires, par exemple en Python, il y a Cython, Pyrex, Psyco.

  • # Utilisation éthique, bien entendu

    Posté par (page perso) . Évalué à  10 .

    Il est rappelé que ce type d'application n'a que deux applications possibles:
    - vérifier que son mot de passe est difficile à trouver
    - retrouver un mot de passe perdu

    Il va de soi que comme l'écrasante majorité des utilisateurs de ce logiciel, vous vous engagez à ne pas tenter de trouver le mot de passe d'un fichier auquel vous n'êtes pas censé avoir accès.

    • [^] # Re: Utilisation éthique, bien entendu

      Posté par (page perso) . Évalué à  5 .

      De toutes façons, l'auteur a en plus pensé a ajouter de gros rectangles noirs graphiques par dessus les parties de texte auxquelles on ne doit pas avoir accès. Donc c'est sécurisé, pas de risque de fuite d'info confidentiemlle.
      :-)

    • [^] # Re: Utilisation éthique, bien entendu

      Posté par . Évalué à  7 .

      Si quelqu'un ne veut pas que j'accède à ses documents, il n'a qu'à prendre des mesures efficaces pour ça. Et non, mettre à la fin d'un email qu'il faut le détruire si je n'en suis pas le destinataire n'est pas une mesure efficace (par exemple).

      Tous les nombres premiers sont impairs, sauf un. Tous les nombres premiers sont impairs, sauf deux.

      • [^] # Re: Utilisation éthique, bien entendu

        Posté par (page perso) . Évalué à  5 .

        Ah ça c'est ce que j'ai toujours aimé sur ces protections légales "corporate":
        Mettre un message à la fin pour dire que si t'es pas le destinataire prévu, faut pas garder le mail sinon poursuites légales et tout ça.

        Pourquoi ne pas le mettre carrément au début du mail et demander de ne pas lire au-delà de la certitude que le mail ne vous est pas destiné?
        On sait bien que le mail sera sûrement lu quand même, mais on n'est plus vraiment à ça près...

  • # C'est beau le libre

    Posté par (page perso) . Évalué à  5 .

    NoNo en a déjà fait une version améliorée. Cf https://github.com/nono/xor_me (notamment des optimisations et le brute-force jusqu'à 5 caractères).

    • [^] # Re: C'est beau le libre

      Posté par (page perso) . Évalué à  2 .

      Le brute force fonctionne jusqu'à 8 caractères si on est patient.

      En pratique, avec la dernière version, on met moins d'une seconde pour un mot de passe de 5 caractères, et quelques secondes à quelques dizaines de secondes pour un de 6 caractères. Pour 7, j'imagine que ça doit se compter en heures, et pour 8, en jours.

      • [^] # Re: C'est beau le libre

        Posté par . Évalué à  2 .

        Ça peut se paralléliser. La façon la plus simpliste (pour rester dans la veine "simple" du reste du code), est de laisser l'utilisateur lancer lui même autant de processus "brute_force" que de processeurs, en passant à l'exécutable un paramètre qui subdivisera l'intervalle de la boucle "o".

  • # Méthode détournée

    Posté par . Évalué à  4 .

    J'ai eu à utiliser il y a peu un logiciel pour trouver le mot de passe de fichiers Microsoft Word. Une personne ayant quitté l'entreprise en mauvais termes ne voulait pas donner le mot de passe.
    Option 1: démarches administratives, plainte, etc
    Option 2: me téléphoner
    Ca m'a pris moins de 10 minutes car je connais un logiciel pas trop crade pour faire ça.

    Ce logiciel permet de trouver les mots de passe. C'est infaisable si le mot de passe est long.
    Il permet également de carrément supprimer la protection de manière instantanée. Ca ne t'indique pas le mot de passe, mais ton fichier devient lisible sans problème.

    J'en conclu que le mot de passe ne sert pas à chiffrer le document, ni à chiffre une éventuelle zone permettant de lire le document (donc c'est nul, on avait compris).
    C'est méga-rapide. Pour le moment aucun fichier n'a résisté.

    • [^] # Re: Méthode détournée

      Posté par . Évalué à  2 .

      J'en conclu que le mot de passe ne sert pas à chiffrer le document, ni à chiffre une éventuelle zone permettant de lire le document (donc c'est nul, on avait compris).
      C'est méga-rapide. Pour le moment aucun fichier n'a résisté.

      Et Patrick se rendit compte que le support de présentation d'Éric Filiol de Pacsec 2009, le coup d'oeil rapide aux (milliers de pages de) spécifications, la trouvaille de l'algo en question dans OpenOffice.org/LibreOffice et le petit programme pour vérifier un mot de passe, tout ça, c'était pour (presque) rien.

      Échec !

      • [^] # Re: Méthode détournée

        Posté par . Évalué à  3 .

        Certains ont trouvé une astuce pour faire sauter le mot de passe de manière instantanée, ils font payer pour ça. Les libristes n'ont pas encore trouvé (l'intérêt est limité si ce n'est pas pour vendre le logiciel).

        Je ne vois pas où est ton problème.

        • [^] # Re: Méthode détournée

          Posté par (page perso) . Évalué à  3 .

          Déjà ici on teste un mot de passe ou on bruteforce. Y a d'autres méthodes plus subtiles genre cryptanalyse XOR (soyons clair, c'est très faible du XOR avec un mot de passe de quelques caractères sur du texte répétitif, d'ailleurs c'est ce que dit le document cité en référence de É. Filiol http://www.esiea-recherche.eu/data/filiol_pacsec.pdf ). Mais bon pour trouver des mots de passe à 4 chiffres, autant faire simple, là aussi c'est instantané...

          J'ai cru voir que certains des logiciels propriétaires vendus vont juste envoyer à un serveur le hash et récupérer des mots de passe possibles précalculés.

          Enfin le plus important à mon avis c'est que ça existe en libre et que ça ait été fun... D'une part je me fiche un peu du concours de la plus longue avec un logiciel proprio qui ne tourne pas sur ma machine, et d'autre part j'aurais pu arrêter immédiatement après avoir trouver les mots de passe sans chercher à mettre plus au propre le bout de code.

    • [^] # Re: Méthode détournée

      Posté par (page perso) . Évalué à  2 .

      Il y a plusieurs algo de toute façon (du XOR, du RC4, de l'AES, etc.), plusieurs façons de les utiliser, etc.

  • # Un bug

    Posté par (page perso) . Évalué à  2 .

    Dans un Excel que j'ai, il trouve pas la zone du mot de passe avec hexdump. Comme quoi, ça peut servir de lire les specs ;-)

    ⚓ À g'Auch TOUTE! http://agauch.fr

    • [^] # Re: Un bug

      Posté par (page perso) . Évalué à  3 .

      Je dirais deux possibilités :

      • ce n'est pas l'algo XOR qui est utilisé (fichier non XLS, fichier non verrouillé par mot de passe, autre algo comme RC4 ou AES)

      ou

      • la zone en question est coupée sur deux lignes
      • [^] # Re: Un bug

        Posté par (page perso) . Évalué à  2 .

        1: c'est du XLS sur Office XP, par exemple la commande file me dit

        SosServeurs.xls: CDF V2 Document, Little Endian, Os: Windows, Version 5.1, Code page: 1252, Last Saved By: XXXXX, Last Saved Time/Date: XXXXXXXXXXXXX, Security: 1

        2: J'ai cherché, et même coupé sur deux lignes, pas de "2f 00 06".

        ⚓ À g'Auch TOUTE! http://agauch.fr

        • [^] # Re: Un bug

          Posté par (page perso) . Évalué à  4 .

          En cherchant "00 2f 00" (au pire "00 2f"...) tu devrais trouver la zone FilePass. Si elle n'est pas suivi par "06 00 00" ("00 06 00 00") ce n'est pas du XOR. Tu n'as plus qu'à lire la spéc sur FilePass :).

          • [^] # Re: Un bug

            Posté par (page perso) . Évalué à  2 .

            Ok, ce n'est donc pas du X-Or, tant que Ooo sait l'ouvrir avec le mot de passe .... je m'en contenterai.

            ⚓ À g'Auch TOUTE! http://agauch.fr

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.