Всем привет! Я на какое-то время поселился в гостинице. Гостиница из современных, с умными телевизорами и всякими другими подключенными устройствами. Меня одолело любопытство, и я открыл Wireshark, как сделал бы на моем месте любой любитель покопаться в технике.

Я был очень удивлен, когда увидел большое количество UDP-трафика на порте 2046. Взглянул на него, но много толку это не дало – порт оказался не из стандартных, так что разбираться предстояло вручную.

Сначала я заподозрил, что эти данные нужны для стриминга телепередач на телевизоры, но размер пакета выглядел мелковатым, даже для единичного видеофрейма.

UDP-пакеты приходили не на мой IP, и я не проводил ARP-спуфинг, соответственно, эти пакеты рассылались всем. Изучив их повнимательнее, я установил, что это пакеты Multicast. По сути, это значит, что пакеты отправляются однократно и одновременно приходят на несколько устройств. Я заметил и еще кое-что: все пакеты были одинакового размера (634 байта).

Я решил написать скрипт для извлечения и анализа этих данных на Python. Начнем с кода, с помощью которого я стал принимать пакеты Multicast. В нижеприведенном фрагменте 234.0.0.2 – это IP, который я получил на Wireshark.

import socket
import struct

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 2046))

mreq = struct.pack("4sl", socket.inet_aton("234.0.0.2"), socket.INADDR_ANY)
s.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

while True:
    data = s.recv(2048)
    print(data)

Дополнительно я использовал binascii, чтобы конвертировать всё это в hex и облегчить себе процесс чтения байтов. Пронаблюдав, как тысячи пакетов сменяют друг друга на моей коносли, я заметил, что первые 15 байтов или около того у всех одинаковы. Эти байты, вероятно, указывали на протокол и ID пакета/команды, но так как мне приходило всё одно и то же, я не сумел ничего расследовать в этом плане.

Стыдно признаться, сколько времени мне потребовалось, чтобы заметить цепочку символов LAME3.91UUUUUUU в конце каждого пакета. Я заподозрил, что это аудиоданные, сжатые MPEG, но, когда для пробы сохранил один пакет как test.mp3, мультиплеер не смог его проиграть, а утилита file определила его только как test.mp3: data. То, что в пакете имеются данные, было и так очевидно, а если бы они представляли собой аудио MPEG, file должна была бы их узнать.

Поэтому я решил написать еще один скрипт на Python, который сохранял бы данные из пакетов со смещением. То есть файл test1 он должен был сохранить, пропустив один байт из пакета, файл test2 – пропустив два байта и так далее. Вот какой я использовал код и вот что из этого получилось:


data = s.recv(2048)
for i in range(25):
    open("test{}".format(i), "wb+").write(data[i:])

После этого я запустил file test* и вуаля! Теперь мы знаем, что, чтобы добраться до данных аудио MPEG, нужно пропустить восемь байтов:

$ file test*
test0:    data
test1:    UNIF v-16624417 format NES ROM image
test10:   UNIF v-763093498 format NES ROM image
test11:   UNIF v-1093499874 format NES ROM image
test12:   data
test13:   TTComp archive, binary, 4K dictionary
test14:   data
test15:   data
test16:   UNIF v-1939734368 format NES ROM image
test17:   UNIF v-1198759424 format NES ROM image
test18:   UNIF v-256340894 format NES ROM image
test19:   UNIF v-839862132 format NES ROM image
test2:    UNIF v-67173804 format NES ROM image
test20:   data
test21:   data
test22:   data
test23:   DOS executable (COM, 0x8C-variant)
test24:   COM executable for DOS
test3:    UNIF v-1325662462 format NES ROM image
test4:    data
test5:    data
test6:    data
test7:    data
test8:    MPEG ADTS, layer III, v1, 192 kbps, 44.1 kHz, JntStereo
test9:    UNIF v-2078407168 format NES ROM image


while True:
    data = s.recv(2048)
    sys.stdout.buffer.write(data[8:])


Дальше нам нужно просто непрерывно читать пакеты один за другим, пропуская в каждом по восемь байтов, и тогда всё отлично воспроизведется.

Что же кроется в этом аудио? Следы коварно спрятанного жучка, который подслушивает за мной? Что-то имеющее отношение к умному телевизору в моем номере? Что-то связанное с работой гостиничных систем? Есть только один способ узнать.

