Пожалуйста, обратите внимание, что пользователь заблокирован
Для PlaidCTF несколько недель назад я создал серию проблем под названием «idIoT». В этой серии задач игроки получили возможность атаковать два веб-сайта: Google Home, FTP-сервер, WiFi-камеру и Particle Photon. Участники, похоже, наслаждались этими проблемами, поэтому я подумал, что сделаю небольшую рецензию на создание этих проблем и свое собственное руководство по решению, как тот, который Зак сделал для S-Exploitation на прошлой неделе .
вдохновение
Сначала я попытался решить проблему CTF с помощью Google Assistant в конце осени 2017 года. Первоначальный план состоял в том, чтобы выполнить довольно стандартную проблему XSS, которая требовала от злоумышленников использования Web Speech API для взаимодействия со смарт-динамиком. Однако я понял, что мне нужно предоставить доступ к микрофону злоумышленника, чтобы записать ответ Google Assistant, который по соображениям конфиденциальности имеет смысл только на сайте, на котором уже было разрешение пользователя использовать микрофон. Это привело к идее создать Clipshare, сайт для обмена аудио, используемый в этой проблеме.
Много позже (примерно в феврале или около того) мне пришло в голову, что это может сделать более интересную проблему, если я сделал XSS нетривиальным. Вдохновленный некоторыми предыдущими работами, которые я видел в файлах полиглота, я искал некоторые форматы аудиофайлов, чтобы определить, возможна ли такая атака, и, к моему удивлению, это было даже довольно просто (но об этом позже).
Идея сделать проблему с фотоном Photon и прикрепленной к нему светодиодной полосой пришла ко мне независимо друг от друга примерно в то же время, что и первоначальная идея Google Assistant. У меня на самом деле был фотон со светодиодной лентой, почти идентичной проблеме в моей квартире, и однажды я в шутку сказал, чтобы установить шаблон на -1, и засмеялся от того, что я просачивал память. Посмотрев на доступную информацию, хранящуюся на Photon, я понял, что теоретически может просочиться секретный ключ Частицы, а затем выдать себя за Фотон, чтобы публиковать события, и решил сделать это сложной задачей.
Вторая часть задачи, FTP-сервер с Wifi-камерой, была создана гораздо позже, чтобы связать две части вместе. Первоначальная концепция заключалась в создании пользовательской Wifi-камеры с использованием Raspberry Pi, которая позволила бы пользователю получить доступ с помощью ошибки заголовка, которая позволила бы им вставлять заголовки CORS и, следовательно, делать запросы с хоста Clipshare. Тем не менее, я счел это слишком дорогостоящим для преследования, поэтому вместо этого решил использовать некоторые дешевые готовые Wifi-камеры, к которым у меня был доступ для некоторых несвязанных работ. Тем не менее, каждый разумный эксплойт на самих камерах обеспечивал бы корень злоумышленников, что слишком упростило бы надолго устранить проблему. Поэтому я решил, чтобы они атаковали простой сбрасываемый FTP-сервер.
Решение
Часть 1 (Действие)
Нам предоставляется веб-сайт Clipshare и пользователь для атаки. Описание проблемы указывает, что нам нужно получить доступ к клипам этого пользователя, чтобы заставить их ждать на странице достаточно долго, чтобы поговорить с Google Домой. Высунувшись, мы обнаруживаем, что если мы добавим пользователя в качестве друга, мы получим возможность обмениваться с ними клипами. Это указывает на то, что это, вероятно, проблема XSS.
Тестирование всех полей в форме создания клипа означает, что поле описания тривиально инъектируется (т. Е. Оно даже не содержит каких-либо фильтров, поэтому вы можете просто написать HTML прямо в описании). Однако, Content-Security-Policyэто довольно строго:
Поэтому, если мы хотим выполнить JS, нам нужно иметь JS-файл на месте. Поэтому нам, вероятно, необходимо загрузить JS-файл через функцию загрузки аудио.
Однако это создает две проблемы. Во-первых, аудиофайл проверяется с помощью неизвестного процесса (загрузка файла мусора приводит к ошибке «недопустимого звукового файла»), поэтому загрузка JS напрямую не будет работать. Во-вторых, сервер Apache обслуживает аудиофайлы с соответствующими audio/*типами MIME, которые Chrome отказывается выполнять.
Apache выбирает, какой тип MIME использовать на основе расширения файла; Однако, сервер проверяет расширение загруженного файла перед его сохранением, и , следовательно , этот файл должен быть один из .wav, .wave , .mp3, .ogg, или .webm. Попытка все это, оказывается, что Apache не распознает .waveаудиофайл WAVE по умолчанию и поэтому обслуживает его без MIME-типа, что позволяет нам выполнять его как JS с <script>тегом!
Это возвращает нас к первому выпуску сервера, проверяющего аудиофайлы через неизвестный процесс; однако, как оказалось, нам не нужно использовать валидатор, так как можно построить допустимый полиглот JS / WAVE, используя поле длины, чтобы прокомментировать все заголовки, а затем внедрить нашу полезную нагрузку в аудиоданные:
Для записи процесс проверки состоял в том, чтобы просто запустить файл ffmpeg -v error -i path-to-uploaded-file -f null - 2>&1и проверить ненужный код выхода. Таким образом, вы можете загрузить любойтип файла, распознанный ffmpeg, поскольку проверка расширения файла не зависела от проверки файла!
Поэтому мы можем использовать следующие шаги, чтобы получить файл cookie целевого пользователя, чтобы увидеть их клипы:
Обратите внимание, что большая часть кода, который вам нужен для записи микрофона, уже доступна на месте через функцию «записать клип».
Если все пойдет хорошо, вы должны получить запись, в которой Google Home отвечает «флагом P ... C ... T ... F ... открыть скобку ... нет ... подчеркнуть ... так ... подчеркнуть ... умный ... закрыть скобку», указав флаг PCTF{not_so_smart}.
вдохновение
Сначала я попытался решить проблему CTF с помощью Google Assistant в конце осени 2017 года. Первоначальный план состоял в том, чтобы выполнить довольно стандартную проблему XSS, которая требовала от злоумышленников использования Web Speech API для взаимодействия со смарт-динамиком. Однако я понял, что мне нужно предоставить доступ к микрофону злоумышленника, чтобы записать ответ Google Assistant, который по соображениям конфиденциальности имеет смысл только на сайте, на котором уже было разрешение пользователя использовать микрофон. Это привело к идее создать Clipshare, сайт для обмена аудио, используемый в этой проблеме.
Много позже (примерно в феврале или около того) мне пришло в голову, что это может сделать более интересную проблему, если я сделал XSS нетривиальным. Вдохновленный некоторыми предыдущими работами, которые я видел в файлах полиглота, я искал некоторые форматы аудиофайлов, чтобы определить, возможна ли такая атака, и, к моему удивлению, это было даже довольно просто (но об этом позже).
Идея сделать проблему с фотоном Photon и прикрепленной к нему светодиодной полосой пришла ко мне независимо друг от друга примерно в то же время, что и первоначальная идея Google Assistant. У меня на самом деле был фотон со светодиодной лентой, почти идентичной проблеме в моей квартире, и однажды я в шутку сказал, чтобы установить шаблон на -1, и засмеялся от того, что я просачивал память. Посмотрев на доступную информацию, хранящуюся на Photon, я понял, что теоретически может просочиться секретный ключ Частицы, а затем выдать себя за Фотон, чтобы публиковать события, и решил сделать это сложной задачей.
Вторая часть задачи, FTP-сервер с Wifi-камерой, была создана гораздо позже, чтобы связать две части вместе. Первоначальная концепция заключалась в создании пользовательской Wifi-камеры с использованием Raspberry Pi, которая позволила бы пользователю получить доступ с помощью ошибки заголовка, которая позволила бы им вставлять заголовки CORS и, следовательно, делать запросы с хоста Clipshare. Тем не менее, я счел это слишком дорогостоящим для преследования, поэтому вместо этого решил использовать некоторые дешевые готовые Wifi-камеры, к которым у меня был доступ для некоторых несвязанных работ. Тем не менее, каждый разумный эксплойт на самих камерах обеспечивал бы корень злоумышленников, что слишком упростило бы надолго устранить проблему. Поэтому я решил, чтобы они атаковали простой сбрасываемый FTP-сервер.
Решение
Часть 1 (Действие)
Нам предоставляется веб-сайт Clipshare и пользователь для атаки. Описание проблемы указывает, что нам нужно получить доступ к клипам этого пользователя, чтобы заставить их ждать на странице достаточно долго, чтобы поговорить с Google Домой. Высунувшись, мы обнаруживаем, что если мы добавим пользователя в качестве друга, мы получим возможность обмениваться с ними клипами. Это указывает на то, что это, вероятно, проблема XSS.
Тестирование всех полей в форме создания клипа означает, что поле описания тривиально инъектируется (т. Е. Оно даже не содержит каких-либо фильтров, поэтому вы можете просто написать HTML прямо в описании). Однако, Content-Security-Policyэто довольно строго:
Content-Security-Policy content_copyContent-Security-Policy: style-src 'self' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; media-src 'self' blob:; script-src 'self'; object-src 'self'; frame-src 'self'
Поэтому, если мы хотим выполнить JS, нам нужно иметь JS-файл на месте. Поэтому нам, вероятно, необходимо загрузить JS-файл через функцию загрузки аудио.
Однако это создает две проблемы. Во-первых, аудиофайл проверяется с помощью неизвестного процесса (загрузка файла мусора приводит к ошибке «недопустимого звукового файла»), поэтому загрузка JS напрямую не будет работать. Во-вторых, сервер Apache обслуживает аудиофайлы с соответствующими audio/*типами MIME, которые Chrome отказывается выполнять.
Apache выбирает, какой тип MIME использовать на основе расширения файла; Однако, сервер проверяет расширение загруженного файла перед его сохранением, и , следовательно , этот файл должен быть один из .wav, .wave , .mp3, .ogg, или .webm. Попытка все это, оказывается, что Apache не распознает .waveаудиофайл WAVE по умолчанию и поэтому обслуживает его без MIME-типа, что позволяет нам выполнять его как JS с <script>тегом!
Это возвращает нас к первому выпуску сервера, проверяющего аудиофайлы через неизвестный процесс; однако, как оказалось, нам не нужно использовать валидатор, так как можно построить допустимый полиглот JS / WAVE, используя поле длины, чтобы прокомментировать все заголовки, а затем внедрить нашу полезную нагрузку в аудиоданные:
Для записи процесс проверки состоял в том, чтобы просто запустить файл ffmpeg -v error -i path-to-uploaded-file -f null - 2>&1и проверить ненужный код выхода. Таким образом, вы можете загрузить любойтип файла, распознанный ffmpeg, поскольку проверка расширения файла не зависела от проверки файла!
Поэтому мы можем использовать следующие шаги, чтобы получить файл cookie целевого пользователя, чтобы увидеть их клипы:
- Создайте новый клип с *.waveполиглотом, содержащим полезную нагрузку, которая отправляет нам файл cookie цели
- Создайте второй клип с описанием <script src='/uploads/path-to-first-audio-file.wave'></script>
- Поделитесь вторым клипом с целевой
- Создайте новый клип с *.waveполиглотом, содержащим полезную нагрузку, которая записывается из микрофона в течение примерно 12 секунд, а затем отправляет его на сервер, которым мы управляем
- Создайте второй клип, звук которого запись вас, говорящего «Хорошо, Google, что такое флаг?» И чье описание spatulate <script src='/uploads/path-to-first-audio-file.wave'></script>
- Поделитесь вторым клипом с целевой
Я провел много времени в комнате с настройкой Google Home, и у нее, казалось, были некоторые проблемы с пониманием команды у некоторых конкурентов. Это было несколько способов. Я сказал всю ключевую фразу (включая «горячее слово» «ОК») в одном из клипов, чтобы вы могли просто загрузить эту часть аудиофайла. Другим способом является то, что большинство текстовых речевых голосов правильно декодируются Home, поэтому вы можете просто загрузить запись TTS с полной командой.Обратите внимание, что большая часть кода, который вам нужен для записи микрофона, уже доступна на месте через функцию «записать клип».
Если все пойдет хорошо, вы должны получить запись, в которой Google Home отвечает «флагом P ... C ... T ... F ... открыть скобку ... нет ... подчеркнуть ... так ... подчеркнуть ... умный ... закрыть скобку», указав флаг PCTF{not_so_smart}.
Последнее редактирование:




























