L'histoire d'un cas de test "cassé", ou soyez prudent avec les versions d'OpenSSL ...

Avertissement. Je ne suis pas un "vrai soudeur", mais en raison de ma recherche de travaux intéressants dans le domaine de la sécurité de l'information, je résous réguliÚrement depuis peu divers CTF et machines sur HackTheBox. Par conséquent, quand on m'a envoyé un lien vers l'un des items de test de style CTF, je n'ai pas pu passer ...







La signification de l'item de test est assez simple. Un vidage du trafic est donné, qui contient une clé de chiffrement, des déchets et un indicateur chiffré. Nous devons les extraire et déchiffrer le drapeau. La commande OpenSSL avec laquelle cet indicateur a été chiffré est également affichée. Le trafic est assez intéressant, mais aprÚs 10 lignes de code python, j'avais une clé de cryptage, des ordures et un drapeau crypté devant moi. Il semblerait, qu'est-ce qui pourrait mal tourner?



L'affectation indique que le drapeau a été crypté avec environ la commande suivante (j'ai omis certains paramÚtres insignifiants et changé l'algorithme de cryptage).



echo "FLAG_xxxx
xxxxxx" | openssl enc -e -base64 -aes-256-cbc -nosalt -k $password 
      
      





J'ai insĂ©rĂ© les paramĂštres obtenus Ă  partir du trafic dans la commande, l'ai dĂ©marrĂ© et ... j'ai eu des ordures! J'ai rĂ©essayĂ©. Des ordures Ă  nouveau. J'ai essayĂ© de reconstruire le trafic de diffĂ©rentes maniĂšres. Non, apparemment, le trafic ne peut ĂȘtre collectĂ© que sans ambiguĂŻtĂ©. Mais la sortie de chiffrement est encore une poubelle !!! Dans le mĂȘme temps, OpenSSL avertit honnĂȘtement qu'obtenir une clĂ© d'un mot de passe en 1 passage est une mauvaise idĂ©e ...



echo "ENCRYPTED_FLAG" | openssl enc -d -base64 -aes-256-cbc -nosalt -k $key 
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
      
      





Le lendemain a été passé à essayer de briser cette folie. J'ai raisonnablement pensé qu'apparemment j'avais isolé incorrectement les "déchets" spécifiés dans les conditions et j'ai écrit plusieurs options pour diviser la chaßne résultante en "mot de passe" et "drapeau chiffré" pour la "force brute" ultérieure. Cela n'a pas aidé ... J'ai commencé à comprendre profondément chacun des paramÚtres.



Comme nous le savons, AES nĂ©cessite une clĂ© de cryptage et IV (vecteur d'initialisation) pour fonctionner. L'option -k nous permet d'utiliser une phrase de texte, Ă  partir de laquelle OpenSSL lui-mĂȘme obtient la clĂ© requise et IV. Vous pouvez les voir en utilisant le paramĂštre -p.



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
iv =3B02902846FFD32E92FF168B3F5D16B0
C11kA+GcqkU4ocOvZAVr3g==
      
      





Cette connaissance ne m'a rien donnĂ© non plus. Puis j'ai nĂ©anmoins dĂ©cidĂ© de revenir Ă  l'idĂ©e la plus folle qui m'est venue. À savoir: le problĂšme n'est pas avec moi, mais quelque chose a changĂ© dans OpenSSL ... Le

trafic Ă©tait datĂ© de 2016, j'ai donc pris Ubuntu 14.04 et, sans trop d'espoir de succĂšs, je viens d'y insĂ©rer les donnĂ©es initiales. Et du coup, au lieu de poubelle, j'ai un DRAPEAU! La soirĂ©e a cessĂ© d'ĂȘtre langoureuse ... De plus, la mĂȘme commande avec le mĂȘme mot de passe et le paramĂštre -p a produit des clĂ©s de chiffrement et des IV complĂštement diffĂ©rentes!



NOUVEAU SYSTÈME (openssl 1.1.1h)



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
*** WARNING : deprecated key derivation used.
Using -iter or -pbkdf2 would be better.
key=5E884898DA28047151D0E56F8DC6292773603D0D6AABBDD62A11EF721D1542D8
iv =3B02902846FFD32E92FF168B3F5D16B0
C11kA+GcqkU4ocOvZAVr3g==

      
      





ANCIEN SYSTÈME (openssl 1.0.1f)



echo "FLAG_123" | openssl enc -e -base64 -aes-256-cbc -nosalt -p -k "password"
key=5F4DCC3B5AA765D61D8327DEB882CF992B95990A9151374ABD8FF8C5A7A0FE08
iv =B7B4372CDFBCB3D16A2631B59B509E94
R3N+5v3zOz9QcNt08cwqcA==
      
      





Il est devenu clair que les craintes se confirmaient. L'algorithme de gĂ©nĂ©ration de Key et IV Ă  partir d'une phrase de passe a changĂ©, ce qui a complĂštement cassĂ© la capacitĂ© de rĂ©soudre de front CTF sur les versions modernes d'OpenSSL. Dans le processus de recherche des nuances de l'implĂ©mentation, je suis tombĂ© sur un travail trĂšs intĂ©ressant " Analyse de cryptage OpenSSL basĂ©e sur le mot de passe du protocole de dĂ©rivation de clĂ© " et tout s'est mis en place. En bref, dans la version 1.1.0, un nouveau protocole de gĂ©nĂ©ration de clĂ©s Ă  partir d'un mot de passe PBKDF2 a Ă©tĂ© ajoutĂ©, mais plus important encore, l'ancien algorithme PBKDF1 a changĂ© l'algorithme de hachage par dĂ©faut de MD5 Ă  SHA-256! Ainsi, le mĂȘme mot de passe produit des clĂ©s et des IV diffĂ©rentes. Pour dĂ©chiffrer prĂ©cĂ©demment chiffrĂ©, dans les versions plus rĂ©centes, vous devez utiliser le paramĂštre -md md5 .



"-Md messagedigest: spécifiez le résumé de message utilisé pour la dérivation de clé de md2, md5, sha ou sha1 "



AprĂšs avoir ajoutĂ© ce paramĂštre, il est devenu possible d'obtenir le drapeau sur le nouvel OpenSSL. Je ne sais pas si une telle «nuance» a vraiment Ă©tĂ© prise en compte par les dĂ©veloppeurs de la tĂąche de test ou ils ne l’ont tout simplement pas testĂ©e sur des systĂšmes modernes, mais il n’en reste pas moins que j’ai dĂ» me plonger profondĂ©ment dans certaines des subtilitĂ©s d’OpenSSL.



PS Grùce à mes connaissances, j'ai déjà informé les développeurs du test de test du problÚme que j'ai trouvé, sinon ils sont tout à coup trÚs surpris que ces personnes ne viennent pas chez eux ...



All Articles