Подводка ведущего

Итак, те, кто в принципе часто ходит к нам на мероприятия, в том числе на мероприятия, которые происходят как раз к нам зимой, то есть «Цифровая криминалистика 2025» в этом году у нас была. И все вы наверняка помните, что тогда как раз-таки в зоне прожарки у нас была довольно горячая дискуссия. И на самом деле подводку к следующему докладу я писал совершенно другую. Но сегодня на ваших глазах, на сцене, как раз-таки молодые кадры Наталия Котова из ЭКЦ Ярославской области. Давайте поддержим с супераплодисментами.

Представит как раз-таки тему, которая сегодня у нас у всех на устах. SpyNote. Так, как я и обещал, вот кликер. Листать, собственно, так. Вот нижний слайд. Вот микрофон. Вот, пожалуйста, начинай.

Доклад и вопросы

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

Итак, для начала давайте познакомимся. Я эксперт компьютерных и радиотехнических экспертиз и исследований ЭКЦ МВД России по Ярославской области. Год назад я закончила ведомственный университет по специализации компьютерной экспертизы и, соответственно, уже год занимаюсь их производством. Придя на работу, первым же делом я столкнулась с валом экспертиз по телефонному мошенничеству. Думаю, слова об актуальности этой проблемы будут излишни. И так получилось, что чаще всего на исследование попадался именно SpyNote. Кратко о том, что он из себя представляет.

SpyNote — это наименование семейства угроз. Полный вердикт антивируса вы можете видеть на слайде. Он представляет собой вредоносное программное обеспечение класса RAT-троянцев для устройств платформы Android. Согласно отчетам Лаборатории Касперского, уже несколько лет SpyNote входит в топ-10 вердиктов и его популярность стабильно растет. Как вы можете видеть, существует он уже давно. В 2022 году в сеть утек его исходный код конструктора, одной из версий, что только увеличило его популярность.

Наиболее часто SpyNote используется для перехвата SMS-сообщений с кодами подтверждений. Легенды попадаются разные. Запись ко врачу, антивирус, трекер посылок. На слайде вы можете видеть образцы приложений, которые находились на исследуемых устройствах. Меняются только иконки и названия. При этом SpyNote обладает довольно широким функционалом. Я предлагаю познакомиться с его возможностями в действии.

Без VPN и SMS-регистрации в интернете можно скачать конструктор SpyNote версии 6.4. Это довольно старая версия, возможно, та самая утекшая. Собранные ей APK-файлы отличаются от боевых, однако являются полноценно рабочими. Итак, создать свой троян можно за несколько шагов. Первое – это выбрать иконку, имя и версию. Второе – настроить адрес хоста и порта. Третье – выбрать дополнительные свойства и собрать APK-файл. Все это происходит автоматически. Доступна также склейка с другим APK, тогда в пакет приложения будут включены ресурсы другого приложения.

После установки приложения на устройство и предоставления ему всех разрешений на админ-панели отобразится зараженное устройство. В выпадающем списке можно выбрать доступные модули. Для краткости покажу только самое интересное. Первые три модуля на слайде отвечают за просмотр содержимого SMS-сообщений. Кстати, хочу отметить, что отправка SMS этой версии не предусмотрена.

Также просмотр истории вызовов и просмотр сведений о контактах и номерах телефонов. Далее мы видим файловый менеджер, который позволяет взаимодействовать с файловой системой без рут-доступа. Здесь можно копировать, удалять, создавать и добавлять новые файлы. Также есть возможность скрытого доступа к камерам. Для пользователя он незаметен, и работает он даже с заблокированным экраном.

Еще одна интересная функция — это Keylogger. Он подразумевает запись всех событий взаимодействия пользователя с оболочкой. Например, открытие-закрытие приложений, навигация по системе, уведомления, в том числе системные, содержимое ввода с клавиатуры и прочее. Все это не только расширяет возможности действия пользователя, отслеживание действия пользователя, но и позволяет перехватывать чувствительную информацию.

