{"id":210,"date":"2020-05-06T12:04:14","date_gmt":"2020-05-06T10:04:14","guid":{"rendered":"https:\/\/blog.caturday-lovers.fr.nf\/?p=210"},"modified":"2020-05-06T17:34:20","modified_gmt":"2020-05-06T15:34:20","slug":"les-chatons-ont-la-reponse-fcsc-2020-revision","status":"publish","type":"post","link":"https:\/\/blog.caturday-lovers.fr.nf\/?p=210","title":{"rendered":"Les chatons ont la r\u00e9ponse \u2013 FCSC 2020 \/\/ Revision"},"content":{"rendered":"\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"498\" height=\"672\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-04_17h28_38-2.png\" alt=\"\" class=\"wp-image-211\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-04_17h28_38-2.png 498w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/2020-05-04_17h28_38-2-222x300.png 222w\" sizes=\"auto, (max-width: 498px) 100vw, 498px\" \/><\/figure><\/div>\n\n\n\n<!--more-->\n\n\n\n<h2 class=\"wp-block-heading\">Intro<\/h2>\n\n\n\n<p>D\u00e9j\u00e0 \u00e0 l&rsquo;\u00e9cole, on me le disait, \u00ab\u00a0prends ton temps, lis bien le probl\u00e8me, c&rsquo;est avant tout une question de fran\u00e7ais\u00a0\u00bb. J&rsquo;ai perdu \u00e9norm\u00e9ment de points car je n&rsquo;ai vu le bouton comparator.py qu&rsquo;au bout d&rsquo;une semaine !<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"286\" height=\"192\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/tenor.gif\" alt=\"\" class=\"wp-image-219\"\/><figcaption>oui bon c&rsquo;\u00e9tait mon premier CTF en mode comp\u00e9titeur !<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">R\u00e9vision, o\u00f9 comment gagner un repas au resto offert par ton sysadmin<\/h2>\n\n\n\n<p>Le principe est simple, on envoie deux documents, via le site web, et cela les archive. Jusque l\u00e0 tout va bien, mais tr\u00e8s vite cela va devenir le drame.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">comparator.py<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># coding: utf-8\nimport hashlib\nfrom web.services.database import Database\nfrom web.services.mailer import Mailer\n\n\nclass ComparatorError(Exception):\n    \"\"\"Base class for all Comparator exceptions\"\"\"\n    pass\n\n\nclass DatabaseError(ComparatorError):\n    \"\"\"Exception raised for errors in database operations.\"\"\"\n\n\nclass StoreError(ComparatorError):\n    \"\"\"Exception raised for errors in store function.\n\n    Attributes:\n        message -- explanation of the error\n    \"\"\"\n\n    def __init__(self, files, message):\n        self.files = files\n        self.message = message\n\n\nclass Comparator(object):\n    \"\"\"A class for Comparator\"\"\"\n\n    BLOCK_SIZE = 8*1024\n\n    def __init__(self, f1=None, f2=None):\n        \"\"\"\n        Set default parameters\n\n        Required parameters :\n            f1: open file handler\n            f2: open file handler\n            db: database\n            m : mailer\n\n        \"\"\"\n        self.f1 = f1\n        self.f2 = f2\n        self.db = Database()\n        self.m = Mailer()\n\n    def compare(self):\n        self._reset_cursor()\n        return self.f1.read() == self.f2.read()\n\n    def store(self):\n        self._reset_cursor()\n        f1_hash = self._compute_sha1(self.f1)\n        f2_hash = self._compute_sha1(self.f2)\n\n        if self.db.document_exists(f1_hash) or self.db.document_exists(f2_hash):\n            raise DatabaseError()\n\n        attachments = set(&#91;f1_hash, f2_hash])\n        # Debug debug...\n        if len(attachments) &lt; 2:\n            raise StoreError(&#91;f1_hash, f2_hash], self._get_flag())\n        else:\n            self.m.send(attachments=attachments)\n\n    def _compute_sha1(self, f):\n        h = hashlib.sha1()\n        buf = f.read(self.BLOCK_SIZE)\n        while len(buf) > 0:\n            h.update(buf)\n            buf = f.read(self.BLOCK_SIZE)\n        return h.hexdigest()\n\n    def _reset_cursor(self):\n        self.f1.seek(0)\n        self.f2.seek(0)\n\n    def _get_flag(self):\n        with open('flag.txt', 'r') as f:\n            flag = f.read()\n        return flag\n<\/code><\/pre>\n\n\n\n<p>Si l&rsquo;on analyse le code rapidement, il sert \u00e0 comparer deux documents, et si tout va bien il les envoie par mail, si une grosse erreur arrive, il l\u00e8ve l&rsquo;exception qui nous donne le flag :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    def store(self):\n        self._reset_cursor()\n        f1_hash = self._compute_sha1(self.f1)\n        f2_hash = self._compute_sha1(self.f2)\n\n        if self.db.document_exists(f1_hash) or self.db.document_exists(f2_hash):\n            raise DatabaseError()\n\n        attachments = set(&#91;f1_hash, f2_hash])\n        # Debug debug...\n        if len(attachments) &lt; 2:\n            raise StoreError(&#91;f1_hash, f2_hash], self._get_flag())\n        else:\n            self.m.send(attachments=attachments)<\/code><\/pre>\n\n\n\n<p>OK, mais comment obtenir cette exception alors ? La comparaison se fait par le Hash des fichiers, et le bloc juste apr\u00e8s, nous voyons qu&rsquo;il va utiliser une somme SHA1 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    def _compute_sha1(self, f):\n        h = hashlib.sha1()\n        buf = f.read(self.BLOCK_SIZE)\n        while len(buf) > 0:\n            h.update(buf)\n            buf = f.read(self.BLOCK_SIZE)\n        return h.hexdigest()<\/code><\/pre>\n\n\n\n<p>Et vous savez quoi mes chatons ? Il existe une collision SHA1, deux documents craft\u00e9s peuvent avoir la m\u00eame somme SHA1 (alors que th\u00e9oriquement, cela \u00e9tait impossible).<br>Je vous laisse regarder ce <a rel=\"noreferrer noopener\" href=\"https:\/\/shattered.it\/\" target=\"_blank\">site <\/a>qui explique le souci, et ce qui est bien c&rsquo;est qu&rsquo;il fournit deux PDF craft\u00e9 avec la collision, c&rsquo;est parfait !<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"759\" height=\"376\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-16.png\" alt=\"\" class=\"wp-image-212\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-16.png 759w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-16-300x149.png 300w\" sizes=\"auto, (max-width: 759px) 100vw, 759px\" \/><figcaption>Logique !<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Let&rsquo;s forge our file !<\/h2>\n\n\n\n<p>Le site a d\u00e9j\u00e0 ce hash en m\u00e9moire, ce n&rsquo;est pas grave, cela nous retarde juste un petit peu. Nous avons deux PDF avec la m\u00eame somme SHA1 :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"517\" height=\"39\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-17.png\" alt=\"\" class=\"wp-image-213\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-17.png 517w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-17-300x23.png 300w\" sizes=\"auto, (max-width: 517px) 100vw, 517px\" \/><\/figure><\/div>\n\n\n\n<p>Nous allons donc les modifier afin de changer la signature ! Et si nous le faisons bien, nous aurons la m\u00eame propri\u00e9t\u00e9. Pour cela, nous allons ajouter un padding \u00e0 la fin du document, des random bytes qui modifieront la somme SHA1 et qui nous validerons le d\u00e9fi. Pour ce faire, nous avons besoin de cr\u00e9er un fichier dummy avec notre padding dedans :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">dd bs=64 if=\/dev\/urandom of=.\/padding-pseudo-random.tmp count=23<\/pre>\n\n\n\n<p>Pourquoi 23 ? Car c&rsquo;est mon jour de naissance. Et l&rsquo;on reste dans la limitation des 2 Mo par document (23 blocs de 64 Ko).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"264\" height=\"36\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-18.png\" alt=\"\" class=\"wp-image-214\"\/><\/figure><\/div>\n\n\n\n<p>On r\u00e9alise une copie des documents de Google, et nous allons les modifier comme cec i:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"391\" height=\"39\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-19.png\" alt=\"\" class=\"wp-image-215\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-19.png 391w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-19-300x30.png 300w\" sizes=\"auto, (max-width: 391px) 100vw, 391px\" \/><\/figure><\/div>\n\n\n\n<p>Nous v\u00e9rifions que nous avons bien gard\u00e9 notre propri\u00e9t\u00e9 magique :<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"473\" height=\"38\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-20.png\" alt=\"\" class=\"wp-image-216\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-20.png 473w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-20-300x24.png 300w\" sizes=\"auto, (max-width: 473px) 100vw, 473px\" \/><figcaption>parfait ! <\/figcaption><\/figure><\/div>\n\n\n\n<p>Nous les passons dans l&rsquo;outil de r\u00e9vision, et nous obtenons notre flag !<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"753\" height=\"410\" src=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-21.png\" alt=\"\" class=\"wp-image-217\" srcset=\"https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-21.png 753w, https:\/\/blog.caturday-lovers.fr.nf\/wp-content\/uploads\/2020\/05\/image-21-300x163.png 300w\" sizes=\"auto, (max-width: 753px) 100vw, 753px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-preformatted\">FCSC{8f95b0fc1a793e102a65bae9c473e9a3c2893cf083a539636b082605c40c00c1}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Pourquoi ton sysadmin devrait te payer le resto<\/h2>\n\n\n\n<p>Va voir ton sysadmin, et demande lui s&rsquo;il est possible qu&rsquo;une somme SHA1 soit identique sur deux documents diff\u00e9rents. S&rsquo;il est cultiv\u00e9, il saura te r\u00e9pondre que oui c&rsquo;est possible, s&rsquo;il n&rsquo;est pas r\u00e9ellement int\u00e9ress\u00e9, il te soutiendra que non, et l\u00e0 tu pourras mettre en place ton pari ! <\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":13,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[129,128,60,63,61,126,127],"class_list":["post-210","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-kitensgotanswer","tag-boulet","tag-collision","tag-ctf","tag-ecsc","tag-fcsc","tag-revision","tag-sha1"],"_links":{"self":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts\/210","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=210"}],"version-history":[{"count":3,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions"}],"predecessor-version":[{"id":246,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/posts\/210\/revisions\/246"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=\/wp\/v2\/media\/13"}],"wp:attachment":[{"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=210"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=210"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.caturday-lovers.fr.nf\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=210"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}