На Авито выписал IPTV приставку. Модель: Imaqliq G-Box. IQIP: 25101011.

На борту стоит Linux, версия ядра 2.6.32.59-b2067. Программное обеспечение: stb9_prod_512 версии 20200303_2226. Браузер: imaqliq-ott-5005777.
Поверх заводской прошивки стоит приложение от Дом.ру. И оно неплохо работает даже через WiFi соединение, я даже удивлён. Просто в настройках выбирается способ доставки контента HLS (сжатый какой-то).
Для данной модели уществует возможность удалённого подключения через Telnet. Производителем предоставлен функционал Period Content Playing (PCP), управлять которым можно путём редактирования файлов конфигурации в качестве пользователя с ограниченными правами - pcp. Пароль: LoaddAj7, на самом деле он в открытом доступе.
Однако из функционала можно выпотрошить много всякого интересного. Например, в операционной системе работает несколько компонентов и взаимодействуют они с помощью очереди сообщений.
Перечислим возможные действия с сообщениями.
$ msgbusclient
Usage: msgbusclient COMMAND ADDRESS [ARG=VALUE [...]]
Possible commands are:
send Send message with option arguments
recv Wait for and receive message
store Store message
get Retrieve previously stored message
delete Delete previously stored message
monitor Show all messagesВот это я удачно зашёл :)
Команда monitor позволяет выводить сообщения шины в терминал. Сообщения могут появляться при управлении приставкой через пульт. Команда send позволяет, внимание, отправить вручную сообщение в шину. Команда store - сохранять значение настроек в Flash памяти устройства. Вот три самые интересные, на мой взгляд.
Память, в основном, предоставляется только для чтения, однако настройки, представленные в /etc/config, доступны для изменения с помощью сообщений шины. Напрямую редактировать эти файлы бесполезно.
Приставку можно заставить воспроизводить произвольный контент, даже не имея подписки на Дом.ру. Команда msgbusclient send player.enqueue url="$URL" помещает URL воспризводимого контента в очередь. Затем нужно отправить команду msgbusclient send player.play. Поддерживаются протоколы HTTP, RTMP, RTSP. Приставка распознаёт множество форматов, например mp3, mpeg4, aac. В случае ошибки, в шину посылается сообщение player:state: value="stop" reason="eos"
При загрузке, приставка иногда ходит за обновлениями на хост cpe.domru.ru. И берёт оттуда JSON обьект, в котором указан URL образа rootfs.
"image": {
"forced": false,
"md5sum": "",
"systemid": "imaqliq",
"url": {
"rootfs": "http://cpe.domru.ru/tv/fw/IMAQLIQ_INTERZET/4001935/rootfs"
},
"version": "4001935"
}В одном из ключей запроса (SWVersion), железка указывает версию ПО. Разработка модели, насколько мне известно, заброшена, так что версия на сайте может быть очень старой. Если версия выше - сервер вернёт пустой обьект. Скажем так - проверочка так себе.

Приставка здесь работает в локальной беспроводной сети и имеет IP адрес, присвоенный динамически - 192.168.1.101. Адрес шлюза зарезервирован - 192.168.1.100. На компьютере, работающем в качестве шлюза, настроен форвардинг и маскарадинг.
Т.к. производитель сэкономил на механизме TLS, мы можем устроить железяке атаку aka человек посередине. Подменить ответ на запрос. Разворачиваем веб сервер, слушающий 80/tcp порт на 192.168.1.100, а также DNS сервер, например bind9 на том же интерфейсе. Если работает systemd-resolved - отключаем. В настройках указываем домен cpe.domru.ru, указывающий на 192.168.1.100, т.к. железка ходит по адресу который будет резолвится на локальном DNS сервере. В настройках роутера задаём локальный DNS. Изменить домен, порт или запрос невозможно.
Настроить параметры интерфейса можно не только через настройки, но и через терминал, командой net.interfaces.eth0.config auto="true" method="static" address="192.168.1.101" netmask="255.255.255.0" gateway="192.168.1.100" dns_nameservers="192.168.1.100". После чего перезагрузить интерфейс командойnet.interfaces.eth0.restart. Однако нужно иметь ввиду что после перезапуска приставка вернёт значения из памяти. Необходимо сохранить новые значения. Для данных настроек рут не требуется.
msgbusclient store nvram.net2.eth0.method value="static"
msgbusclient store nvram.net2.eth0.address value="192.168.1.101"
msgbusclient store nvram.net2.eth0.gateway value="192.168.1.100"
msgbusclient store nvram.net2.eth0.netmask value="255.255.255.0"
msgbusclient store nvram.net2.eth0.dns_nameservers value="192.168.1.100"Далее создаём PHP скрипт, генерирующий JSON обьект.
<?php
$FORCED = true;
$systemid = 'imaqliq';
$version = '5006000';
$rootfs = "http://cpe.domru.ru/tv/fw/IMAQLIQ_INTERZET/$version/rootfs";
$data = file_get_contents($rootfs);
$md5sum = md5($data);
$url = array();
$url['rootfs'] = $rootfs;
$image = array();
$image['forced'] = $FORCED;
$image['md5sum'] = $md5sum;
$image['systemid'] = $systemid;
$image['url'] = $url;
$image['version'] = $version;
$root = array();
$root['image'] = $image;
$json = json_encode($root);
header('Content-type: application/json');
header('Connection: close');
print($json);
?>Указываем тип контента application/json, выставляем версию посвежее. Также можно подменить образ на образ заводской прошивки от Имаклик, ось его всё равно проверять не умеет. Размещаем скрипт на пути https://cpe.domru.ru/tv/swupdate_primary/index.php
Перезагружаем командой msgbusclient send sys.reboot и железка идёт обновляться на подставной сервер. Если увидели на подключенном устройстве надпись "Идёт обновление пользовательского интерфейса", всё случилось.
Идём в шлюз и наблюдаем эти золотые моменты.