Также у приложения есть доступ к некоторым настройкам устройства. Например, можно заблокировать экран удаленно, сделать сброс до заводских настроек и даже установить пароль блокировки экрана. Все это без подтверждения пользователя. Я это проверяла.

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

Теперь поговорим о производстве экспертиз. Типовыми вопросами для таких экспертиз являются наличие файлов, детектируемых антивирусным программным обеспечением. И никак иначе, никаких вредоносных вирусов. Это единственная правильная формулировка вопроса.

Также интересует наличие программ для удаленного доступа, история вызовов и SMS-сообщений, история обмена сообщениями посредством мессенджеров и социальных сетей и сведения о посещении веб-страниц.

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

Если в результате сканирования обнаружен APK-файл, то проводим статический и динамический анализ. И, конечно же, просматриваем извлеченную информацию. Тут я хочу обратить внимание на важность изучения ленты событий.

Для себя все равно необходимо установить наиболее полную картину произошедшего. Поэтому мы смотрим и сравниваем, сопоставляем все факты, переписки, звонки, системные артефакты. Удобнее всего это как раз делать в ленте событий. Теперь я хочу подробнее остановиться на статическом и динамическом анализах.

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

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

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

Спрашивали про инструменты сегодня уже. Для решения задач статического и динамического анализов доступен широкий набор инструментов. Думаю, многие вам известны. Для декомпиляции APK-файлов можно использовать такие базовые утилиты, как apktool, JADX, dex2jar.

Например, графическая версия JADX позволяет просматривать декомпилированный код и манифест-файл. В этом случае анализ полностью возлагается на эксперта. Для обнаружения методов обфускации используются APKiD, strings, grep и прочие инструменты используются для поиска по строкам.

Для динамического анализа в первую очередь нам нужна виртуальная среда. Тут также доступно множество вариантов. А для анализа сетевого трафика выбор инструмента зависит в первую очередь от используемых сетевых протоколов. В основном используются протоколы HTTP. Тогда будет достаточно прокси, например, Burp Suite либо ZAP. Для анализа TCP и всех остальных пакетов, конечно же, больше подойдет Wireshark.

Также не могу не рассказать о своей находке. Это Mobile Security Framework. Это открытое программное обеспечение, которое предназначено для оценки безопасности приложений. Однако оно неплохо применяется и для наших задач.

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

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

Разберем подробнее статический анализ. Основной источник информации о приложении – это, конечно же, файл-манифест. Его спецификацию можно посмотреть на официальном сайте для Android-разработчиков по ссылке внизу слайда.

Из корневого тега manifest мы получаем имя пакета приложения и его версию. Смотрим далее набор разрешений или permission. Например, нашего APK, который мы создавали, мы видим, что приложению требуется доступ к контактам, телефоном, SMS, геолокацией. На слайде список неполный. Далее в манифесте идет описание структуры. Приложение должно иметь как минимум одну activity.

Intent-filter этой activity, например, MAIN и LAUNCHER указывает на то, что это основная activity, которая доступна по ярлыку из лаунчера, как раз когда мы нажимаем и открывается приложение.

Также приложение может иметь фоновые службы, которые описываются в компоненте сервисов. Например, наше приложение имеет сервис, который объявлен как accessibility service. Это означает, что приложение может быть активировано в качестве службы специальных возможностей, и это позволит ему получить, например, доступ к содержимому экрана пользователя.

Также приложение может иметь ресиверы, реагирующие на системные широковещательные события. Например, это контроль входящих SMS и контроль запуска устройства. Однако стоит понимать, что все это свидетельствует лишь об отслеживании таких событий. Чтобы установить, для чего именно они используются и используются ли вообще, надо смотреть код внутри объявленных классов.

