Найти тему
mamaich

Remote shell на Яндекс.Модуле с помощью VLC Player

Первый информативный пост на Дзене посвящу "Модулю с Яндекс ТВ" - YNDX-00251.

По неочевидным причинам, яндекс запрещает ставить на Модуль сторонние приложения и запускать чужой код (за исключением яваскрипта в браузере). К счастью, на устройстве стоит VLC плейер, который поддерживает LUA скрипты - и эту возможность можно проэксплуатировать.

Информация по возможностям LUA в VLC есть в его исходниках тут: https://code.videolan.org/videolan/vlc/-/tree/master/share/lua

Сразу отмечу, что хоть описанный ниже способ и позволяет запускать свои Linux приложения на устройстве - он не дает рута и не дает устанавливать APK файлы. Код запускается процессом VLC и имеет все права и ограничения, как у VLC плеера.

Update: запуск исполняемых файлов из папки приложения теперь не работает - блокируется политиками selinux. Но по прежнему можно запускать системные приложения, а так же свои скрипты из доступных на запись папок. Также можно поиграться с .SO и LD_PRELOAD.

Если посмотреть логи VLC, которые он любезно предоставляет, то виден запуск скриптов из папки /data/user/0/org.videolan.vlc/app_vlc/.share/lua/meta/art/ - так что наша задача положить туда свой файлик, после чего VLC его запустит при сканировании папок с мультимедиа.

Способов, как с помощью VLC создавать файлы на устройстве, довольно много. Я воспользуюсь таким: VLC умеет не только воспроизводить звук на динамики, но и писать аудио в файлы на диск. Для настольного VLC командная строка выглядит следующим образом:

vlc путь_к_файлу_для_воспроизведения --aout=afile --no-audiofile-wav --audiofile-file=путь_куда_запишем_аудио_дорожку

Таким образом можно "выдернуть" аудио дорожку из любого файла, перекодировать ее в PCM файл. Параметр "no-audiofile-wav" говорит не добавлять RIFF заголовок в начало файла.

На Модуле тоже можно указать параметры командной строки VLC. Для этого открываем VLC Player, идем в "Настройки", "Расширенные", и в самом низу находим "Спецпараметры libVLC". Вводим туда такой текст:

--aout=afile
--no-audiofile-wav
--audiofile-file=/data/user/0/org.videolan.vlc/app_vlc/.share/lua/meta/art/my.lua

Каждый параметр должен быть на новой строке. В конце строк не должно быть пробелов (и вообще, в тексте нет ни одного пробела). --audiofile-file=... - это одна строка (Дзен ее переносит на экране).

После чего там же в "Расширенных" настройках выбираем "Перезапустить приложение". Затем возвращаемся в главное окно плеера, "Обзор", "Streams", вводим путь:

https://ru.cab/1.wav

И запускаем его на воспроизведение. Если слышим шум - значит что-то сделано некорректно. Весь аудио вывод должен идти в файл /data/user/0/org.videolan.vlc/app_vlc/.share/lua/meta/art/my.lua

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

Желающие могут посмотерть внутрь файла - там LUA скрипт, а в конце файла заUUкодированный remote shell, слушающий порт 11111. Исходник shell я взял здесь: https://gist.github.com/geyslan/5176234

curl и wget, находящиеся на Модуле, не работают из-за "зажатых" привилегий VLC плеера, и падают с ошибкой при попытке загрузить файлы с Интернета. Поэтому приходится использовать технологии более 30-летней давности.

LUA скрипт UU-декодирует свое содержимое в файл term, после чего запускает его.

После воспроизведения файла снова идем в "Спецпараметры libVLC" и очищаем их. Снова выбираем "Перезапустить приложение". Выходим в главное меню, проваливаемся куда-нибудь в "Обзор" - "Внутренняя память", а в это время на ПК подключаемся к порту 11111 устройства.

Еще раз напишу. На установку пакетов через PM, запуск активностей через AM - не хватает привилегий. "Знаменитые" эксплоиты вроде DirtyCow на устройстве не работают, а свежих уязвимостей, позволяющих получить рута я не нашел. Так что этот пост - чтобы осталась информация о проделанных мной изысканиях.
Информация продублирована
на 4pda.