Исследуя операцию "Триангуляция", Kaspersky Lab поставили перед собой цель восстановить как можно больше частей цепочки эксплуатации. На достижение этой цели ушло около полугода, и после того, как сбор цепочки был завершен, Kaspersky приступили к углубленному анализу обнаруженных этапов.
Имплантат, который Kaspersky назвали TriangleDB, развертывается после того, как злоумышленники получают привилегии root на целевом iOS-устройстве, используя уязвимость ядра. Он развертывается в памяти, что означает, что все следы имплантата теряются при перезагрузке устройства. Поэтому, если жертва перезагрузит свое устройство, злоумышленникам придется заразить его заново, отправив iMessage с вредоносным вложением, тем самым запустив всю цепочку эксплуатации заново. Если перезагрузка не происходит, имплантат удаляется через 30 дней, если злоумышленники не продлят этот срок.
TriangleDB
Имплантат TriangleDB закодирован с использованием Objective-C, языка программирования, который сохраняет имена членов и методов, назначенных разработчиком. В бинарном файле имплантата имена методов не обфусцированы, однако имена членов класса представляют собой неинформативные аббревиатуры, что затрудняет угадывание их значения:
Примеры методов класса | Примеры членов класса |
-[CRConfig populateWithFieldsMacOSOnly] | NSString *pubKI; |
-[CRConfig populateWithSysInfo] | NSData *pubK; |
-[CRConfig extendFor:] | signed __int64 iDa; |
-[CRConfig getCInfoForDump] | signed __int64 uD; |
+[CRConfig sharedInstance] | NSString *deN; |
+[CRConfig unmungeHexString:] | NSSTring *prT; |
-[CRConfig init] | NSString *seN; |
-[CRConfig getBuildArchitecture] | NSString *uDI; |
-[CRConfig cLS] | NSString *iME; |
-[CRConfig setVersion] | NSString *meI; |
-[CRConfig swapLpServerType] | NSString *osV; |
-[CRConfig setLpServerType:] | CRPwrInfo *pwI; |
В некоторых случаях можно догадаться, что означают аббревиатуры. Например, osV - это версия iOS, а iME содержит IMEI устройства.
Строки в имплантате имеют HEX-кодировку и зашифрованы с помощью свертки XOR
После запуска имплантат начинает взаимодействовать с сервером C2, используя для обмена данными библиотеку Protobuf. Конфигурация имплантата содержит два сервера: основной и резервный (содержатся в полях конфигурации lS и lSf). Обычно имплантат использует основной сервер, а в случае ошибки переключается на резервный сервер, вызывая метод -[CRConfig swapLpServerType:].
Кроме того, отправляемые и получаемые сообщения шифруются с помощью симметричной (3DES) и асимметричной (RSA) криптографии. Все сообщения обмениваются по протоколу HTTPS в POST-запросах, при этом cookie содержит ключ g и значение, представляющее собой строку цифр из параметра конфигурации pubKI.
Имплантат периодически отправляет маячки heartbeat, которые содержат системную информацию, включая версию имплантата, идентификаторы устройства (IMEI, MEID, серийный номер и т.д.) и конфигурацию демона обновлений (включена ли автоматическая загрузка и установка обновлений).
Сервер C2 отвечает на сообщения сердцебиения командами. Команды передаются в виде сообщений Protobuf, имена типов которых начинаются с CRX. Смысл этих имен неясен: например, команда, перечисляющая каталоги, называется CRXShowTables, а изменение адресов C2-сервера обрабатывается командой CRXConfigureDBServer. Всего в проанализированном нами импланте имеется 24 команды, предназначенные для:
- Взаимодействия с файловой системой (создание, изменение, эксфильтрация и удаление файлов);
- Взаимодействия с процессами (перечисление и завершение процессов);
- сброс элементов связки ключей жертвы, что может быть полезно для сбора учетных данных жертвы;
- Мониторинг геолокации жертвы;
- Запуск дополнительных модулей, которые представляют собой исполняемые файлы Mach-O, загружаемые имплантом. Эти исполняемые файлы загружаются рефлексивно, а их двоичные файлы хранятся только в памяти.
Indicators of Compromise
MD5
- 063db86f015fe99fdd821b251f14446d
SHA1
- 1a321b77be6a523ddde4661a5725043aba0f037f
SHA256
- fd9e97cfb55f9cfb5d3e1388f712edd952d902f23a583826ebe55e9e322f730f