Потрошим шпионскую «малину». Как я нашел неизвестную Raspberry Pi в серверной и установил владельца
Форсайт
Недавно мы с коллегами случайно нашли в серверной неопознанный одноплатник Raspberry Pi — проанализировали его (не без помощи сообщества с Reddit) и даже сумели вычислить владельца вредоносной «малины». И сейчас я расскажу, как нам это удалось.
Это перевод статьи Кристиана Хашека, впервые опубликованной в его блоге. Перевела Алёна Георгиева. Все иллюстрации в статье принадлежат автору.
На прошлой неделе мой коллега прислал мне вот такое сообщение с фото.

Я попросил его отключить «малину», поместить в безопасное место, отфотографировать все части одноплатника и снять образ с SD-карты (поскольку сам я в основном работаю удаленно). Я часто имел дело с Raspberry Pi и был уверен, что смогу выяснить, чем занимается эта машинка.
В тот момент никто не думал, что «малина» окажется вредоносной, — скорее полагали, что кто-то из сотрудников фигней мается.
Части одноплатника
Наша «малина» состояла из трех частей:
- Raspberry Pi (модель B) первого поколения;
- таинственный электронный ключ;
- карта SD на 16 гигов (быстрая).

Первое, что нужно сделать: опросить всех, кто имеет доступ к серверной
Число людей, которые имеют доступ к этому шкафу, очень невелико — ключ от серверной есть только у четырех человек:
- руководитель;
- завхоз;
- мой коллега;
- я.
Никто из нас ничего не знал о «малине», так что я спросил других коллег из IT — и озадачил их не меньше. Разумеется, я слышал, что некоторые люди за деньги размещают подобные штуки там, где им не место, — поэтому мне было очень интересно, чем же на самом деле занимается эта конкретная.
Что ж это за ключ?
В поисках разгадки я обратился к сообществу Reddit — и оно меня не подвело. В ключе уверенно опознали микропроцессор nRF52832-MDK — почти такой же мощный, как сам Raspberry Pi.
Это серьезное считывающее устройство для Bluetooth, Wi-Fi и RFID.

Он, безо всяких сомнений, должен был дать старенькому Raspberry Pi возможность подключаться по Wi-Fi и Bluetooth. Отлично, подумал я, теперь у этой штуковины еще и вайфай есть…
Препарируем образ SD-карты
На карте оказалось несколько разделов. Файловой системой большинства из них была ext4 (Linux), а у одного (загрузочного) раздела — FAT16.

Отлично, самое время их вскрыть.
Моя дебиановская песочница принесла первую серьезную подсказку: я обнаружил установленный Resin.

Что за Resin?
Resin (недавно переименованный в Balena) — это платный веб-сервис, где можно генерировать образы для устройств IOT, развертывать их, получать и передавать обновления и данные.
А еще Resin устанавливает на девайс VPN — так что можно безопасно передавать собранные данные. Очевидно, устройство планировали забрать — ведь если использовать платный сервис, это оставляет следы.
Приглядимся к разделам
Первый раздел называется resin-boot.

Видишь что-нибудь цепляющее взгляд? Правильно — config.json. Неужто мы сорвали джекпот?

Что мы можем вытащить из этого файла.
- Приложение, развернутое на нашем «резиновом» девайсе, называется logger. Ничего хорошего.
- У нас есть username. По всей видимости, это имя пользователя от аккаунта Resin, связанного с девайсом.
- Подтверждение того, что девайс использует VPN через порт 443.
- Дата регистрации. Устройство было зарегистрировано (или развернуто? или настроено?) 13 мая 2018 года.
Насчет имени пользователя…
Прогуглив имя из файла config.json, я нашел человека в том же городе, где была обнаружена «малина». Затем компания проверила свои записи о нем, но ничего не нашла.
Как ни странно, по тому же запросу я нагуглил еще и сайт 2001 года, где родители «одаренных детей» пишут статьи о своих чадах и почему-то подписывают их домашним адресом и номером телефона. Так я получил имена и адрес целой семьи.

Зацепка может оказаться ложной, ведь одни и те же имена могут использовать совершенно разные люди — так что пока просто его запомним.
resin-data
В директории с данными, собственно, не хранилось никаких данных (в смысле, собранных данных), зато обнаружилось приложение на Node.js, сильно сбившее меня с толку — признаться, я до сих пор не могу четко сказать, чем оно занималось. Кажется, «разговаривало» с ключом через последовательное соединение, но я так и не смог выяснить, что за данные оно собирало. Полагаю, отслеживало движение устройств Bluetooth и Wi-Fi в зоне действия (вокруг кабинетов руководства, между прочим) и, может быть, перехватывало необработанные пакеты Wi-Fi.
Зато я нашел кое-что поинтересней — файл LICENSE.md.

Странно… Зачем в такой приложухе на Node.js предупреждение о конфиденциальности? Я прогуглил компанию из копирайта — и знаешь что?
Чувак с именем из config-файла — совладелец компании
Почему сооснователь компании раскидывает эти девайсы по городу — выше моего понимания, но ладно…
Получаем домашний адрес злоумышленников
Другую интересную деталь я нашел в третьем разделе (resin-state) по адресу /root-overlay/etc/NetworkManager/system-connections/. Файл назывался resin-wifi-01 — и угадайте, что в нем было.

А были в нем учетные данные Wi-Fi, через который настраивали (или тестили) устройство. И это определенно не Wi-Fi нашей конторы. А что мы делаем, когда хотим найти локацию, связанную с именем конкретного вайфая? Идем на wigle.net, вводим SSID (то есть имя вайфая) — и получаем координаты.

И что ты думаешь? Это адрес тех самых родителей одаренного ребенка. Именно отсюда, согласно Wigle.net, настраивали наш девайс.
Последствия
Как и когда «малина» вообще к нам попала?
Я проверил логи DNS и выяснил точное время, когда «малина» впервые появилась в сети. Следом я проверил логи Radius, чтобы посмотреть, кто из сотрудников находился тогда в помещении, — и увидел кучу сообщений о том, что к Wi-Fi пытается подключиться деактивированный аккаунт.
Деактивированный аккаунт принадлежал бывшему сотруднику — тот (по некоторым причинам) договорился с руководством, чтобы ему оставили ключи, пока он не заберет все свои пожитки из офиса (не спрашивай…).
Что теперь?
Теперь в игру вступают юристы — я же сделал свое дело, а остальное находится за пределами моих компетенции и зарплаты. Но для меня эта история стала интересным челленджем — и я благодарен пользователям Reddit, которые помогли мне с кусочками этого пазла.