Введение

Сегодня мы рассмотрим событие CTF Gusto Guice Shop. В этом мероприятии используется уязвимое веб-приложение OWASP Juice Shop, чтобы узнать, как выявлять и использовать распространенные уязвимости веб-приложений.

Что такое КТФ?

CTF (Capture The Flag) — это своего рода соревнование по информационной безопасности, в котором участникам предлагается решить различные задачи, начиная от поиска мусора в Википедии и заканчивая базовыми упражнениями по программированию и взломом сервера для кражи данных. В этих задачах участника обычно просят найти определенный фрагмент текста, который может быть скрыт на сервере или за веб-страницей. Эта цель названа флагом!

В организованных мероприятиях CTF мероприятие делится на три основные категории, а именно:

  • Опасность
  • Атака-Защита
  • Смешанные события

Опасность

Участникам, участвующим в соревнованиях CTF в стиле Jeopardy, предстоит решать сложные задачи в определенном порядке. Каждая задача имеет свое значение. Они могут быть либо независимыми миссиями, либо частью другой совместной миссии. Каждая тема может иметь определенный уровень сложности, а могут быть схожими по сложности — чем сложнее задание, тем больше баллов вы сможете заработать при успешном выполнении.

Атака-Защита

Участники, участвующие в соревновании «Нападение-оборона», пытаются защитить своих хозяев, атакуя других конкурентов. Перед началом основной части соревнования у каждого участника есть достаточно времени, чтобы построить защитную стену для своего компьютера. Процесс возведения защитной стены включает в себя латание и закрепление. Другими словами, каждый участник должен найти уязвимости на своем компьютере, прежде чем атаковать других. Команды получают очки за отражение атак противоположных команд и успешное проникновение в другие команды. Побеждает команда с наибольшим количеством очков.

Смешанные события

Короче говоря, это категория, которая включает в себя как опасности, так и проблемы нападения и обороны. Для получения дополнительной информации: https://ctftime.org/ctf-wtf/

Испытание на убийство чат-бота

В магазине Guice есть 100 задач, которые нужно решить, и одна из них называется Убить чат-бота!

Цель

В магазине Guice есть быстрый чат-бот, который помогает покупателям, отвечая на их вопросы. В этом случае мы полностью отключим его, чтобы этот чат-бот не мог помогать клиентам.

Давайте начнем!

Давайте сначала рассмотрим чат-бота! Вначале он хочет, чтобы мы назвали свое имя, а затем отвечает на наши вопросы соответствующими ответами.

Сначала я попытался перегрузить его, отправив более одного сообщения с использованием грубой силы, но это заставило меня решить еще одну проблему…

Потом я решил посмотреть на эту страницу внимательнее, и мое внимание привлек текст "powered by juicy-chat-bot".

Когда я погуглил этот текст, я нашел проект NodeJS под названием juice-chat-bot. Потом я посмотрел на используемые проектом зависимости, никакого вредоносного пакета я не заметил, но когда начал перемещаться по их кодам, то поймал странную ситуацию.

function process (query, token){
    if (users.get(token)){
        return model.process(trainingSet.lang, query)
    } else {
        return { action: 'uncrecognized', body: 'user does not          exists' 
      }
    }
}

Мы видим, что пользовательские сообщения сохраняются для использования функции процесса. А затем, если посмотреть на другую часть, здесь строковый код javascript запускается с помощью this.factory.run(). Эта конкретная часть называется удаленное выполнение кода.

addUser (token, name){
   this.factory.run(`users.addUser("${token}, "${name}")`)
}

Когда я посмотрел, откуда взялся this.factory, я увидел пакет npm. Имя пакета vm2.

Если вы помните, бот спрашивал у нас наше имя в первую очередь, чтобы он мог обратиться к нам. В этой части работает метод с именем addUser().

Когда я ввожу свое имя в качестве аргумента, оно использует значение, сгенерированное как токен, и данные, которые я ввожу, как имя. Затем добавьте данные, которые я ввел в качестве имени, в команду ‘users.addUser’ с интерполяцией строк и запустите ее с пакетом vm2.

Если нам удастся сломать функцию процесса, бот полностью отключится. Этот код выглядит как функция eval(). Итак, я решил использовать метод эксплойта eval function.

addUser (token, name){
   this.factory.run(`users.addUser("${token}, "${name}")`)
}

Затем я отправляю данные в чат-бот после нескольких попыток:

oguzhan"); process=null; users.addUser("1234", "ozi

Чат-бот преобразует этот код ниже.

users.addUser("token", "oguzhan");`
`process = null;`
`users.addUser("1234", "ozi")

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

Поздравляем! Бот больше не сможет помогать пользователям; мы выполнили квест!

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

Уроки выучены

  • Если нам нужно получить значение от пользователя, мы должны использовать значение, которое мы получаем, передавая его через проверку. В противном случае данные, полученные от пользователя, могут интерпретироваться как код, и в этом случае может возникнуть такая уязвимость безопасности.
  • Когда мы решаем использовать какой-либо пакет для любого языка, нам нужно быть более осторожными при выборе пакета/библиотеки, потому что ваш код может быть безопасным, но насколько безопасен код пакета? Вам нужно проверить звезды пакета/библиотеки на GitHub/GitLab и убедиться, что они обновлены.

Безопасность с Gusto!

Особая благодарность всей команде безопасности Gusto за организацию мероприятий CTF и тренингов по безопасности.

Примечание от службы безопасности

Мы хотим поблагодарить Oguzhan за участие и написание этого сообщения в блоге; ты лучший! Если это кажется вам интересным или вы ищете должность охранника, мы нанимаем! Пожалуйста, ознакомьтесь с нашими открытыми вакансиями, посетив нашу страницу вакансий. Мы надеемся услышать от вас!