$ python3 listen_2046.py > test.mp3
* wait a little to get a recording *
^C

$ mplayer test.mp3
MPlayer (C) 2000-2016 MPlayer Team
224 audio & 451 video codecs

Playing test.mp3.
libavformat version 57.25.100 (external)
Audio only file format detected.
=====
Starting playback...
A:   3.9 (03.8) of 13.0 (13.0)  0.7%


Что за чертовщина? И на это я тратил своё время? Это музыка вызова лифта, её играют в коридорах возле лифтов. Ну ладно, зато теперь я могу слушать ее и у себя в номере.

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


  1. Tomasina
    00.00.0000 00:00
    +21

    То есть лифт подключен к общей локальной сети? А порулить им?


    1. DMGarikk
      00.00.0000 00:00
      +3

      скорее динамики рядом с ним подключены и с лифтом не связаны

      но в принципе, подключен может быть запросто (если админ особо активный), гостиница не ИТ компания там никто морочиться ИБ не будет


      1. m0tral
        00.00.0000 00:00
        +1

        Там зачастую ключи от номера Mifare и на открытых ключах либо на известных) что уж заботиться от каких то UDP пакетах для колонок


      1. Tomasina
        00.00.0000 00:00

        Но раз по прибытии лифта на этаже играет музычка, которая крутится в UDP, то лифт как-то взаимодействует с блоком воспроизведения. И вряд ли это банальный геркон и магнитик.


        1. artemlight
          00.00.0000 00:00
          +2

          Это может быть банальный датчик движения, примерно такой же, как и для освещения.


          1. Tomasina
            00.00.0000 00:00
            +3

            Тогда бы он тренькал даже при транзитном движении лифта. Тут что-то более умное надо.


        1. DMGarikk
          00.00.0000 00:00
          +4

          И вряд ли это банальный геркон и магнитик.

          да запросто!
          может конечно там и не геркон с магнитиком, но запросто этажная релюшка которая по can шине получает сигнал что лифт приехал… типа чтобы какойнить свет включать или еще чего… и на неё зацепили звук.
          Я чет не верю что там чтото более технологичное. с этим вне ИТ сектора крайне КРАЙНЕ тяжело


  1. akakoychenko
    00.00.0000 00:00
    +1

    Интересно, в случае пожара вместо музыки начнёт проигрываться голос типа "fire alarm!"


    1. LordCyberfox
      00.00.0000 00:00
      +29

      Тогда подключат трек Scooter - Fire


      1. Ivan22
        00.00.0000 00:00
        +2

        Hidden text


      1. Didimus
        00.00.0000 00:00
        +1

        Пролежни - Firestarter. Или раммштайн


  1. at5Fd8NVdfpf
    00.00.0000 00:00
    +27

    А разослать свою версию пакетов с другой музыкой но такими же заголовками не пробовали ?


    1. ris58h
      00.00.0000 00:00
      +2

      Это перевод.


      1. xenon
        00.00.0000 00:00

        Нужны ребята с FindThisPlace и потом проверить.


    1. Dvlbug
      00.00.0000 00:00

      Скорее всего будет просто какофония, 634 байта не хватит для полноценного звука

      А пакеты будут приходить вразнобой


  1. fk0
    00.00.0000 00:00
    -4

    А может проще было бы запустить WireShark и он сам показал бы, что нашёл такие-то пакеты таких-то протоколов?


    1. vanyas
      00.00.0000 00:00
      +5

      Вы начало статьи читали? Так как раз WireShark и запускал автор


    1. Alcpp
      00.00.0000 00:00

      Автор его таки запустил, как следует из текста.


  1. VladimirFarshatov
    00.00.0000 00:00
    +2

    Сразу видно любознательного молодого программиста ;). Плюсанул статью, спасибки.


  1. Alcpp
    00.00.0000 00:00
    +2

    Как назывался отель и в каком городе? Есть некоторые идеи :).


  1. MxMaks
    00.00.0000 00:00
    +2

    Получается гостевая и служебные сети общие? Непорядок.


  1. SergeAx
    00.00.0000 00:00
    -18

    Вышедший в топ перевод статьи 2016 года, да ещё и с использованием термина "обратная разработка" вместо "реверс-инжиниринг", в полном соответствии с политикой и курсом партии "Единая Россия". Буду использовать как иллюстрацию деградации российского IT, спасибо.


    1. event1
      00.00.0000 00:00
      +27

      Действительно, какой ужас. Переводчик использует термины, которые ему больше нравятся. Немедленно запретить! /s


      1. tyomitch
        00.00.0000 00:00
        +1

        Ну вот, а меня здесь в 2011 заклевали было за варианты "беззамочный" и "беззахватный" в качестве перевода термина lock-free


    1. dom1n1k
      00.00.0000 00:00
      +1

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


    1. shuhray
      00.00.0000 00:00
      +4

      Редкий случай, когда согласен с политикой и курсом партии "Единая Россия". Недавно на хабре узнал слово "фичемапа". Надо что-то делать.


      1. SergeAx
        00.00.0000 00:00
        +1

        Я для себя решил, что надо учить английский язык, потому что IT и software engineering развиваются в основном в англоязычном сегменте, и без возможности брать оттуда всё новое никакого профессионального роста не будет.


        1. EireenK
          00.00.0000 00:00
          +3

          Удивительно глубокое и своевременное озарение для "создателя и руководителя инженерных команд".


          1. SergeAx
            00.00.0000 00:00

            В смысле, вы подумали, что я это только что решил? Но я с 2019 года работаю в иностранных компаниях с обязательным английским. А решил ещё в школе, которую я закончил, когда вы, скорее всего, ещё не родились)

            Это была просто более вежливая версия высказывания типа "если ты не знаешь английский - ты не инженер, а в лучшем случае личинка инженера". Пришлось разжевать, увы, с пониманием намёков у людей обычно так же плохо, как со знанием языков.


            1. navion
              00.00.0000 00:00
              -1

              Тогда что ты делаешь на этом сайте?


        1. event1
          00.00.0000 00:00
          +1

          Я для себя решил, что надо учить английский язык, потому что IT и software engineering развиваются в основном в англоязычном сегмент

          Для этого достаточно читать со словарём


        1. shuhray
          00.00.0000 00:00
          +1

          На форуме dxdy в программистском отделе переводили слово handle. Перевод всегда состоял из нескольких слов, включая слово "идентификатор". Притом, "handle" - это ручка (от чемодана). Штуковину, за которую удобно таскать файл, англоязычный программист называет "ручкой", а русскоязычный "идентификатором".


          1. tyomitch
            00.00.0000 00:00
            -1

            "идентификатор" -- это плохой перевод: например, в PROCESS_INFORMATION подряд идут process handle, thread handle, process ID, thread ID.

            Я встречал "дескриптор", "манипулятор" и ещё какие-то заумные варианты. Почему никто не пишет просто "ручка процесса", "ручка файла"?


            1. shuhray
              00.00.0000 00:00
              +5

              "Рукоятка" было бы хорошо. Изредка пытаются переводить (вот переводчик этой статьи написал "обратная разработка" и его тут же обругали). "Зловред" хорошее слово, смешное и по сути дела. Но вообще молодёжь пишет удивительно мутно. Вот недавний пост здесь, на хабре "Сегодня я хочу рассказать про проблему построения оптимального плана выполнения запроса при использовании коллекций в качестве входных переменных запроса и вариантах ее решения." Кто на ком стоял, какой падеж "про проблему и вариантах". Смысл, я так понял, такой "Как сделать, чтобы запрос выполнялся быстрее, если на входе коллекция".


          1. FoxWMulder
            00.00.0000 00:00

            у меня произошло зависание процессов в голове на несколько секунд когда на вход поступила информация что кто-то пытался переводить слово handle. нафига и зачем? чтобы читая статью где это слово будет переведено, мысленно в процессе чтения его ещë раз переводить?


            1. shuhray
              00.00.0000 00:00

              Хочется читать понятный текст. Если человек не знает ни русского, ни английского, он выдумывает слова вроде "фичемапа". Один знакомый математик уже в зрелом возрасте уехал жить в США, там подзабыл русский язык, а английский выучил плохо. И вот он говорит "ещё один релевантный экзампл".


              1. FoxWMulder
                00.00.0000 00:00

                думаю для программистов etc всяко понятней "handle приложения", чем " ручка приложения", как тут его переводили. да и вообще "handle" понятнее всего другого будет.


      1. event1
        00.00.0000 00:00
        +2

        Редкий случай, когда согласен с политикой и курсом партии "Единая Россия".

        К сожалению этот вопрос нельзя решить принятием закона. Люди всё равно будут говорить так, как им нравится


      1. leprekon69
        00.00.0000 00:00

        Это как куча-мала, только фич много? ))


  1. panzerfaust
    00.00.0000 00:00
    +3

    Это музыка вызова лифта, её играют в коридорах возле лифтов

    Не понял, зачем ее броадкастить постоянно. Я думал такие вещи или вшиты в прошивку или загружаются типа раз в день.


    1. Tomasina
      00.00.0000 00:00
      +5

      Для программиста так было проще, наверное под рукой уже был готовый сниппет кода.

      А работу заказчик принимал по функционалу - заявленное в ТЗ работает? Работает. А как оно там внутри реализовано - заказчику пофиг.


    1. usrsse2
      00.00.0000 00:00
      +18

      В оригинале:

      What the hell? I can’t believe I spent time for this. It’s just elevator music. It is played in the hotel corridors around the elevators. Oh well, at least I can listen to it from my room now.

      Это не звук прибытия лифта, а музыка, которая просто играет в лифтовом холле (постоянно).


      1. Tomasina
        00.00.0000 00:00

        Ну вот, все испортил... А мы тут уже такой экшн развели, лучше оригинала.


      1. ku4in
        00.00.0000 00:00
        +1

        А я так и понял при прочтении.


      1. dartraiden
        00.00.0000 00:00
        +1

        В Википедии даже есть статья про такую музыку.


    1. MiraclePtr
      00.00.0000 00:00

      Чтобы в какой-то момент вместо музыки при необходимости можно было транслировать что-то другое? Да, понятное дело, можно было "постоянную" музыку хранить локально, и при этом все равно слушать броадкасты, но это уже больше логики и кода, а тут все максимально просто и прямолинейно, и заодно и мониторинг в комплекте - если музыка у лифта перестала играть, значит что-то сломалось ;)


      1. VADemon
        00.00.0000 00:00

        Броадкасты... судя по всему, где-то по пути разучились пользоваться мультикастом вместо броадкаста. Иначе бы он эти пакеты в Wireshark сходу не увидел.


    1. develmax
      00.00.0000 00:00

      Напоминает очень компьютерные игры, где музыка так же играет в лифтовом холле. Плюс это позволяет синхронизировать музыку одновременно в разных местах, то есть приехал на другой этаж - там музыка продолжает играть, а не "рвется" или сменяется на другую.


  1. OptimumOption
    00.00.0000 00:00
    +1

    Порой за гуглопереводчик хочется просто убивать...


    1. develmax
      00.00.0000 00:00
      +3

      Не переживай, есть отдельный котёл...


  1. EXL
    00.00.0000 00:00

    Теперь осталось подменить музыку в лифте на эту (:


  1. ulovka22
    00.00.0000 00:00
    -1

    Ковер в казино
    Ковер в казино

    Когда-нибудь вместо музыки можно будет транслировать рисунки для ковровых покрытий


    1. Tomasina
      00.00.0000 00:00

      На такой ковер фишку уронишь - и хрен найдешь.


      1. svosin
        00.00.0000 00:00

        Так в этом и смысл, скорее всего.


      1. Alexufo
        00.00.0000 00:00
        +2

        надо голову класть на пол и снимать рельеф, а не анализировать контрастную составляющую сверху)


        1. svosin
          00.00.0000 00:00
          +1

          Можно считерить и подсветить фонариком параллельно полу. Объект отбросит длинную и очень заметную тень. Я так комаров ночью ловлю.


        1. Tomasina
          00.00.0000 00:00
          -1

          Игрокам не в масть жопу отклячивать.


      1. ulovka22
        00.00.0000 00:00

        не в этом дело, я просто представил, как бы автор расшифровывал трафик с картинками для ковров вместо радио


    1. maxwolf
      00.00.0000 00:00
      +2

      "У меня дома нет телевизора, поэтому я ем грибы и смотрю ковёр"...


  1. hardim
    00.00.0000 00:00

    Странно что для этого использовалась гостевая сетка. Скорее всего и приватной то нет.