Введение
Сегодня мы рассмотрим событие 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 за участие и написание этого сообщения в блоге; ты лучший! Если это кажется вам интересным или вы ищете должность охранника, мы нанимаем! Пожалуйста, ознакомьтесь с нашими открытыми вакансиями, посетив нашу страницу вакансий. Мы надеемся услышать от вас!