Изучение API телевизоров SONY Bravia 2014 года
Не секрет, что практически все современные телевизоры со «Smart TV» (и не только) имеют под капотом Linux, полноценный доступ к которому открывает широкие возможности для его владельца. Тут вам и доступ по сети к расшаренным ресурсам, доступ к телевизору по FTP/SSH, установка неофициальных приложений (кардшаринг, привет!), плагинов и прочее. Однако производители всячески пытаются это ограничить. Посмотрим, к чему у нас есть доступ.
У меня есть возможность изучить два телевизора SONY 2014 года: KD-65X8505A и KDL-40W605B. Как я заметил, внутри программно они почти не отличаются, поэтому изучим второй телевизор.
Сперва поглядим, какие порты по умолчанию открыты у телевизора, и что на них висит. Поможет нам в этом nmap:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
root@kali:/home/memtew# nmap -sV -p 1-65535 -T4 192.168.2.14 Starting Nmap 6.47 ( http://nmap.org ) at 2014-11-10 15:49 MSK Nmap scan report for 192.168.2.14 Host is up (0.0030s latency). Not shown: 65528 closed ports PORT STATE SERVICE VERSION 80/tcp open http nginx 20031/tcp filtered unknown 20060/tcp open unknown 41824/tcp open http Sony Bravia TV 48232/tcp open unknown 52323/tcp open tcpwrapped 54400/tcp open tcpwrapped 1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at http://www.insecure.org/cgi-bin/servicefp-submit.cgi : SF-Port48232-TCP:V=6.47%I=7%D=11/10%Time=5460A653%P=x86_64-unknown-linux-g SF:nu%r(NULL,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20o SF:rg\.wfa\.wfd1\.0\r\n\r\n")%r(GenericLines,38,"OPTIONS\x20\*\x20RTSP/1\. SF:0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(GetRequest SF:,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\. SF:wfd1\.0\r\n\r\n")%r(HTTPOptions,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq: SF:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(RTSPRequest,38,"OPTI SF:ONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r SF:\n\r\n")%r(RPCCheck,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nReq SF:uire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(DNSVersionBindReq,38,"OPTIONS\x2 SF:0\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\r\n SF:")%r(DNSStatusRequest,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nR SF:equire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(Help,38,"OPTIONS\x20\*\x20RTSP SF:/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(SSLSes SF:sionReq,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org SF:\.wfa\.wfd1\.0\r\n\r\n")%r(Kerberos,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nC SF:Seq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(SMBProgNeg,38,"O SF:PTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\. SF:0\r\n\r\n")%r(X11Probe,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\n SF:Require:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(FourOhFourRequest,38,"OPTIONS SF:\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\ SF:r\n")%r(LPDString,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequi SF:re:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(LDAPBindReq,38,"OPTIONS\x20\*\x20R SF:TSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org\.wfa\.wfd1\.0\r\n\r\n")%r(SIP SF:Options,38,"OPTIONS\x20\*\x20RTSP/1\.0\r\nCSeq:\x200\r\nRequire:\x20org SF:\.wfa\.wfd1\.0\r\n\r\n"); MAC Address: 00:11:22:33:44:55 (Sony) Service Info: Device: media device Service detection performed. Please report any incorrect results at http://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 120.20 seconds |
Портов открытых немного, ничего интересного на открытых портах я найти не смог. Очень интересны два порта: 80, на котором висит ningx, и 41824, на котором висит «Sony Bravia TV». Однако простое тыкание результатов не дало.
Зайдем с другой стороны: у Sony есть официальное приложение-пульт под Android, называется TV SideView. Очень удобная штука, позволяет управлять телевизором, загружать список каналов и программу передач, управлять записью. Очевидно, что программа общается с телевизором по сети. Для перехвата пакетов установим чудесную программу Shark for Root, которая является графической оболочкой консольной утилиты tcpdump.
Запустил Shark и понажимал кнопки в приложении-пульте, загрузил список каналов с телевизора. Результаты работы программы сохраняются в формате .pcap, который можно открыть при помощи Wireshark на компьютере и изучить, как же общается программа с телевизором:
Первым делом программа-пульт запрашивает файл dmr.xml, который доступен на порту 52323. В файле очень много интересного, скачать его можно здесь. Изучив дальнейшие запросы, я обнаружил следующее: в файле dmr.xml есть перечень адресов внутреннего API, которое принимает запросы в формате JSON, и отвечает также. Вот этот перечень:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<av:X_ScalarWebAPI_DeviceInfo xmlns:av="urn:schemas-sony-com:av"> <av:X_ScalarWebAPI_Version>1.0</av:X_ScalarWebAPI_Version> <av:X_ScalarWebAPI_BaseURL>http://192.168.1.2/sony</av:X_ScalarWebAPI_BaseURL> <av:X_ScalarWebAPI_ServiceList> <av:X_ScalarWebAPI_ServiceType>guide</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>system</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>videoScreen</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>audio</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>avContent</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>recording</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>appControl</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>browser</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>notification</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>cec</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>accessControl</av:X_ScalarWebAPI_ServiceType> <av:X_ScalarWebAPI_ServiceType>encryption</av:X_ScalarWebAPI_ServiceType> </av:X_ScalarWebAPI_ServiceList> </av:X_ScalarWebAPI_DeviceInfo> |
Первым делом запрашивается версия API:
1 |
{"id":1,"method":"getVersions","version":"1.0","params":[]} |
А далее список поддерживаемых методов:
1 |
{"id":2,"method":"getMethodTypes","version":"1.0","params":["1.0"]} |
Естественно увидев это я начал изучать методы по всем адресам. Для этого использовал плагин Postman для Google Chrome:
Например, по адресу /sony/system список методов такой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{"id":3,"results":[ ["getColorKeysLayout",[],["{"colorKeysLayout":"string"}"],"1.0"],["getCurrentTime",[],["string"],"1.0"], ["getDateTimeFormat",[],["{"dateFormat":"string","timeFormat":"string"}"],"1.0"], ["getInterfaceInformation",[],["{"productCategory":"string","productName":"string","modelName":"string","serverName":"string","interfaceVersion":"string"}"],"1.0"], ["getMethodTypes",["string"],["string","string*","string*","string"],"1.0"], ["getNetworkSettings",["{"netif":"string"}"],["{"netif":"string","hwAddr":"string","ipAddrV4":"string","ipAddrV6":"string","netmask":"string","gateway":"string","dns":["string*"]}*"],"1.0"], ["getPostalCode",[],["{"postalCode":"string"}"],"1.0"], ["getPowerSavingMode",[],["{"mode":"string"}"],"1.0"], ["getPowerStatus",[],["{"status":"string"}"],"1.0"], ["getRemoteControllerInfo",[],["{"bundled":"bool","type":"string"}","{"name":"string","value":"string"}*"],"1.0"], ["getSystemInformation",[],["{"product":"string","region":"string","language":"string","model":"string","serial":"string","macAddr":"string","name":"string","generation":"string","area":"string","cid":"string"}"],"1.0"], ["getSystemSupportedFunction",[],["{"option":"string","value":"string"}*"],"1.0"], ["getVersions",[],["string*"],"1.0"], ["getWolMode",[],["{"enabled":"bool"}"],"1.0"], ["requestToNotifyDeviceStatus",["{"internetTVLinkage":{"playingInternetTV":"bool","showingKeyControlableGui":"bool"}}"],["{"internetTVLinkage":{"playingInternetTV":"bool","showingKeyControlableGui":"bool"}}"],"1.0"], ["setCurrentTime",["{"dateTime":"string","timeZoneOffsetMinute":"int","dstOffsetMinute":"int"}"],[],"1.0"], ["setLEDIndicatorStatus",["{"mode":"string","status":"bool"}"],[],"1.0"], ["setLanguage",["{"language":"string"}"],[],"1.0"], ["setPostalCode",["{"postalCode":"string"}"],[],"1.0"], ["setPowerSavingMode",["{"mode":"string"}"],[],"1.0"], ["setPowerStatus",["{"status":"bool"}"],[],"1.0"], ["setWolMode",["{"enabled":"bool"}"],[],"1.0"]]} |
Методов очень много, однако не всё так прозрачно и большинство методов требует авторизации на телевизоре. Для этого служит адрес /sony/accessControl, на который необходимо отправить запрос:
1 |
{"id":13,"method":"actRegister","version":"1.0","params":[{"clientid":"TVSideView:34c48639-af3d-1234-5678-74091375368c","nickname":"cm_tenderloin (TV SideView)"},[{"clientid":"TVSideView:34c48639-af3d-1234-5678-74091375368c","value":"yes","nickname":"cm_tenderloin (TV SideView)","function":"WOL"}]]} |
На данный запрос на телевизоре появится табличка с 4 цифрами, которые необходимо ввести на телефоне. Цифры отправляются на тот же адрес при помощи базовой аутентификации. При следующей аутентификации необходимо отправить такой же запрос, но цифры вводить уже не потребуется.
После аутентификации становится доступно большинство методов, однако некоторые, например, getNetworkSettings по адресу /sony/system вызывают зависание телевизора и результат не возвращают.
Но в списке адресов отсутствует один важный адрес, который есть в файле dmr.xml, но он указан в другом разделе: /sony/IRCC. Данный адрес представляет из себя не что иное, как пульт от телевизора. Однако запросы принимает в формате XML, и строго только после авторизации. Перечень команд пульта можно узнать по адресу /sony/system, при помощи метода getRemoteControllerInfo. Формат запроса на адрес /sony/IRCC следующий:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" ?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:X_SendIRCC xmlns:u="urn:schemas-sony-com:service:IRCC:1"> <IRCCCode> AAAAAgAAABoAAAB2Aw== </IRCCCode> </u:X_SendIRCC> </s:Body> </s:Envelope> |
Где AAAAAgAAABoAAAB2Aw== и есть команда.
Еще один интересный адрес, не указанный в файле dmr.xml всплывает в случае, если метод требует аутентификацию. Например, вышеупомянутый метод getNetworkSettings зависает только после аутентификации, а без неё возвращает ответ:
1 |
{"auth_url":{"default":"http://192.168.1.2/sony/webauth/auth_default"}} |
По данному адресу всегда один и тот же ответ:
Все методы можно посмотреть в этом файле, большинство из них очень полезные: управление питанием телевизора, управление звуком (установка громкости в определенном положении, переключение источника звука, отключение звука), переключение источника видео, получение списка каналов, настройка времени и прочее.
1 Comment
SiNTEx
about 6 лет назадThanks for nice article full of interesting information. If i have some free time, I will make simple program to control TV from PC.
Ответить