РАЗБОР
На проверке
Реверс-инжиниринг Android RAT: CraxsRAT и EagleSpy
Режим чтения
[ обложка статьи ]
CraxsRAT регулярно всплывает в кампаниях против финансового сектора Юго-Восточной Азии: фишинговый сайт под локальный бренд, скачивание APK, кража credentials, вывод средств - всё за одну сессию. В некоторых кампаниях исследователи находили десятки и сотни сэмплов с единой схемой генерации имён пакетов, замаскированных под бренды торговли, доставки и общепита. Когда такой билд попадает на стол, первое, что бросается в глаза - шаблонность архитектуры. Один билдер, одинаковая обфускация, предсказуемые места хранения C2-конфигурации. Ниже - полный цикл реверса: от распаковки APK и разбора манифеста до Frida-хуков для перехвата C2 и генерации YARA-правил.
Профиль угрозы: CraxsRAT, G700 и EagleSpy
CraxsRAT и EagleSpy - два семейства Android RAT, которые постоянно мелькают в инцидентах финансового сектора Юго-Восточной Азии. Оба дают оператору полный удалённый контроль над устройством, но отличаются по происхождению и набору модулей.CraxsRAT вырос из SpyMax (ранее SpyNote) после утечки исходников в 2020 году. За разработкой, по неподтверждённым данным, предположительно стоит актор под псевдонимом EVLF (атрибуция требует независимой верификации). Серверная часть на C# упакована DNGuard, мобильный payload - на Java. Одна из последних задокументированных версий - CraxsRAT v7.5 (предположительно апрель 2024). Дальше эволюция привела к G700 RAT - варианту с модулем ransomware locker, подменой криптовалютных адресов и функцией Hide SMS для бесшумного перехвата OTP. Как работает Hide SMS: модуль интегрируется с дефолтным SMS-приложением жертвы, подавляет входящие уведомления и перенаправляет каждый новый OTP в Telegram-бот оператора в реальном времени. Жертва не видит ни одного SMS.
EagleSpy v3.0 предположительно обнаружили в марте 2024 года на одном из хакерских форумов. Главное отличие - встроенный Google 2FA Stealer для перехвата кодов двухфакторной аутентификации и real-time передача через Telegram-бот. EagleSpy целенаправленно бьёт по криптовалютным кошелькам: Trustwallet, Metamask, Coinbase, Kraken. Механизм crypto injection мониторит открытые приложения - при обнаружении криптокошелька выкидывает overlay, поддельную страницу ввода seed-фразы или приватного ключа. Введённые данные уходят оператору мгновенно. Функция Injection обеспечивает персистентность: при каждом открытии кошелька overlay появляется снова. EagleSpy также умеет screen manipulation - отображение произвольного контента или блокировка экрана пустым изображением, чтобы замаскировать действия оператора на устройстве.
Оба семейства дают оператору: кейлоггинг, запись экрана и камеры, перехват SMS и звонков, GPS-трекинг, доступ к файловой системе и полноценный бэкдор через C2-панель.
Цепочка атаки Android RAT: от фишинга до эксфильтрации
Понимание сквозного потока атаки - обязательная штука перед реверсом. Без контекста можно часами ковырять байт-код в нерелевантных участках.Фаза 1 - доставка. Основной вектор - фишинговые страницы под легитимные сервисы. В малайзийской кампании CraxsRAT это были поддельные сайты food-брендов с предложением «скачать приложение для покупки». EagleSpy распространяется через вредоносные APK в сторонних магазинах и ссылки в Telegram. G700 RAT поднимает поддельную страницу Google Play Store - оператор кидает жертве сокращённый URL, ведущий на фальшивую витрину с кнопкой «Установить». Это техника Malicious File (T1204.002, Execution) по MITRE ATT&CK.
Фаза 2 - инсталляция и закрепление. Часть билдов использует двухэтапную схему: dropper-APK с минимальным набором разрешений вытаскивает из
assets/ скрытый payload и ставит его на устройство. Payload регистрирует BroadcastReceiver на BOOT_COMPLETED для автозагрузки и запрашивает Accessibility Service - через него перехватывает ввод и управляет жестами.Фаза 3 - сбор данных. Кейлоггинг (T1056.001), скриншоты (T1113), запись камеры (T1125) и микрофона (T1123), чтение SMS, контактов, GPS-координат. Для финансовых атак критичен перехват SMS-OTP: G700 подавляет уведомления и перенаправляет коды в Telegram-бот, EagleSpy перехватывает Google 2FA напрямую.
Фаза 4 - монетизация. Прямая кража банковских credentials через overlay (фишинговая HTML-страница поверх банковского приложения). Подмена криптовалютных адресов - функция
Binanceinj() в G700 заменяет адрес получателя на кошелёк оператора прямо в интерфейсе Binance, жертва видит «легитимную» транзакцию. Вымогательство через ransomware locker - кастомизируемый модуль с блокировкой устройства. В продвинутых сценариях оператор выводит на экран поддельное уведомление об «обновлении ПО», отключает touch-input и работает через удалённый доступ - жертва физически не может вмешаться.Подготовка лаборатории для анализа вредоносного APK
Детонация RAT на основном устройстве - ошибка, которую допускают один раз. Второго шанса может не быть.Эмулятор - AVD через Android Studio с root-доступом или Genymotion. Архитектура x86_64 для скорости, но ARM-сэмплы с нативными .so потребуют ARM-образ. Сетевая изоляция обязательна: эмулятор за NAT с контролируемым выходом. Стоит поднять fake C2 - HTTP-сервер на Python (
http.server или Flask), принимающий POST-запросы и логирующий payload. Так можно увидеть формат первичной регистрации: device fingerprint, IMEI, информация о SIM-карте.Статический анализ:
jadx (DEX → Java), apktool (ресурсы + smali), Ghidra (нативные .so). Для первого прохода хватит jadx-gui за глаза - покажет основную картину.Динамический анализ: Frida (JS-хуки в runtime JVM-процесса),
mitmproxy или Burp Suite (HTTP/HTTPS-трафик), Wireshark (сырой трафик до TLS-хендшейка). Все инструменты работают в связке: Frida перехватывает расшифровку конфигурации внутри процесса, mitmproxy ловит уже расшифрованный HTTP-трафик на выходе.Статический анализ CraxsRAT: распаковка APK и извлечение C2
, который вытаскивает
childapp.apk из assets/ и ставит на устройство. Именно childapp.apk содержит основной RAT: C2-конфигурацию, фишинговые HTML-шаблоны в res/inject/ и полный набор spyware-модулей.Я видел, как аналитики тратили часы на изучение dropper-кода и не находили ничего подозрительного - потому что интересное лежит во вложенном APK. Первым делом проверяйте
assets/ на вложенные файлы: find sample_src/assets/ -name "[I].apk" -o -name "[/I].dex". Нашли вложенный APK - вытаскивайте и анализируйте отдельно как полноценный сэмпл.Деобфускация строк и поиск C2-адресов
CraxsRAT и производные используют Base64 для сокрытия C2-адресов и HTML-кода фишинговых страниц. Это минимальный барьер против автоматических сканеров, не криптография. Скорее красивый фантик, чем реальная защита.В
jadx-gui ищите вызовы android.util.Base64.decode() в классах конфигурации или инициализации. В smali-коде (через apktool) аналогичные вызовы выглядят как invoke-static {v0, v1}, Landroid/util/Base64;->decode([BI)[B. Результат декодирования - IP-адрес или URL C2-панели.Конкретный паттерн из разбора G700: в каталоге
res/inject/ хранятся Base64-закодированные HTML-страницы, имитирующие интерфейсы банков и криптобирж. Функция Binanceinj() декодирует HTML и подставляет адрес криптокошелька оператора вместо адреса получателя - жертва видит «нормальную» страницу транзакции.ProGuard/R8 (штатный минификатор Android) переименовывает классы в
a.b.c.d, но логику не скрывает - вызовы decode(), encrypt(), connect() сохраняют семантику. В некоторых кластерах билдов встречается дополнительное шифрование конфигурационных строк - алгоритмы варьируются между версиями. Тут статический анализ требует ручного восстановления алгоритма из smali. В таких случаях быстрее переключиться на динамику.Динамический анализ Android RAT с Frida
Статический анализ показывает структуру. Динамический - поведение: что RAT шлёт на C2, какие данные собирает и в какой последовательности.Перехват декодирования конфигурации в runtime
Когда C2-адрес зашифрован сложнее Base64, эффективнее перехватить результат, чем реверсить алгоритм вручную. Frida позволяет хукнутьandroid.util.Base64.decode() и увидеть все декодированные строки до их использования:
JavaScript:
Java.perform(function() {
var Base64 = Java.use('android.util.Base64');
Base64.decode.overload('[B', 'int').implementation = function(input, flags) {
var result = this.decode(input, flags);
var decoded = Java.use('java.lang.String').$new(result);
if (decoded.indexOf('http') !== -1 || decoded.indexOf(':') !== -1) {
console.log('[C2-candidate] ' + decoded);
}
return result;
};
});
String-входом: .overload('java.lang.String', 'int').Если RAT использует кастомное шифрование - стратегия меняется. В jadx находим метод расшифровки (принимает зашифрованную строку, возвращает открытый текст) и хукаем его return-значение. Имя класса берётся прямо из jadx - даже обфусцированное до
a.b.c корректно резолвится Frida в runtime.Подключение к эмулятору с root: запустить
frida-server на устройстве, далее frida -U -f com.package.name -l hook.js --no-pause. Без root - инъекция frida-gadget через apktool, патч smali, пересборка и переподпись APK. Процедура занимает 5-10 минут и документирована в официальном руководстве Frida.Анализ C2-трафика и эксфильтрации
После извлечения C2-адреса запускаем сэмпл сmitmproxy в качестве прокси. CraxsRAT использует HTTP/HTTPS для первичной регистрации устройства - POST-запрос с device fingerprint: IMEI, номер SIM, модель, версия Android. Это System Information Discovery (T1082, Discovery). Дальнейшая коммуникация через Web Protocols (T1071.001, Command and Control) - оператор шлёт команды, RAT возвращает результаты.EagleSpy v3.0 отличается каналом эксфильтрации: данные уходят напрямую в Telegram-бот. В трафике это обращения к
api.telegram.org с методами sendMessage или sendDocument. Telegram-токен бота захардкожен в коде и вытаскивается тривиально - поиском строки api.telegram.org в выводе jadx. Комбинация токен + chat_id достаточна для идентификации оператора и мониторинга его активности. (Да, они реально хардкодят токен. Каждый раз.)Извлечённый C2-адрес открывает операционные возможности: проверка через VirusTotal/Shodan на связанные сэмплы, передача в CERT для блокировки на уровне DNS/IP, анализ C2-панели для оценки масштаба кампании. В подобных кампаниях анализ C2-инфраструктуры позволял выявлять сотни связанных сэмплов.
Маппинг на MITRE ATT&CK: от сэмпла к TTP-профилю
Сопоставление возможностей RAT с MITRE ATT&CK структурирует результаты для SOC и создания детектирующих правил:| Возможность RAT | Техника ATT&CK | Тактика |
|---|---|---|
| Фишинговый сайт, скачивание APK | Malicious File (T1204.002) | Execution |
| Перехват нажатий и PIN-кодов | Keylogging (T1056.001) | Collection, Credential Access |
| Запись экрана и скриншоты | Screen Capture (T1113) | Collection |
| Доступ к камере | Video Capture (T1125) | Collection |
| Запись микрофона | Audio Capture (T1123) | Collection |
| Сбор IMEI, SIM, модели | System Information Discovery (T1082) | Discovery |
| Base64/DNGuard обфускация | Obfuscated Files or Information (T1027) | Defense Evasion |
| HTTP/HTTPS к C2-панели | Web Protocols (T1071.001) | Command and Control |
EagleSpy дополнительно реализует overlay-атаку (фишинговая HTML поверх банковского приложения) и перехват Google 2FA. CraxsRAT/G700 добавляет блокировку экрана поддельным уведомлением об «обновлении» - оператору нужно время на перевод средств, и он отключает touch-input, пока жертва наблюдает progress bar.
Маппинг позволяет SOC-команде искать не конкретный хэш, а поведенческий паттерн: приложение с boot receiver + Accessibility Service + обращение к Telegram API из non-messenger процесса. Эта аномалия работает как детект вне зависимости от конкретного семейства.
Детект CraxsRAT: YARA-правила и IOC
Результат реверса - не только понимание архитектуры RAT. Это конкретные артефакты: YARA-правила для сканирования инфраструктуры и IOC для обогащения SIEM.На основе dropper-механизма G700/CraxsRAT формируем сигнатуру. Индикаторы: внутренний APK в assets, класс-инсталлятор, характерные разрешения:
Код:
rule CraxsRAT_Dropper_Pattern {
meta:
description = "CraxsRAT/G700 dropper APK indicators"
source = "manual reverse engineering analysis"
strings:
$asset = "childapp.apk" ascii
$installer = "SessionManager" ascii
$perm = "WRITE_EXTERNAL_STORAGE" ascii
$boot = "RECEIVE_BOOT_COMPLETED" ascii
condition:
uint32(0) == 0x04034b50
and $asset and $installer
and ($perm or $boot)
}
PK), ищет строки childapp.apk и SessionManager. Это демонстрационное правило - в продакшене нужно дополнить хэшами конкретных сэмплов, протестировать false positive rate и расширить строковыми индикаторами из конкретного кластера билдов.Сигнатурный подход (хэши, строки) устаревает быстро: каждый билд из RAT-билдера генерирует уникальный хэш. Поведенческий подход масштабируется лучше. Для CraxsRAT/EagleSpy поведенческий профиль: (1) установка не из Play Store, (2) немедленный запрос Accessibility Service, (3) регистрация на
BOOT_COMPLETED, (4) сетевая активность к IP, не связанным с заявленной функциональностью. На сетевом уровне - обращения к api.telegram.org из non-messenger процесса или HTTP POST с JSON-payload, содержащим IMEI и SIM-данные, к серверу, не являющемуся легитимным API бренда.Из каждого проанализированного сэмпла вытаскиваются три типа IOC:
Сетевые: IP-адреса и домены C2 (из Base64-декодированных строк или Frida-перехвата), порты подключения, Telegram-токены и chat_id для EagleSpy. Характеристики серверной инфраструктуры CraxsRAT варьируются между кампаниями - при анализе стоит фиксировать версию ОС, локализацию и другие параметры сервера как дополнительные индикаторы.
Файловые: SHA-256 хэш APK и хэш вложенного payload, имена пакетов. В ряде кампаний сэмплы CraxsRAT использовали единую схему генерации имён пакетов - паттерн имени позволяет детектировать новые билды без разбора каждого файла по отдельности.
Поведенческие: запрос Accessibility Service при первом запуске, обращение к
api.telegram.org из non-messenger процесса, регистрация BroadcastReceiver на BOOT_COMPLETED в сочетании с CAMERA + RECORD_AUDIO + SEND_SMS.Формирование IOC-фида из результатов реверса и его интеграция в SIEM/EDR - финальный этап, превращающий разовый анализ в системный детект. Одно YARA-правило на dropper-паттерн покрывает серию билдов из одного билдера, а не единичный хэш.
CraxsRAT и EagleSpy часто недооценивают из-за простоты билдера. И тут - системная ошибка. Код после SpyNote-утечки - копипаста, обфускация уровня Base64, Telegram-токены в открытом тексте. По качеству - уровень студенческого проекта. Но RAT-as-a-Service модель, где билдер уходит за сотню-другую долларов на Telegram-каналах, генерирует тысячи уникальных сэмплов ежемесячно. Каждый билд - новый хэш, слегка изменённые строки, другой C2. SOC, который ориентируется только на хэши и не строит поведенческие детекты (Accessibility Service + boot receiver + Telegram API из non-messenger процесса), пропускает основную массу потока. Одно YARA-правило, собранное за вечер реверса, закрывает больше сэмплов, чем месяц работы по спискам IOC из тикетов. Проблема не в том, что эти RAT технически примитивны - проблема в том, что их считают недостойными системного анализа. А потом сотни билдов одного CraxsRAT обнаруживаются постфактум, когда средства уже выведены. В ближайший год RAT-билдеры начнут автоматизировать ротацию C2 и строковую обфускацию - разрыв между скоростью генерации сэмплов и скоростью анализа станет ещё острее. Если хочется отработать навыки реверса мобильных сэмплов на контролируемых стендах - задачи на HackerLab.pro как раз для этого.
AI-выжимка
сгенерировано ИИ
Тезисы статьи скоро
Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Содержание
Codeby Academy
Практика и мастерство
От основ до продвинутого — программы для практиков Codeby.
Перейти к курсу →
Поиск в обсуждении
Карта ветки
Продолжить чтение
Следующий разбор
Может ли выключенный телефон шпионить за вами
Ещё по теме
- Статья
- Статья
Комментарии
0