Удобно проводить статический анализ в Mobile Security Framework. Он предлагает нам довольно широкий отчет. Я пробегусь по самому основному. Вначале идет информация о файле и приложении, в том числе все его хэш-суммы, отображаемое имя, имя пакета, имя главной activity, версия приложения. Также можно посмотреть декомпилированный манифест, посмотреть декомпилированный и даже скачать декомпилированный исходный код на языке Java.

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

Далее идет список используемых Android API. Тут немного поясню. Android API — это такой набор интерфейсов, предоставляемых системой Android для доступа к ее функциям. Сравнение этих API-вызовов с, например, запрашиваемыми разрешениями в манифесте позволяет нам оценить, насколько используются эти разрешения в коде.

Еще из интересного — Malware-анализ. Он включает в себя анализ APKiD и поведенческий анализ. Анализ APKiD позволяет выявить средства защиты приложения, например, от запуска в виртуальной среде, а также какие инструменты используются для сборки приложения.

Поведенческий анализ заключается в сопоставлении типовых паттернов в коде с базой правил и определении на этой основе потенциального поведения приложения. Как вы можете видеть на слайде, в отчете указывается список таких совпадений. У них присутствуют краткие лейблы, по которым можно ориентироваться. И опять же ссылки на исходный код, причем с выделением той функции, которая отвечает за этот функционал.

В отчете также включаются результаты поиска в исходном коде по URL-адресам. Но тут стоит понимать, что он ищет именно по регулярному выражению. Если даже URL-адрес будет разбит в коде, отдельно домен, отдельно протокол, он его уже не найдет, но иногда может повезти. И он найдет целиковый URL-адрес, если такой будет.

Я бы отнесла к недостаткам то, что не осуществляется поиск по IP-адресам. Это было бы удобней, чем искать их вручную. К этому мы еще вернемся.

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

Отдельно остановлюсь на поиске сетевых адресов. Достаточно актуальная такая задача.

Основными источниками для поиска выступают ресурсы приложения и исходный код. Мы можем искать строки по ключевым словам, например, host, port и другие. IP-адреса можно искать по регулярному выражению.

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

SpyNote выполняет свои функции исключительно по команде от управляющего сервера. Также при создании APK-файла, если вы помните, мы указывали значения host и port. Следовательно, приложение должно в себе где-то иметь эти значения. И вот в нашем образце эта информация хранится в строках ресурсов. Вот ее можно найти здесь.

Перейдем к динамическому анализу. В случае со SpyNote я использовала связку Mobile Security Framework, эмулятор Android Studio с 10-й версией Android и Wireshark, так как SpyNote использует TCP-пакеты для обмена со своим сервером.

Больше ничем это не посмотреть.

После установки приложения сразу запрашивает подтверждение в меню специальных возможностей. Далее он перекидывает на активацию приложения в качестве администратора устройства. Также он создает каталог пользовательской директории, в котором он хранит APK-файл, который мы использовали для склейки. И, интересно, что самое главное, лог-файл SpyNote.

В этот лог-файл, если мы посмотрим, содержатся как текстовые данные, так и блоки, закодированные в Base64. Он записывает туда все свои данные кейлогера.

И при декодировании, например, этих блоков мы можем получить иконки приложений. Если тестировать приложение без доступа к сети интернет, что будет криминалистически правильно, то мы увидим только DNS-запросы по доменному имени управляющего сервера. Этого уже достаточно, чтобы обнаружить адрес и подтвердить результаты статического анализа. Но с интернетом уже интереснее. Сначала наш домен, конечно же, получает IP-адрес, а потом устанавливает TCP-соединение с ним. Данные передаются в сжатом виде.

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

И дальнейшее взаимодействие происходит исключительно по запросам от сервера. Ну и на десерт у нас немного форензики. Если приложение установлено, тут все просто. Каталог с данными будет расположен в /data/data. Сведения об установленном приложении, дату и время установки, его отображаемое имя мы можем получить из файлов баз данных в frosting.db и в verify_apps.db. Эти базы в основном всегда есть. Ну и, конечно же, основным файлом, содержащим сведения о всех установленных приложениях, является packages.xml.

