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.
  2. 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.
  3. dooble

    dooble Members of Antichat

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

    dooble Members of Antichat

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

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

    FriLL Member

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

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

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

    rudi Active Member

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

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

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

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    229
    Likes Received:
    596
    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.com: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.
  10. b3

    b3 Banned

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

    cerber3000 Member

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

    qwaszx000 Member

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

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

    rudi Active Member

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

    dooble Members of Antichat

    Joined:
    30 Dec 2016
    Messages:
    229
    Likes Received:
    596
    Reputations:
    145
     
    Spinus likes this.
  15. Baskin-Robbins

    Baskin-Robbins Reservists Of Antichat

    Joined:
    15 Sep 2018
    Messages:
    239
    Likes Received:
    807
    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
     
  16. CyberTro1n

    CyberTro1n Well-Known Member

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