В начале 2018 года наша технология обнаружения мобильных вторжений выявила подозрительный Android-образец, который, как выяснилось, принадлежал к неизвестному семейству шпионского ПО. Дальнейшее расследование показало, что зловред, которому мы дали название BusyGasper, имеет некоторые особенности, необычные для этого вида угроз. С технической точки зрения, образец является уникальным шпионским имплантом с такими нестандартными функциями, как слежка за датчиками устройства (включая датчики движения), возможность обхода системы энергосбережения «Doze» и невероятно широкий протокол – около ста команд. Как и любое современное шпионское ПО под Android, он также может извлекать данные из приложений обмена сообщениями (WhatsApp, Viber, Facebook). Более того, у BusyGasper есть функциональность кейлоггера – зловред обрабатывает каждое касание пользователя к экрану, анализирует координаты касаний, сопоставляет их с заданными величинами и таким образом вычисляет, какой символ ввел пользователь.
Зловред имеет многокомпонентную структуру и может скачивать дополнительный вредоносные инструменты и обновления с C&C, который, как оказалось, является FTP-сервером, предоставляемым российским хостинговым сервисом Ucoz. Стоит отметить, что BusyGasper поддерживает протокол IRC – это редкость для Android-зловредов. И наконец, зловред может использовать электронный почтовый ящик злоумышленников в качестве командного центра: после авторизации он анализирует письма в специальной папке на наличие команд, а также может сохранять вредоносную нагрузку на устройство из вложений электронной почты.
Текущая операция BusyGasper активна примерно с мая 2016 года до настоящего времени.
Вектор заражения и жертвы
При поиске вектора заражения мы не обнаружили следов фишинга или каких-либо других распространенных путей проникновения. Но некоторые признаки, такие как наличие скрытого меню для управления оператором, указывают на ручное заражение – злоумышленники устанавливают зловред, используя физический доступ к устройству жертвы. Это объясняет такое мало число жертв – их менее десяти, и все они расположены в России.
Заинтересовавшись, мы продолжили поиск и нашли еще несколько зацепок, которые раскрывают некоторую информацию о владельцах зараженных устройств. Несколько TXT-файлов с командами, находящиеся на FTP-сервере злоумышленников, содержат в именах идентификаторы жертв, которые, вероятно, были добавлены злоумышленниками:
CMDS10114-Sun1.txt |
CMDS10134-Ju_ASUS.txt |
CMDS10134-Tad.txt |
CMDS10166-Jana.txt |
CMDS10187-Sun2.txt |
CMDS10194-SlavaAl.txt |
CMDS10209-Nikusha.txt |
Некоторые из них похожи на русские имена: Jana, SlavaAl, Nikusha.
Анализ дампа FTP-сервера выявил наличие в нем компонента прошивки ASUS – это указывает на интерес злоумышленника к устройствам этого производителя, а также объясняет, почему строка ‘ASUS’ содержится в идентификаторе жертвы CMDS10134-Ju_ASUS.txt.
В информации, полученной из почтовой учетной записи злоумышленников, содержится множество личных данных жертв, в т.ч. сообщения из мессенджеров.
Файл из почты | Тип | Описание |
lock | Текст | Лог-файл |
ldata | sqlite3 | Сведения о местоположении устройства на основе сетевых данных (cell_id) |
gdata | sqlite3 | Сведения о местоположении устройства на основе GPS-координат |
sdata | sqlite3 | SMS-сообщения |
f.db | sqlite3 | Сообщения Facebook |
v.db | sqlite3 | Сообщения Viber |
w.db | sqlite3 | Сообщения WhatsApp |
Также в числе собираемых данных были сообщения SMS-банкинга, которые указали на наличие у одной из жертв счета с суммой более 10 тысяч долларов. При этом, насколько мы знаем, стоящие за данной кампанией злоумышленники не заинтересованы в краже денег.
Мы не обнаружили никакого сходства с коммерческими шпионскими программами и с другими известными вариантами шпионского ПО, из чего можно предположить, что BusyGasper разработан и используется одной группой злоумышленников. В то же время такие факты, как отсутствие шифрования, использование публичного FTP-сервера и низкий уровень конфиденциальности операции могут указывать на то, что за зловредом стоят злоумышленники невысокой квалификации.
Техническая информация
Ниже приведена метаинформация по найденным образцам:
Сертификат | MD5 | Модуль | Версия |
Serial Number: 0x76607c02 Issuer: CN=Ron Validity: from = Tue Aug 30 13:01:30 MSK 2016 to = Sat Aug 24 13:01:30 MSK 2041 Subject: CN=Ron |
9e005144ea1a583531f86663a5f14607 | 1 | — |
18abe28730c53de6d9e4786c7765c3d8 | 2 | 2.0 | |
Serial Number: 0x6a0d1fec Issuer: CN=Sun Validity: from = Mon May 16 17:42:40 MSK 2016 to = Fri May 10 17:42:40 MSK 2041 Subject: CN=Sun |
9ffc350ef94ef840728564846f2802b0 | 2 | v2.51sun |
6c246bbb40b7c6e75c60a55c0da9e2f2 | 2 | v2.96s | |
7c8a12e56e3e03938788b26b84b80bd6 | 2 | v3.09s | |
bde7847487125084f9e03f2b6b05adc3 | 2 | v3.12s | |
2560942bb50ee6e6f55afc495d238a12 | 2 | v3.18s |
Интересно, что значение поля Issuer «Sun» из сертификата соответствует идентификаторам зараженных устройств «Sun1» и «Sun2» с FTP-сервера; возможно, это тестовые устройства.
Анализируемый имплант имеет сложную структуру. На данный момент мы наблюдаем два модуля.
Первый (стартовый) модуль
Первый модуль, который устанавливался на целевом устройстве, мог контролироваться по протоколу IRC и позволял устанавливать другие компоненты путем загрузки вредоносного функционала с FTP-сервера:
Как видно на скриншоте, приведенном выше, новый компонент копировался в системную директорию, хотя операция такого типа невозможна без root-привилегий. На момент написания у нас не было свидетельств того, что для получения root-привилегий использовался какой-либо эксплойт, хотя, возможно, что для этого злоумышленники использовали какой-либо неизвестный компонент.
Вот полный список команд, которые могут выполняться первым модулем:
Имя команды | Описание |
@stop | Остановить IRC-сервис |
@quit | System.exit(0) |
@start | Запустить IRC-сервис |
@server | Изменить используемый IRC-сервер (по умолчанию «irc.freenode.net»), порт – всегда 6667 |
@boss | Изменить командный nickname в IRC (по умолчанию «ISeency») |
@nick | Изменить nickname импланта в IRC |
@screen | Отправлять отчет о каждом включении экрана (вкл/выкл) |
@root | Использовать root-функциональность (вкл/выкл) |
@timer | Установить временной интервал запуска IRC-сервиса |
@hide | Скрыть иконку импланта |
@unhide | Сделать иконку импланта видимой |
@run | Выполнить указанную shell-команду |
@broadcast | Послать команду второму модулю |
@echo | Записать указанное сообщение в лог |
@install | Загрузить и скопировать указанный компонент в системную директорию |
Имплант использует сложный механизм коммуникации между компонентами, основанный на Intent:
Второй (главный) модуль
Этот модуль записывает лог исполнения команд в файл с названием «lock», который впоследствии отправляется злоумышленникам. Вот фрагмент такого файла:
Лог-файлы могут загружаться на FTP-сервер и отсылаться на электронную почту злоумышленника, также есть возможность пересылать лог через SMS-сообщения на номер злоумышленника.
Как видно на скриншоте выше, в зловреде представлен собственный синтаксис команд, которые состоят из комбинаций символов, а символ «#» используется как разделитель. Полный список всех возможных команд с описаниями доступен в Приложении II.
Зловред обладает всеми функциями современного шпионского ПО для Android. Ниже приведено описание самых примечательных из них:
-
- Имплант способен шпионить за всеми доступными датчиками устройства и вести журнал регистрируемых событий. Более того, есть специальный обработчик данных акселерометра, который может вычислять и логировать скорость передвижения устройства:
Эта функция используется, в частности, командой «tk0», которая выключает звук на устройстве, отключает автоматическую блокировку клавиатуры, отключает подсветку экрана, использует wakelock и прослушивает датчики устройства. Это позволяет зловреду незаметно выполнять любые бэкдор-действия, не давая пользователю знать, что устройство находится в активном режиме. Как только владелец берет устройство в руку, имплант распознает событие движения и выполняет команды «tk1» и «input keyevent 3».
Первая отключает все результаты действия команды «tk0», а вторая – это shell-команда, которая симулирует нажатие кнопки ‘home’, в результате сворачиваются все активные окна, чтобы пользователь ничего не заподозрил.
- Скрытое от пользователя включение служб геолокации в настройках безопасности для отслеживания местонахождения устройства:
- Имплант способен шпионить за всеми доступными датчиками устройства и вести журнал регистрируемых событий. Более того, есть специальный обработчик данных акселерометра, который может вычислять и логировать скорость передвижения устройства:
- Управление имплантом через электронную почту. Зловред может авторизоваться в электронном почтовом ящике злоумышленников, анализировать письма в специальной папке «Cmd» на наличие команд, а также сохранять полезные нагрузки на устройство из вложений электронной почты.
Более того, имплант может отсылать по электронной почте определенный файл или все собранные данные с устройства жертвы.
- Экстренные SMS-команды. Если входящее SMS-сообщение содержит одну или более из следующих магических строк – » 2736428734″ или » 7238742800″ – то зловред выполняет определенную последовательность команд:
Реализация кейлоггера
Кейлоггер реализован оригинальным способом.
Сразу после активации зловред создает в новом окне элемент TextView со следующими параметрами:
Все эти элементы обеспечивают сокрытие элемента от пользователя.
Затем зловред добавляет onTouchListener в элемент TextView и может обрабатывать каждое касание пользователя.
Интересно, что есть особый список activity, касания в которых игнорируются:
ui.ConversationListActivity
SemcInCallScreen
Quadrapop
SocialPhonebookActivity
Обработчик получает только координаты касаний, а затем, сопоставляя их с заданным величинами, вычисляет, какие символы нажимает пользователь.
Кроме того, если это было предварительно задано командой, то клавиатурный перехватчик может сделать скриншот области экрана, где было касание:
Ручной доступ и меню оператора
Существует скрытое меню для управления имплантом, скорее всего, оно создано для ручного контроля зараженного устройства оператором. Для активации этого меню нужно вызвать с зараженного устройства номер 9909:
Сразу после этого на дисплее устройства появится скрытое меню:
С помощью этого интерфейса оператор может набрать любую команду для выполнения. Интерфейс также отображает текущий лог зловреда.
Инфраструктура
FTP-сервер
Злоумышленники используют ftp://213.174.157[.]151/ в качестве командного сервера. Этот IP-адрес принадлежит бесплатному российскому хостинг-сервису Ucoz.
Файл | Описание |
CMDS*.txt | Текстовые файлы с командами на выполнение |
supersu.apk | Утилита SuperSU (eu.chainfire.supersu, https://play.google.com/store/apps/details?id=eu.chainfire.supersu) |
246.us us.x |
Бинарные ELF-файлы SuperSU |
supersu.cfg supersu.cfg.ju supersu.cfg.old |
Конфигурационные файлы SuperSU, предоставляющие импланту root-права |
bb.txt | ELF-файл BusyBox v1.26.2 |
bdata.xml | Конфигурационный файл для исключения компонентов импланта из контроля за энергосбережением Doze |
bdatas.apk | Основной модуль импланта |
com.android.network.irc.apk | Стартовый модуль импланта |
MobileManagerService.apk | Системный компонент из прошивки ASUS (не заражен) |
mobilemanager.apk | Поврежденный архив |
privapp.txt | По-видимому, список системных приложений (включая шпионские компоненты) с одного из зараженных устройства |
run-as.x run-as.y |
ELF-файл инструмента запуска от имени других пользователей |
Фрагмент файла supersu.cfg – конфигурационного файла SuperSU для компонентов импланта и утилиты busybox:
Эти конфигурации позволяют импланту незаметно использовать все root-права.
Содержимое файла bdata.xml:
Файл может быть добавлен в директорию /system/etc/sysconfig/, чтобы внести в список разрешенных указанные компоненты импланта и оградить их от действия системы энергосбережения батареи.
Учетная запись электронной почты
Злоумышленники используют учетную запись Gmail, ее адрес и пароль указаны прямо в коде импланта:
Учетная запись содержит извлеченные данные жертв и директорию «cmd» с командами для зараженных устройств.
Приложение I: Индикаторы заражения
MD5
9E005144EA1A583531F86663A5F14607
18ABE28730C53DE6D9E4786C7765C3D8
2560942BB50EE6E6F55AFC495D238A12
6C246BBB40B7C6E75C60A55C0DA9E2F2
7C8A12E56E3E03938788B26B84B80BD6
9FFC350EF94EF840728564846F2802B0
BDE7847487125084F9E03F2B6B05ADC3
Командный сервер
ftp://213.174.157[.]151/
Приложение II: Список всех возможных команд
Указанные значения действительны для последней наблюдаемой версии (v3.18s).
</td style=»width: 20%;»></td style=»width: 20%;»>
Десятичное значение | Символ | Описание |
33 | ! | Прервать выполнение предыдущей команды |
36 | $ | Сделать скриншот |
48 | 0 | Выполнить следующие shell-команды: rm c/*; rm p/*; rm sdcard/Android/system/tmp/r/* |
63 | ? | Записать в лог информацию об устройстве и метаинформацию импланта |
66(98) | B(b) | Транслировать указанную команду другому компоненту |
67(99) | C(c) | Установить таймер на выполнение указанной команды |
Отладка | ||
68(100) 65(97) | D(d) A(a) | Записать в лог последние 10 задач, получаемые через API getRecentTasks |
68(100) 83(115) | D(d) S(s) | Записать в лог информацию о датчиках устройства (датчик движения, температуры воздуха и давления и т.д.) |
68(100) 84(116) | D(d) T(t) | Внести в журнал трассировку стека и информацию о потоке |
GPS-модуль | ||
101 | e | Транслировать команду внешнему GPS-модулю |
71(103) | G(g) | Отслеживание местоположения по GPS/сети |
Взаимодействие с операторами | ||
73(105) 102 114 | I(i) f r | Скачать указанный файл с FTP-сервера (по умолчанию – файл CMDS с командами) |
73(105) 102 115 | I(i) f s | Загрузить на сервер эксфильтрованные данные |
73(105) 73(105) | I(i) I(i) | Запустить/остановить IRC-сервис |
73(105) 76(108) | I(i) L(l) | Отправить текущее местоположение через IRC |
73(105) 77(109) | I(i) M(m) | Отправить указанное сообщение через IRC |
73(105) 82(114) | I(i) R(r) | Считать команды из почтового ящика |
73(105) 83(115) | I(i) S(s) | Отправить указанный файл или все собранные данные почтовым сообщением с UID в теме |
Сетевая геолокация | ||
76(108) | L(l) | Получить информацию о текущем cell_id (базовой станции) |
Функции камеры | ||
77(109) 99 | M(m) c | Сделать фото |
77(109) 108 | M(m) l | Записать в лог информацию о доступных камерах |
77(109) 114 97 | M(m) r a | Начать/закончить запись аудио (по умолчанию с длительностью 2 минуты) |
77(109) 114 98 | M(m) r b | Начать/закончить запись аудио с указанной длительностью |
77(109) 114 44(114) | M(m) r ,(r) | Начать запись с указанными параметрами (позволяет выбрать конкретный микрофон и т.д.) |
77(109) 114 115 | M(m) r s | Закончить предыдущую запись |
77(109) 114 116 | M(m) r t | Назначить длительность записи по умолчанию |
77(109) 118 | M(m) v | Снять видео с указанной длительностью и качеством |
Общие функции | ||
79(111) 102 | O(o) f | Принудительно остановить все сервисы импланта, отключить ресиверы |
79(111) 110 | O(o) n | Запустить основной сервис импланта со всеми компонентами |
80(112) | P(p) | Найти указанные изображения на устройстве и масштабировать их с помощью API-функции «inSampleSize» |
81(113) | Q(q) | Остановить основной сервис импланта |
82(114) | R(r) | Выполнить указанную shell-команду |
Параметры SharedPreferences | ||
83(115) 33 | S(s) ! | Вкл/выкл скрытое меню оператора |
83(115) 61 | S(s) = | Управление SharedPreferences (установить/удалить указанное значение) |
83(115) 98 | S(s) b | Вкл/выкл отправку SMS после загрузки устройства |
83(115) 99 | S(s) c | Установить логическое значение «cpyl» в SharedPreferences |
83(115) 100 | S(s) d | Установить логическое значение «dconn» |
83(115) 101 | S(s) e | Вкл/выкл периодическое переподключение к сети |
83(115) 102 | S(s) f | Установить период обновления местонахождения по GPS |
83(115) 105 | S(s) i | Установить логическое значение «imsg» в SharedPreferences |
83(115) 108 97 | S(s) l a | Вкл/выкл логирование текущей activity |
83(115) 108 99 | S(s) l c | Вкл/выкл отправка снятых фото и видео оператору |
83(115) 108 102 | S(s) l f | Вкл/выкл отправка всех изменений базы данных мессенджера Facebook |
83(115) 108 108 | S(s) l l | Вкл/выкл логирования истории браузера |
83(115) 108 116 | S(s) l t | Вкл/выкл отправка всех изменений базы данных кэша мессенджера Telegram |
83(115) 108 118 | S(s) l v | Вкл/выкл отправка всех изменений базы данных мессенджера Viber |
83(115) 108 119 | S(s) l w | Вкл/выкл отправка всех изменений базы данных мессенджера WhatsApp |
83(115) 109 | S(s) m | Вкл/выкл отправку логов через SMS |
83(115) 110(112) | S(s) o(p) | Назначить телефонный номер оператора (для отсылки SMS-сообщений с логами) |
83(115) 113 | S(s) q | Установить режим остановки импланта (полностью или только основного сервиса) |
83(115) 114 | S(s) r | Вкл/выкл выполнение sell-команд с root-правами |
83(115) 115 | S(s) s | Вкл/выкл логирование состояния экрана |
83(115) 116 | S(s) t | Вкл/выкл логирование кейлоггинга и число соответствующих скриншотов |
83(115) 117 | S(s) u | Вкл/выкл режим отладки с логированием информации о системных потоках |
83(115) 120 | S(s) x | Использовать соединение к FTP через busybox или через Socket API (по умолчанию) |
Управление сенсорами и дисплеем | ||
84(116) 98 | T(t) b | Вкл/выклподсветкаэкрана |
84(116) 100 | T(t) d | Вкл/выкл сетевые данные (интернет) |
84(116) 75(107) 48 | T(t) K(k) 0 | Выключить звук устройства, отключить яркость, отключить автоматическую блокировку клавиатуры, использовать wakelock и прослушивать сенсоры устройства. |
84(116) 75(107) 49 | T(t) K(k) 1 | Отключить функции, установленные предыдущей командой |
84(116) 75(107) 50 | T(t) K(k) 2 | Отключить автоматическую блокировку клавиатуры |
84(116) 75(107) 51 | T(t) K(k) 3 | Записать в журнал «userActivity» |
84(116) 115 48 | T(t) s 0 | Отключить прослушиватели датчиков устройства |
84(116) 115 49 | T(t) s 1 | Зарегистрировать прослушиватель для указанного сенсора |
84(116) 115 108 | T(t) s l | Записать в лог значение из файла /dev/lightsensor |
84(116) 119 48 | T(t) w 0 | Отключить Wi-Fi |
84(116) 119 49 | T(t) w 1 | Включить Wi-Fi |
84(116) 119 108 | T(t) w l | Управление WifiLock |
Общие бэкдор-команды | ||
85(117) | U(u) | Монтировать директорию «system», cкачать полезную нагрузку и копировать ее туда. Исходя из комментариев в коде, эта функция может использоваться для обновления компонентов импланта. |
87(119) | W(w) | Отправить SMS с указанным текстом на указанный номер |
Обновления из новейшей версии | ||
122 33 | z ! | Перезагрузить устройство |
122 99 | z c | Сделать дамп журнала вызовов |
122 102 | z f p | Отправить собранные данные на FTP-сервер |
122 102 | z f g | Получить текстовый файл CMDS* и выполнить содержащиеся в нем команды |
122 103 | z g | Получить местонахождение по GPS (без логов, только через Intent) |
122 108 102 | z l f | Сделать дамп сообщений Facebook за указанный период |
122 108 116 | z l t | Сделать дамп кэша Telegram |
122 108 118 | z l v | Сделать дамп сообщений Viber за указанный период |
122 108 119 | z l w | Сделать дамп сообщений WhatsApp за указанный период |
122 110 | z n | Получить число всех SMS-сообщений |
122 111 | z o | Установить режим звонка на беззвучный |
122 112 | z p | Открыть указанный URL в WebView |
122 114 | z r | Удалить все SMS-сообщения |
122 116 | z t | Установить таймеры для всех внутренних сервисов |
122 122 | z z | Удалить значения в SharedPreferences и перезапустить основной сервис |
126 | ~ | Вкл/выкл расширенный режим логирования с SMS и UI |
BusyGasper – недружелюбный шпион