Там, помимо прочего, еще указывается и инициатор установки, и приложение-установщик.

Становится интереснее, если приложение не установлено. В таком случае выручает поиск по имени пакета приложения. Я вообще советую всегда его проводить, так как может найтись множество интересных артефактов. И у каждого производителя мобильной техники они могут быть разными.

Так, например, на устройствах Samsung можно найти сведения об установке и удалении приложения в логе использования батареи.

Лог пакетного менеджера Android содержит еще больше информации, в том числе сведения, опять же, об инициаторе установки.

Ну, а что делать, если ни файла, ни приложения на устройстве уже нет? Тут нам на помощь, не реклама, может прийти встроенный антивирус, например, такой есть у Сбербанка. В файле 30.db записываются сведения о детектировании файла приложения с указанием вердикта и имени пакета, соответственно, времени. Таким образом, мы можем доказать наличие вредоносного приложения без наличия. То есть оно там было.

Если SpyNote у нас запускался, то на устройстве с большой вероятностью будет присутствовать его лог-файл. Например, на слайде вы можете видеть его фрагмент декодированного содержания.

На этом мой доклад подходит к концу. Тема довольно широкая. Я постаралась осветить все ключевые моменты. Получилось такое небольшое практическое руководство, которым можно пользоваться при исследовании. Спасибо за внимание. Готова ответить на ваши вопросы и все обсудить.

Круто!

— Большинство современных ВПО используют крипторы и обфускаторы кода. Я так понимаю, в данном случае исходный код открытый, ничего такого нет. Но сталкивались ли вы с этим в своей практике и как вы с этим справляетесь? И туда же вопрос примерно в криптографию. Если у нас подкрепленный сертификат, SSL pinning, SSL unpinning делали, что-то такое, чтобы читать трафик.

— Спасибо за вопрос. По поводу обфускации. Да, в SpyNote она особенно используется, но здесь уже как бы идет речь о насколько необходимо копаться в исходном коде. Насколько есть на это компетенции, насколько есть на это время и насколько нужно копаться в исходном коде. В основном обфускация проявляется в огромнейшем, таком странном, непонятном наименовании всех классов и переменных. Поэтому анализировать это вручную довольно сложно. Поэтому я нашла для себя удобным использовать такое автоматизированное решение, например, с поведенческим анализом. Там можно быстро посмотреть, где открывается сетевой сокет, где SMS. Опять же, насколько это надо. В основном задача сводится к тому, чтобы найти IP-адрес управляющего сервера.

А по поводу… повторите второй вопрос. Второй вопрос о шифровании трафика. Если приложение использует собственный сертификат, оно шифрует трафик им и на подменное, оно не среагирует, даже если мы там загрузим Burp CA сертификат, допустим, в телефон, мы все равно не увидим расшифрованный трафик. Да, с трафиком здесь, смотрите, так как такого типа программного обеспечения, оно является клиент-серверным. Например, при производстве экспертиз мы как бы стараемся не выпускать наши исследуемые образцы в интернет, и поэтому в основном с задачей анализа трафика мы как бы как таковой не сталкиваемся, потому что, так скажем, вероятность получить обратный ответ от управляющего сервера уже там по прошествии времени, ну, достаточно мала.

Бывало, конечно, такое, когда мошенники воспользовались этим чатом и писали эксперту. Но как бы задача такой обычно не стоит. Здесь я привела пример этот, потому что у меня был и клиентская часть приложения, и серверная. Я могла отследить этот трафик. В данном случае шифрование не используется. Используется только сжатие Gzip, которое достаточно легко декодировать и получить содержание пакетов. Просто некоторые приложения не отдадут вам адрес управляющего сервера, если поймут, что они не в сети. Они сделают запрос на, условно, API сервера, чтобы определить, какой у них внешний IP-адрес. Если не увидят ответ, они никуда не подключатся. Да, это очень хороший вопрос тоже.

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

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