Task # Task #1

Discussion in 'Задания/Квесты/CTF/Конкурсы' started by dooble, 14 Dec 2018.

  1. topthing

    topthing Member

    Joined:
    23 Dec 2018
    Messages:
    18
    Likes Received:
    24
    Reputations:
    6
    +done
     
    qwaszx000, K800 and crlf like this.
    1. topthing

      topthing Member

      Joined:
      23 Dec 2018
      Messages:
      18
      Likes Received:
      24
      Reputations:
      6
      Во первых не \x0, а \x00. Во вторых PHP в одинарных кавычках hex символы не распознает, нужны двойные. В третьих в PHP строки уже давно binary-safe и такие древние техники не работают.
       
      cat1vo and dooble like this.
      1. dooble

        dooble Members of Antichat

        Joined:
        30 Dec 2016
        Messages:
        231
        Likes Received:
        601
        Reputations:
        145
        Начнем с того, что задание не закрыто и вопросы если и нужно задавать, то не в этой теме.
        Но мы только начинаем и только учимся решать задания, поэтому пока сделаем исключение:
        - и потому, что ядовитый ноль в инклюдах, уже в версии 5.3.4 был пропатчен (в 5.3.3.8 уже не работал ), а таск работает на версии 7.2.13.
         
        grimnir and crlf like this.
        1. dooble

          dooble Members of Antichat

          Joined:
          30 Dec 2016
          Messages:
          231
          Likes Received:
          601
          Reputations:
          145
          Для тех, кто прошел и не знает чем заняться.
          Решение под виндовс отличается от решения под nix.
          По некоторым причинам не стал его рекомендовать.
          Но вот вчера хакеры повтыкали и говорят, что вполне себе весело.
          Кстати cerber3000 прислал оба прохождения.

          Задание закроем 28.12.2018.
           
          crlf and grimnir like this.
          1. FriLL

            FriLL Member

            Joined:
            14 Sep 2008
            Messages:
            90
            Likes Received:
            24
            Reputations:
            8
            Пройдено
             
            crlf, qwaszx000 and grimnir like this.
            1. DartPhoenix

              DartPhoenix Elder - Старейшина

              Joined:
              15 Sep 2013
              Messages:
              1,113
              Likes Received:
              8,519
              Reputations:
              25
              Больше часа ушло...
              Пойду голову пеплом посыплю :)
               
              crlf, qwaszx000 and erwerr2321 like this.
              1. rudi

                rudi Active Member

                Joined:
                3 Jun 2010
                Messages:
                492
                Likes Received:
                187
                Reputations:
                5
                А я пока не прошел... блин
                 
                1. DartPhoenix

                  DartPhoenix Elder - Старейшина

                  Joined:
                  15 Sep 2013
                  Messages:
                  1,113
                  Likes Received:
                  8,519
                  Reputations:
                  25
                  Лучше проходи. А то как расскажут тебе чо там было - ты себе пепла не только на голову насыплешь, ты и в штаны его себе напихаешь :)
                   
                  1. dooble

                    dooble Members of Antichat

                    Joined:
                    30 Dec 2016
                    Messages:
                    231
                    Likes Received:
                    601
                    Reputations:
                    145
                    Задание закрыто.

                    Посмотрим еще раз на код.

                    Первая строчка не сильно влияет на прохождение, но экономит время, отсеивая варианты с манипуляциями в имени файла.
                    Ну и спасает интернеты от глобального похека, поскольку хакеры не остановятся только на решении таска, а обязательно доведут до rce, потом порутают систему, а когда поймут, что в докере - будут выбираться в хостовую систему.
                    А там опять - рут, соседи, креды, интернет.

                    Теперь две строчки, которые составляют суть задания
                    Code:
                    if(file_exists($flag)){
                        echo("Sorry, this file is protected");
                    }else {
                        include($flag);
                    }
                    Для программиста (как правильно заметил crlf) они не имеют смысла, файл можно проинклюдить только в том случае, если функция file_exists() не найдет его.
                    А ее единственное предназначение, как раз и проверять существование указанного файла или каталога.

                    Логика простая и железная, не обойти.
                    Тупик, опечатка, или что это?

                    А это именно то пространство, в котором может работать хакер.
                    Дьявол кроется в деталях.
                    И в этих деталях обнаруживается другая логика, с которой уже можно работать.
                    Оказывается include и file_exists используют не совсем одинаковые алгоритмы поиска
                    и запрос
                    http://task.antichat.xyz:10001/?f=NotExistenDir/../flag.php
                    выполнит скрипт flag.php.

                    Все дело в том, что инклюд в никсах работает и через несуществующий каталог (большинство знают это на собственном опыте), если после нормализации пути файл существует.
                    А вот file_exists требует существования всех каталогов в пути.

                    И этот баг известен аж с 2004 года.
                    И не в узких кругах, если спросим у Гугла "bypass file_exists", то в топе получаем документ
                    https://seclists.org/fulldisclosure/2004/Feb/82

                    Можно конечно встать на защиту разработчиков: нормально же, include нашел файл, который мы запросили, да "ошиблись" немного в запросе, но "исправились" при помощи "../", вернулись на каталог выше и обнаружили нужный файл. Все нормально.

                    И, если бы мы, на месте разработчиков писали функцию file_exists(), мы бы тоже не разрешили ей ходить через несуществующий каталог.
                    Ну в самом деле: Что может существовать в несуществующем месте?
                    Но, как программистам, нам важно, чтобы обе эти конструкции искали файл одинаково и file_exists не имеет самостоятельной ценности, а только в сочетании с другими функциями (и конструкциями) работающими с ФС.

                    Поэтому баг, однозначно.

                    Часть прохождений была найдена с помощью Гугла, это видно по логам сервера, а часть повтыкали "честно".
                    Оба способа правильны, гуглить - быстрее, повтыкать - интереснее.

                    Под виндовс запрос получается другой, для его объяснения можно заглянуть в тему https://rdot.org/forum/showthread.php?t=926, она широко известна.
                    Для работы с файлами винда предоставляет поистине читерские возможности.


                    Итого.
                    Можно сказать две вещи:
                    - паблик жив.
                    - паблик рулит!

                    Собирается неплохая команда.
                    Думаю, что это еще не все, еще много кто подтянется.

                    Для тех, кто не решил. Не расстраивайтесь, заданий будет еще много, всяких и разных.

                    Кто подтянулся уже после закрытия задания, не спешите заглянуть под спойлер, пробуйте повтыкать, это интереснее, чем просто чтение.

                    И напоследок. Это очень простое задание, но из него можно извлечь уроки.
                    Мне бы хотелось, чтобы зашел такой: Хакер часто работает из такого места, который не прописан явно в коде, но из него можно оказывать влияние на результаты работы скриптов.
                    Я называю это: "В промежутках кода".
                    Но можно называть и по-другому, "Второе дно", "Dark Side of the Moon", не очень важно, как назвать, важно знать, что существует нечто такое, куда программисты не стремятся заглядывать, но там обитают хакеры и неплохо рулят в свою пользу.

                    Всем спасибо.
                    Удачи и хорошего Нового Года!

                    ===
                    PS, ну и после закрытия задания уже не так строго относимся к содержимому постов и самое время поделиться впечатлениями, находками, своим представлением.
                    Может есть свое объяснение решениям таска.
                     
                    #69 dooble, 28 Dec 2018
                    Last edited: 28 Dec 2018
                    leaderru, nightSalem, Coost and 10 others like this.
                    1. b3

                      b3 Banned

                      Joined:
                      5 Dec 2004
                      Messages:
                      2,170
                      Likes Received:
                      1,155
                      Reputations:
                      202
                      В Линуксе тоже есть свои прелести с символами * и ? :)
                       
                      1. cerber3000

                        cerber3000 Member

                        Joined:
                        8 Nov 2008
                        Messages:
                        76
                        Likes Received:
                        31
                        Reputations:
                        2
                        Прошу прощения, что открыл карты раньше времени. Думал что обсуждать можно как стукнет 28.12. За задание огромное спасибо!
                         
                        qwaszx000 and dooble like this.
                        1. qwaszx000

                          qwaszx000 Member

                          Joined:
                          10 Feb 2018
                          Messages:
                          27
                          Likes Received:
                          14
                          Reputations:
                          7
                          Да, огромная благодарность автору.
                          Надеюсь будет ещё много заданий.

                          Всех с наступающим!
                           
                          dooble and joelblack like this.
                          1. rudi

                            rudi Active Member

                            Joined:
                            3 Jun 2010
                            Messages:
                            492
                            Likes Received:
                            187
                            Reputations:
                            5
                            Вот блин, а я подставлял хлам не на уровень ниже а на уровень выше...
                            Спасибо позновательно
                             
                            CyberTro1n and dooble like this.
                            1. dooble

                              dooble Members of Antichat

                              Joined:
                              30 Dec 2016
                              Messages:
                              231
                              Likes Received:
                              601
                              Reputations:
                              145
                               
                              Spinus likes this.
                              1. Baskin-Robbins

                                Baskin-Robbins Reservists Of Antichat

                                Joined:
                                15 Sep 2018
                                Messages:
                                239
                                Likes Received:
                                809
                                Reputations:
                                212
                                К слову(на всякий случай добавлю), не только file_exist.

                                PHP:
                                // php 7.3

                                $a "/etc/../etc/";
                                if(
                                is_dir($a)){include $a 'passwd';} // passwd
                                echo file_get_contents($a 'passwd'); // passwd

                                $a "/etc/aaaa/../";
                                if(
                                is_dir($a)){include $a 'passwd';} // nothing
                                echo file_get_contents($a 'passwd'); // passwd



                                $a "/etc/../etc/passwd";
                                if(
                                is_file($a)){include $a;} // passwd
                                echo file_get_contents($a); // passwd

                                $a "/etc/aaaa/../passwd";
                                if(
                                is_file($a)){include $a;} // nothing
                                echo file_get_contents($a); // passwd
                                 
                                1. CyberTro1n

                                  CyberTro1n Elder - Старейшина

                                  Joined:
                                  20 Feb 2016
                                  Messages:
                                  1,080
                                  Likes Received:
                                  862
                                  Reputations:
                                  14
                                  Братец. Твои рыбатоты много стоят. Спасибо бро, Душевно, за наш малый городок, огромное!