Аналитики полагают, что в настоящее время в мире насчитывается около 10 миллиардов устройств Интернета вещей (IoT).
Иногда эти устройства завоевывают свое место на рынке, буквально забираясь людям по задницам.
Как оказалось, дешевые радиочипы с низким энергопотреблением не только отлично подходят для домашней автоматизации — они также меняют способ взаимодействия людей с секс-игрушками.
В этом докладе мы окунемся в мир теледилдоники – технологии секса на расстоянии, при которой тактильные, температурные и другие ощущения передаются между партнерами по двусторонней линии связи.
Спикер расскажет, что безопасности радиоэлектронных анальных секс-игрушек Buttplug может противостоять злоумышленник, который находит и эксплуатирует уязвимости на каждом уровне стека.
В конечном итоге это позволяет скомпрометировать как сами секстуазы, так и устройства, к которым они подключаются.
Хакер, известный как smea, или Smealum, начал свою карьеру как разработчик видеоигр для игровых консолей, таких как Nintendo DS, попутно пытаясь их взломать.
В какой-то момент консоли обзавелись серьезными системами безопасности, и Smea перешла от доморощенного программного обеспечения к разработке методов его взлома.
Смеа известен своей работой над Nintendo 3DS и Wii U, хотя он также внес свой вклад в разработку эксплойтов для популярных веб-браузеров и стеков виртуализации.
Вероятно, он сейчас занимается взломом умных анальных пробок.
DEFCON 27. Анальная пробка: настоящий тест на проникновение.
Часть 1
Конечно, управлять входящими сообщениями можно даже при такой небольшой длине строки.
Например, 30 символов достаточно для выполнения вредоносного JavaScript. На этом слайде показан пример 30-значного тега для изображения из несуществующего источника.
это приводит к тому, что приложение отображает сообщение об ошибке.
Это сообщение будет отображаться всякий раз, когда изображение действительно не может загрузиться.
На снимке экрана видно, что подключение через скомпрометированный ключ позволяет выполнять вредоносный JavaScript.
Ограничение в 32 символа раздражает, поскольку затрудняет реализацию большой полезной нагрузки, но это вполне возможно.
Итак, вы можете видеть, что мы успешно скомпрометировали приложение с помощью USB-ключа и теперь находимся на полпути к обратному взлому, то есть компрометации приложения с помощью хакерской анальной пробки.
В области ключа-компьютера взлом может происходить двумя способами: скомпрометировать ключ через компьютер и скомпрометировать компьютер через ключ.
Ключ действует как небольшой мост между пробкой и приложением.
Возникает вопрос: можно ли использовать эту самую уязвимость для компрометации приложения на компьютере напрямую через анальную пробку.
К сожалению, ответ на этот вопрос — нет, и причина в том, что существует еще одно ограничение на длину символов сообщений, поступающих от анальной пробки в приложение.
Ключ просто упаковывает сообщения-заглушки и пересылает их приложению, после чего вы можете вставить в них свой HTML-код. Однако он может одновременно принимать сообщения длиной не более 20 байт, чего недостаточно для проведения XSS-атаки.
Однако в прошивке ключа есть ошибка: нет проверки нулевого терминатора в конце строки.
Таким образом, если вы сможете поместить некоторые неинициализированные данные после конца строки из 20 символов, вы сможете отправить в приложение более 20 символов.
К сожалению, я не нашел способа эксплуатировать эту уязвимость на практике, но иметь это в виду стоит. Итак, проблема в том, что вы, вероятно, не сможете использовать эту уязвимость, чтобы заставить приложение выполнить код, поступающий непосредственно из анальной пробки.
Это печально, но еще печальнее то, что если посмотреть прошивку ключа, то можно увидеть, что он по сути ничего не делает с полученными данными, а просто копирует их на новую строку и отправляет дальше.
Поэтому мы не сможем использовать его уязвимость для атаки на переполнение буфера памяти.
Однако, если напрямую с анальной пробки взломать приложение невозможно, возможно, это можно сделать с помощью цепочки анальная пробка-ключ-компьютер?
Хорошо то, что чип ключа позволяет разместить гораздо больше кода, чем требовалось оригинальной программе разработчика Lovense Hush.
Флэш-память ключа содержит область, зарезервированную для загрузчика DFU, область для самого приложения Lovense и закрытую область SoftDevice для аппаратного драйвера чипа BLE Nordic Semiconductor. Здесь обрабатывается сам протокол BLE. Например, когда приложение хочет отправить игрушке сообщение BLE, оно связывается с SoftDevice через вызов SVC. Помимо этих трех областей, ключ имеет довольно большую неиспользуемую область флэш-памяти.
Чтобы найти уязвимость в стеке BLE SoftDevice, нужно использовать реверс-инжиниринг, поскольку он не является открытым исходным кодом.
То же самое я сделал, чтобы найти уязвимость в прошивке анальной пробки.
В этом случае очень легко следить за потоком данных, поскольку ASLR отсутствует, и легко определить код, который будет обрабатывать эти сообщения.
В правой части слайда вы можете увидеть обработчик входящих пакетов GATTC (General Attribute Profile), который по сути представляет собой ключ.
В частности, это обработчик чтения типа ответных пакетов.
Я не эксперт по устройствам Bluetooth, но думаю, что суть в том, что ключ считывает тип периферийного устройства и вызывает обработчики для всех вариантов атрибутов, связанных с этим типом.
Это означает, что одновременно можно получить более одного атрибута, причем размер каждого обработчика пары данных атрибута закодирован как поле внутри пакета, что позволяет манипулировать ими.
На слайде представлен образец такой упаковки.
Клиенты GATT могут отправлять пакет запроса «чтение по типу», который содержит тип и диапазон дескрипторов для чтения.
Серверы, которые отвечают на запрос «чтение по типу», возвращают данные, связанные с обработчиками в диапазоне, соответствующем этому типу.
Количество пар дескриптор/данные определяется путем деления длины оставшегося пакета на длину поля пары дескриптор/данные, значение которого всегда равно 0x7 или 0x15.
На слайде показана работа интересующей нас функции: вы видите, как пакет заполняется данными из массива атрибутов, и для них выделяется фиксированная длина буфера.
Здесь помещается значение дескриптора, за которым следует связанный с ним указатель.
Массив атрибутов представляет собой двоичные данные, которые помещаются в буфер в шестнадцатеричном формате.
Данные выделены синим цветом, а рядом находится дескриптор 0D и связанный с ним указатель 00, они выделены оранжевым цветом.
Пакет второго и третьего обработчиков выглядит аналогично.
Уязвимость заключается в следующем.
Если вы прочитаете код справа, то увидите помещенный в фиолетовую рамку параметр атрибут_data_length — длину входящего сообщения, значение которой полностью контролируется потенциальным злоумышленником.
Если мы поместим туда нулевое значение, мы получим бесконечный цикл.
Что делает цикл бесконечным, так это то, что код не проверяет, находятся ли данные, которые он записывает в выходной буфер, внутри этого выходного буфера.
Результатом является классическое переполнение буфера стека, поскольку на устройстве нет ASLR или DEP, и код выполняется немедленно.
Присвоив нулевое значение и создав бесконечный цикл, вы по сути заменяете все данные ОЗУ мусором.
Однако это плохое решение, поскольку оно, скорее всего, приведет к сбою устройства.
Но если вы используете значение 1, это ограничит количество байтов внутри входящего сообщения.
Это означает, что вы сможете слегка переполнить этот буфер, и тогда буфер на основе стека получит возможность испортить все, что находится рядом с ним.
Давайте посмотрим, как выглядит стек до того, как он переполнится.
Массив атрибутов буфера, о котором мы говорили, выделен желтым цветом, сохраненные регистры — синим, а адрес возврата — оранжевым.
Установив длину атрибута равной 0x01, мы можем вызвать переполнение нескольких пар дескриптор/указатель данных.
Дескрипторы имеют длину 2 байта, но два верхних байта дескриптора DWORD не очищаются.
Буфер, который мы переполняем, находится в стеке, в котором нет файлов cookie, ASLR и DEP.
Далее мы тестируем систему: отправляем пакет, полный байтов 0xDA с длиной атрибута 0x01. Получается, что мы перезаписываем обратный адрес указателем на данные нашего атрибута.
Поскольку здесь нет DEP, это означает, что каждый раз, когда функция возвращает значение, будет выполняться код, который находится внутри нашего пакета.
Единственное ограничение заключается в том, что нам нужно, чтобы в адресе возврата был установлен младший бит младшего разряда, поэтому код работает в режиме Thumb, поскольку процессор Cortex M0 не поддерживает режим ARM.
Мы также перезаписываем несколько локальных переменных, но нужно быть осторожными, чтобы не перезаписать что-либо, использованное на обратном пути.
По сути, мы получаем классический бэкдор-пакет. Если вы обратите внимание на этот стек, то увидите, что перезапись не достигает границы, что приведет к сбою программы.
Есть еще одно требование относительно сохраняемых регистров.
Это локальные переменные, которые также перезаписываются при возврате функции.
Один из них используется для разыменования 32-битной границы, и несоответствие содержимого границе приведет к сбою программы.
Поэтому вам необходимо убедиться, что save_arg_3 =0, save_arg_4 соответствует DWORD, то есть находится в пределах границы, и что установлен LSB. Поэтому нам необходимо убедиться, что этот пакет работает. К счастью, это действительно просто, поскольку SoftDevice распределяет эти входящие пакеты как кольцевой буфер без каких-либо требований принудительного выравнивания.
Whiteshark позволил проверить возможность управления выравниванием последующего пакета путем изменения длины предыдущего пакета.
Желтым и синим выделены два пакета, которые отправляются до отправки пакета эксплойта.
Это позволяет мне контролировать выравнивание последнего пакета и делать так, чтобы оно не приводило к сбою программы, чего мы и хотим.
Замечу, что есть некая инженерная преграда: Nordic SoftDevice не предоставляет интерфейс для отправки сырых BLE-пакетов.
Чтобы обойти это, можно использовать 2 варианта: реализовать собственный стек BLE или взломать некоторые хуки в оригинальных пакетах.
Так как мне лень, я выбрал вариант 2. Эти хуки довольно просты, но требуют некоторого обратного проектирования.
Методы взлома можно найти на github, интерфейс довольно беспорядочный и нет никаких гарантий, что он сработает, но у меня сработало.
Вам все же лучше использовать BTLEJack.
Этот указатель SoftDevice вызывается всякий раз, когда отправляется пакет BLE, поэтому его можно изменить заранее:void ble_outgoing_hook(uint8_t* buffer, uint8_t length);
int ble_incoming_hook(uint8_t* buffer, uint16_t length);
SoftDevice вызывает этот крючок каждый раз, когда получает пакет BLE. Возвращаемое значение определяет, следует ли пропустить обычную обработку SoftDevice.
int send_packet(void* handle, void* buffer, uint16_t length);
Вот как выглядит функция отправки необработанного пакета на данное соединение BLE. Как можно обрабатывать более 4 байт кода за раз? Нам нужно отправить несколько пакетов! Справа вы видите кольцевой буфер входящих BLE-пакетов.
Зелёным цветом показан первый пакет: шелл-код, который вызывает функцию с управляемыми параметрами и затем возвращает чистый результат. Второй пакет показан желтым цветом — это буфер данных, который может использоваться вызовом функции.
Синий цвет показывает третий пакет — буфер, содержащий значения параметров вызова функции, а оранжевым — пакет, запускающий уязвимость с помощью инструкции C1 E7.
После возврата из чистой функции мы можем отправить этот пакет еще раз.
Отправка этих 4 пакетов приводит к выполнению любого произвольного фрагмента кода внутри ключа, и это можно делать снова и снова.
Это удобно, потому что таким образом я могу просто вызвать memcpy несколько раз, чтобы скопировать больший двоичный файл шелл-кода в ОЗУ.
Затем мы вызовем эту функцию, чтобы исправить исходный код ключа в памяти и использовать его для компрометации приложения, установленного на компьютере.
Поскольку полезная нагрузка XSS большая, мы не отправляем ее, а генерируем в шелл-коде на самом ключе.
Шелл-код выглядит следующим образом.
Результат этих манипуляций следующий: если мы можем управлять приложением, то мы можем управлять ключом и анальной пробкой.
В разделе «Анальная пробка-ключ» есть 2 возможных метода взлома: ключ может поставить под угрозу игрушку, а анальная пробка может поставить под угрозу и ключ, и компьютер.
Бонусом является то, что уязвимость Nordic BLE присутствует не только в продуктах Lovense, но и в любых устройствах, использующих SoftDevise S110, S120 или S130 для клиента BLE. Итак, у нас есть возможность скомпрометировать приложение с помощью анальной пробки.
Как это можно использовать? Мы все еще просто выполняем код JavaScript внутри приложения Lovense, и вопрос в том, что это нам дает? Оказывается, тот факт, что приложение lovense.exe работает на Medium IL и работает на Windows, дает поистине неограниченные возможности: даже без прав администратора вы можете получить доступ к файлам на компьютере, вы можете выполнить произвольный код, вы можете внедрить XSS, получить доступ к сети и так далее.
Следующий вопрос: если можно создать программу-вымогатель, которая заражает не только анальную пробку, но и компьютер пользователя, есть ли способ распространить ее дальше, сделав ее вирусной? Сейчас мы имеем взлом на локальном уровне, но хакеру было бы гораздо полезнее получить контроль над многими компьютерами пользователей через Интернет. как нам это сделать? Социальные функции игрушки, такие как видеочат, текстовый чат, передача изображений и сам пульт, существенно расширяют поверхность атаки.
Удаленное управление — отличная цель, потому что, если разработчик хочет использовать проприетарную программу, в ней обязательно будут ошибки и уязвимости.
Как это использовать? Например, вы можете отправить партнеру объект JSON, содержащий команды, например команду «Вибрация:10»: {
cate: "id",
id: {
DEADBABEBEEF: {
v: 10
}
}
}
При этом приемник анализирует входящий JSON, формирует команду для игрушки и отправляет ее дальше, причем есть 2 режима.
Первый режим «id:» отправляет команду одной конкретной секс-игрушке, второй режим «all:» отправляет команду всем удаленным игрушкам.
Правильно ли проверяются входящие данные? Поскольку JSON настолько гибок, код, ожидающий число, вместо этого может получить целую строку.
Если мы сможем контролировать команды, отправляемые игрушке, то, вероятно, сможем эксплуатировать ошибку парсера ключа.
На следующем слайде оранжевой рамкой отмечено, где используются входные данные, а синей рамкой указано, где они проверяются.
Эта ошибка заключается в том, что приложение не проверяет должным образом, что входные данные для такой команды, как вибрация, на самом деле являются целым числом.
При этом в режиме «id:» проверяется только то, что показатель интенсивности вибрации n> =0, и если передать целое число 12, большее нуля, то этот параметр пройдет проверку.
Даже если вы передадите строку, то есть число в кавычках «12», система ее примет. Он не примет только строку в виде комбинации цифр и букв, например, «12test».
Как видите, данная проверка не позволяет нам ввести текстовую команду.
Однако если вы посмотрите на нижнюю часть кода, вы увидите ту же проверку, только на этот раз приложение проверяет условие n<0. Now, if we enter “12test”, we will not pass the test, since the application will consider that this expression as a string is not less than 0. But if we enter a string with an inequality check of the form ! (“12test” < 0), the system will consider it true , despite the fact that this is not an integer or a number at all, but an alphanumeric combination. Essentially this means that we can enter an arbitrary string in this command, which will be sent to the dongle. This allows us to send exploit code in the same way we did earlier to compromise the dongle via the JSON parser. The only difference is that now it can be done online.
Так, благодаря ошибке в реализации фильтра проверки входящих данных, мы смогли скомпрометировать ключ удаленно через Интернет, через приложение Lovense, через которое, в свою очередь, смогли взломать компьютер пользователя.
Взлом ключа — отличное дело, но условием успеха является согласие партнера передать удаленное управление игрушкой замаскированному злоумышленнику.
Это удобно для таргетированной атаки, но совершенно непригодно для вирусной атаки.
Однако текстовый чат и изображения не требуют никаких разрешений, что прекрасно позволяет провести классическую XSS-атаку, отправив вредоносный HTML-код в сообщении текстового чата.
Распространение вируса становится тривиальным: просто создайте нужную функцию JavaScript и рассылайте спам своим друзьям.
На этом этапе мы можем выполнить код, просто отправив сообщение, и мы, по сути, достигли нашей цели.
Окончательная полезная нагрузка XSS работает следующим образом:
- Сделайте все, что должно произойти на машине жертвы.
- Возьмите объект JavaScript, который позволит вам получить доступ к чату.
- Отправьте полезную нагрузку XSS, которая загрузит этот скрипт на компьютеры всех ваших друзей.
Таким образом, мы скомпрометировали каждый узел сети от анальной пробки до Интернета.
Теперь вы можете скомпрометировать любое устройство с любого устройства — мы создали прикладного червя, или вирус под названием прикладной червь.
Как и обещал, сейчас покажу вам живое видео.
Первое, что я покажу, это использование разъема BTLE для перехвата соединения анальной пробки с обычной виртуальной машиной Windows, к которой подключен ключ.
Теперь я попробую включить анальную пробку — надеюсь, вы все услышите звуки вибрации! (смех в зале).
Всё заработало, теперь попробую добавить свою игрушку в панель управления приложения.
Вы можете видеть, что программа нашла Hush, но подождите! Я забыл запустить процесс подключения BTLE. Единственная причина использовать разъем BTLE в этом режиме заключается в том, что он упрощает живую демонстрацию, но на практике вы можете перехватить существующее соединение без необходимости прослушивания.
Поэтому я запускаю эту штуку просто для того, чтобы облегчить эксперимент. Давайте сделаем это снова.
Вы видите, что связь с игрушкой установлена.
Сниффер слева показывает, что он обнаружил это соединение.
Итак, у нас есть приложение, связанное с нашей секс-игрушкой.
Не знаю, слышите ли вы, что я действительно могу управлять анальной пробкой (smea перемещает ползунок вверх, после чего раздается усиливающийся звук вибрации).
Сейчас выключу эту штуку (двигает ползунок вниз, звук вибрации пропадает).
Теперь мне нужно взломать это соединение.
Для этого я копирую несколько параметров, вставляю их в строку smea@ubuntu и в конце ввожу параметр t — команду перехвата соединения.
Если это сработает, соединение с приложением будет разорвано.
Как видите, в окне приложения появляется сообщение о том, что связь с устройством потеряна.
Спасибо BTLE jack за отличный инструмент! Анальная пробка отключилась от приложения и теперь управляется через виртуальную машину Ubuntu. Теоретически мы должны иметь возможность удаленно заставить его вибрировать.
Набираю команду Vibrate 20, и как видите, все работает — мы смогли удаленно управлять анальной пробкой без помощи официального приложения (аплодисменты зала).
Сейчас я переведу его в режим DFU, и если это сработает, мне придется остановить эту штуку.
Ввожу соответствующую команду и вибрация прекращается.
Теперь беру смартфон и проверяю, смогу ли я снова подключить игрушку через приложение.
Я нахожу обновление прошивки батплаг среди своих приложений и выбираю цель DfuTarg — устройство, на котором мне нужно обновить прошивку, и по сути внедрить в него вредоносный эксплойт.
Вы можете видеть, как идет процесс обновления.
На экране появится сообщение о том, что прошивка устройства успешно обновлена.
Сейчас я еще раз попробую подключить анальную пробку к приложению, установленному на моем компьютере, и вы увидите, что произойдет: на экране появится заставка программы-вымогателя (аплодисменты зала)!
«Ой, твоя анальная пробка зашифрована! Заплатите 50 долларов в биткойнах, чтобы восстановить доступ к этой важной игрушке в течение 3 дней, иначе через неделю вы потеряете ее навсегда».
Вот как это работает! Итак, вы выполнили код на ключе, затем на компьютере и через Интернет добрались до анальной пробки.
Как видите, эта анальная пробка очень слабая с точки зрения безопасности, вероятно производства Северной Кореи.
Вы видели, что у меня установлена виртуальная машина, на которой приложение запускалось без подключения к ключу или другому оборудованию.
Эта виртуальная машина была просто подключена к Интернету и, похоже, была подключена к компьютеру моего друга.
Таким образом, мы успешно добились вирусного распространения программы-вымогателя.
Я думаю, из всего этого можно извлечь несколько полезных уроков.
На примере этого устройства мы рассмотрели, насколько уязвимым может быть мир Интернета вещей.
Некоторые устройства используются для жизнеобеспечения, и люди не осознают, насколько уязвимы эти новые технологии.
Взломав одну «умную» вещь, вы сможете подключить через Интернет другие «умные» устройства в вашем доме.
Я надеюсь, что результаты моего исследования применимы не только к секс-игрушкам.
Кроме того, я собираюсь изучить весь код этой штуки, так что подписывайтесь на меня в Твиттере.
Сегодня я также опубликую свои инструменты на GitHub на случай, если вы захотите начать взламывать свои собственные анальные пробки.
Я хотел бы поблагодарить всех моих друзей, которые помогли мне с пентестом и познакомили меня с миром анальных пробок, будучи геями-экстремалами.
Я не буду называть имена, но Аарон, ты знаешь, кто ты (смеется).
Спасибо, ребята, это было круто!
Немного рекламы :)
Спасибо, что остаетесь с нами.Вам нравятся наши статьи? Хотите увидеть больше интересных материалов? Поддержите нас, разместив заказ или порекомендовав друзьям, облачный VPS для разработчиков от $4,99 , уникальный аналог серверов начального уровня, который мы придумали для вас: Вся правда о VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps от 19$ или как правильно раздать сервер? (доступны варианты с RAID1 и RAID10, до 24 ядер и до 40 ГБ DDR4).
Dell R730xd в 2 раза дешевле в дата-центре Equinix Tier IV в Амстердаме? Только здесь 2 x Intel TetraDeca-Core Xeon, 2 x E5-2697v3, 2,6 ГГц, 14C, 64 ГБ DDR4, 4 твердотельных накопителя по 960 ГБ, 1 Гбит/с, 100 ТВ от 199 долларов США в Нидерландах! Dell R420 — 2x E5-2430, 2,2 ГГц, 6C, 128 ГБ DDR3, 2 твердотельных накопителя по 960 ГБ, 1 Гбит/с, 100 ТБ — от 99 долларов США! Прочтите об этом Как построить корпоративную инфраструктуру класса, используя серверы Dell R730xd E5-2650 v4 стоимостью 9000 евро за копейки? Теги: #информационная безопасность #Сделай сам или Сделай сам #Конференции #безопасность #теледильдоника #Lovense Hush
-
Выберите Правильный Очиститель Реестра
19 Oct, 24 -
Странности С Php-Модулем Memcached
19 Oct, 24