Содержание статьи
info
Это близкий к тексту пересказ материала Exposing Darcula: a rare look behind the scenes of a global Phishing-as-a-Service operation из блога компании mnemonic. Авторы — Эрленд Лейкнес и Харрисон Сэнд. Этот материал доступен без платной подписки.
Эта история началась в декабре 2023 года, когда люди по всему миру стали получать сообщения о том, что их ждут посылки на почте. Сообщения приходили в виде SMS, iMessage или RCS-сообщений. Мы стали свидетелями нового метода мошенничества, известного как смишинг, или SMS-фишинг.
У таких сообщений есть общая черта: они выдают себя за бренд, которому мы доверяем, чтобы создать правдоподобный контекст и выманить у нас личные данные, обманом заставляя делиться информацией.
Некоторые мошеннические схемы заметить проще, чем другие. Ошибки в орфографии, корявые переводы, странные номера или ссылки на темные домены часто их выдают. Но даже очевидные признаки легко упустить в суете дня. Когда многие люди одновременно становятся мишенью, кто‑то из них может оказаться в удачных для мошенника условиях — например, действительно ждет посылку. И эта тактика явно работает. Если бы это не приносило выгоды, мошенники не стали бы вкладывать столько времени, денег и усилий.

На картинке сверху — реально полученное сообщение. Отправитель прикидывается Норвежской почтовой службой, намекает, что доставка на паузе, пока ты не накидаешь «недостающие» детали адреса. А если накидаешь, то тебя попросят оплатить оставшуюся сумму за доставку. Конечно, бывают реальные случаи, когда приплачивать за международные посылки действительно нужно, но это явно не один из них.
Пара минут гуглинга, и масштабы этой операции начали проявляться. Мы наткнулись на кучу постов в соцсетях и новостных статей со скриншотами подозрительно похожих сообщений, которые получали жертвы по всему миру на разных языках.
Любой эксперт, будь он из полиции, банка или корпорации, посоветует в этом случае не кликать на ссылку, удалить сообщение и жить дальше спокойной жизнью.
Но наш брат не таков, нами ведь движет желание заглянуть под капот и выяснить, как на самом деле все устроено. Именно эта жажда знаний вкупе с нашим опытом в этичном хакерстве и безопасности приложений подтолкнула нас нарушить все разумные советы: мы решили все же кликнуть по ссылке.

Все оказалось более или менее как мы и думали. На нашем смартфоне всплыла страничка якобы почтовой службы, предлагающая нажать на кнопку и ввести адрес. После нескольких таких «остановок» нас попросили заплатить небольшую сумму, что подтвердило истинную цель мошенничества — кражу нашей кредитки.
Взгляд под капот
Только мобилки
Фишинговые сообщения, которые мы получили, были нацелены на мобильные устройства. Открывать их предполагалось именно на смартфонах. Но из‑за того, что смартфоны не особенно годятся для проведения форензики, нам нужно было как‑то глянуть на эту фишинговую страницу на обычном компьютере.
Исследуя софт, мы наткнулись на несколько антикриминалистических функций. Первая из них — ограничение, из‑за которого ссылки открывались только с телефонов, работающих через сотовую сеть.
Такие приколы часто используются для того, чтобы защитные решения, не соответствующие этим критериям, не могли проверить ссылку на наличие вредоносного содержимого. В итоге сообщения не помечаются как фишинговые и злодейские сайты и домены не попадают в черные списки.
Итак, при переходе по ссылке с компьютера мы столкнулись с сообщением «Не найдено».

Тогда мы решили пустить в ход знаменитый Burp. Он создает промежуточный прокси‑сервер, который втискивается между твоим браузером и сервером, позволяя разглядывать и редактировать трафик, пока тот носится туда‑сюда между сервером и браузером. Чтобы наш запрос выглядел так, будто он идет с мобильного, мы подменили заголовок User-Agent
тем, что обычно передается при открытии страницы с телефона:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36
Но сменить заголовок User-Agent
оказалось недостаточно — мы все равно получали ошибку «404 Not Found».
Единственное различие между запросом, который мы посылали с телефона, и тем, что отправляли с компьютера, было в исходном IP-адресе. Видимо, фишинговый софт был настроен так, чтобы показывать контент только тем, кто заходит через сотовую сеть. Мы раздали себе интернет с телефона, что наконец позволило загрузить фишинговую страницу на десктопе и с настоящими инструментами и копнуть этот софт глубже.
Шифрование
Когда мы всё настроили и запустили, сразу стало видно, что злоумышленники используют популярную библиотеку обмена сообщениями под названием Socket.IO. Мы также смогли подглядеть передаваемые сообщения. Вот пример:
{"msg": { "type": "824d02e7cf6ec64a44710b06ef8cfa0e", "data": "U2FsdGVkX19JWH3V+KnWIdPjzlF/wBhLj4W/rYovdJmHineTSuwIxfkSQyLycrSfTyBEAai8R6yrLQnIcd3FtjqDoXPyh9j28hXEyaYAjyo4ZuTx0jaaJE/CdV0F/[snipped]" }, "user": [], "room": [ "21232f297a57a5a743894a0e4a801fc3" ]}
По набору символов и длине элементов послания мы решили, что type
и room
— это MD5-хеши, а data
выглядит как строка, закодированная в Base64. Хеши обсудим чуть позже.
После декодирования элемента данных строчка Salted_
и последующий неразборчивый текст дали понять, что тут явно замешано шифрование.

В мире безопасности приложений это называется клиентским шифрованием. И чаще всего это верный признак того, что кто‑то делает что‑то подозрительное.
В большинстве случаев шифровать сообщения подобным образом не имеет смысла. Это требует хранить ключи шифрования на клиенте, а канал связи между клиентом и сервером и так защищен на сетевом уровне через HTTPS. Но тут ситуация иная: приложение пытается защититься от нас — исследователей безопасности, вооруженных прокси типа «человек посередине».
Эта дополнительная шифровка выступает как слой обфускации, чтобы скрыть внутренние механизмы фишингового протокола. Но поскольку у нас был полный контроль над клиентом, мы могли просматривать сообщения до их шифровки, и это позволило извлечь ключи шифрования.
Мы покопались в JavaScript-коде на стороне клиента и вскоре наткнулись на функции шифрования и дешифрования, а также на заветные ключи.

Мы заметили, что вирусописатели использовали библиотеку Node.js под названием crypto-js и алгоритм Rabbit для шифрования элемента data
в сообщениях. Мы написали несколько простых строк на JavaScript, которые позволили нам расшифровывать содержимое сообщений.

После этого быстрого теста мы написали код, который позволил нам в режиме реального времени видеть и изменять текстовую версию сообщений в Burp. Наш код на JavaScript также показал, что ранее встреченные параметры type
и room
были MD5-хешами от sync-data
и admin
. Теперь у нас появилась возможность наблюдать за тем, чем занимается приложение, и при необходимости править сообщения. Вот пример такого расшифрованного сообщения.
{ "msg": { "type": "sync-data", "data": "{"id":1,"domain":"post.lol","ip":"192.168.100.169","ua":"Mozilla/5.0 (iPhone; CPU iPhone OS 5\1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3","data":{},"created\at":"2024-08-30T10:07:20.907Z","updated\at":"2024-08-30T10:07:20.907Z"} }, "user": [], "room": [ "admin" ]}
Похоже, это что‑то вроде чата: браузер сливает данные жертвы в «комнату» с пометкой admin.
Вероятно, разные компоненты приложения могут подключаться к «комнатам», чтобы получать сообщения. Например, если у мошенника есть панель со списком жертв, возможно, она тоже доступна из комнаты админов.
Копнув поглубже в эту функцию «комнат», мы наткнулись на одно любопытное сообщение. Каждый раз, загружая фишинговую страницу, мы автоматически подключались к комнате по умолчанию.

Это сообщение подтвердило наши ранние догадки. Наш браузер, «жертва», подключался в пустую или стандартную комнату, но данные, которые мы вводили, улетали в комнату «админа». Нельзя ли как‑то пробраться в нее?
То, что мы увидели, сделав это, повергло нас в шок. По экрану летел поток имен, адресов и кредитных карт — в реальном времени мы наблюдали, как сотни жертв попадали под фишинговую атаку. Всё, что они вводили, символ за символом, отображалось на нашем экране.
То, что начиналось как занимательный побочный проект, вдруг выросло в нечто серьезное.
Группа Darcula
Когда первый шок прошел, мы поняли, что в админской комнате появляются не только данные пострадавших. Там еще обнаружились кое‑какие технические логи.

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

Промотав фотки, выложенные в группе, мы поняли, что копаем в верном направлении.


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


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


Члены группировки не только зарабатывали деньги, но и не стесняясь тратили их.
В Telegram-группе мы наткнулись на закрепленное сообщение с инструкцией по установке самого фишингового софта.

Мы взяли запасной ноут и стали следовать инструкциям. Буквально через несколько минут у нас уже была установлена копия того самого фишингового ПО, которое использовали против нас: Magic Cat.
Активируем котоколдунство
Запустить софтину оказалось проще простого. Копируешь одну‑единственную команду, вставляешь ее — и вуаля, фишинговое ПО почти готово к использованию. Если бы только не одно но — установка‑то у нас без лицензии.
На скриншоте ниже изображена админская панель софта, который теперь известен нам как Magic Cat. Это скрытая панель оператора, которую мошенник использует для просмотра всех украденных данных кредитных карт и взаимодействия с жертвами, чтобы при необходимости запрашивать дополнительные PIN-коды.

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

Это был не первый случай, когда мы сталкивались с запутанным кодом на Node.js. Мы уже знакомы с открытым инструментом с прямолинейным названием JavaScript Obfuscator, который берет обычный код и превращает его в нечто, похожее на скриншот выше, — нечитабельный хлам. Но есть и другой опенсорсный инструмент под названием synchrony, который разбирает этот обфусцированный кошмар обратно. Получается более‑менее читабельный код, правда, без комментариев и исходных названий функций и переменных.

Имея на руках читаемый код бэкенда, мы смогли понять, как работают разные аспекты этого софта. К нашему удивлению, мы обнаружили функции, связанные с генерацией активационных ключей. Это не просто код для использования какого‑то ключа, в каждой копии фишингового софта сидел полноценный сервер активации, который мог генерировать новые ключи. Разве это не настоящая находка для исследователя?
Если сервер настроен на определенное имя хоста, то открывается тайное меню с фичей для генерации ключей активации. И это еще не всё! Он может активировать другие копии Magic Cat.
Чтобы активировать программу, нужно сгенерировать новую лицензию, добавить к ней коммент, задать дату окончания срока действия и ограничение на количество фишинговых шаблонов, которые можно скачать по этой лицензии. По сути, все это очень напоминает типичный корпоративный софт для управления лицензиями. Magic Cat еще и фиксировал IP-адреса всех фишинговых серверов, откуда прилетали запросы на активацию.
У нас все было под контролем в лабораторных условиях, так что мы смогли обмануть наше копирайтное ПО, заставив его думать, что мы — настоящий сервер активации. Так мы смогли активировать нашу копию Magic Cat, не потратив ни копейки на лицензию.
Платформа Magic Cat
Теперь, когда софт работает на нашем ноутбуке, да еще и с доступом к исходникам, мы можем занырнуть с головой в исследования и посмотреть, как работает Magic Cat со стороны фишинговых операторов.
В процессе изучения программы мы наткнулись на множество интересных находок. Возможностей — огромное количество, и все явно задумано так, чтобы любой покупатель, даже без технической подготовки, мог запустить собственную фишинговую кампанию.
На тот момент система «из коробки» включала возможность подделывать пару сотен брендов в разных странах мира. По последним данным, обновления платформы сделали создание кастомных шаблонов еще удобнее.

Magic Cat передает информацию, которую жертвы вводят на фишинговых сайтах, буквально в режиме реального времени. Операторы могут отслеживать каждую букву, которую вводит жертва. Они могут в любой момент запросить PIN-коды, легко подключать SMS-шлюзы и использовать множество других функций.
Лазейка?
Копаясь в коде нашего экземпляра фишингового ПО, мы заметили странную логику, которая проверяет, правильный ли передан набор параметров в HTTP-запросе. Если параметры правильные, система пропускает проверку авторизации и можно выполнять запросы, не логинясь как фишинговый оператор.

Такая фича у нас сразу вызвала ассоциации с бэкдором, но может, это просто разработчик накосячил? Так ли это, мы до сих пор не выяснили. Возможно, это действительно баг — например, плохой дизайн среды разработки. Ну а если ты готов надеть черную шляпу и включить паранойю на полную катушку, то это может быть очень хитрый бэкдор с правдоподобным оправданием — на случай, если кто‑нибудь его все‑таки раскопает в будущем.
К новым вершинам!
Наше исследование постепенно начало показывать, насколько крупной и профессиональной была эта операция. У платформы были регулярные циклы выпуска ПО, анонсы новых фич, руководства по установке и поддержка, а также полный учет всех, кто покупал и использовал софт.
В январе 2024 года мы собрали полный отчет, где подробно расписали все наши находки, и поделились им с несколькими правоохранительными органами.
С самого начала проекта мы старались сосредоточиться на общей картине. Чтобы зачистить поле от смишинга, фишинга и других разводов, надо подключать всех: банки, мобильных операторов, IT-гигантов и полицию. Именно поэтому мы решили связаться с NRK, Норвежской телерадиокомпанией. Вдруг там кого‑то заинтересует, что мы тут накопали?
Мы поделились всеми нашими находками на тот момент и продолжили исследование. Но главный вопрос остался без ответа. Кто такой Даркула?
По ту сторону
Darcula держался в тени. Пока другие пользователи хвастались своей роскошной жизнью в паблике Telegram, он в основном постил скучные технические новости про Magic Cat и не оставлял нам почти никаких зацепок. Мы даже не были уверены, кто или что такое Darcula — человек или целая группа. Мы продолжали копаться, просеивая все доступные данные о софтверной экосистеме.
Попасть в тупик в расследовании — классика жанра. Но вот удача: мы наткнулись на IP-адрес, который, похоже, был связан с административными функциями. Не исключено, что этот айпишник мог привести к тем, кто стоит за софтом Magic Cat.

IP принадлежал виртуальной машине в облаке Alibaba, вероятно, каким‑то видом VPN. Сам по себе этот факт мало что означал. Это могло быть самодельное творение Darcula или общедоступный сервис, на котором сидят сотни или даже тысячи юзеров. В любом случае другой зацепки у нас не было.
Мы решили выяснить, для чего использовался этот IP-адрес в прошлом. У нас есть собственный сервис Passive DNS, который ведет что‑то вроде исторического архива, где хранится информация о том, какие IP-адреса с какими доменами были связаны. Благодаря этим записям мы обнаружили, что чуть больше года назад, в декабре 2022-го, этот IP был привязан к конкретному домену. Копнув глубже исторические данные DNS, мы выяснили, что домен был связан с пользователем GitHub.

IP-адреса часто меняют владельцев. Если виртуальная машина в Alibaba Cloud удалялась, ее IP мог легко перейти к другому клиенту. Но нас это не остановило — вдруг повезет? К тому же репозитории на GitHub содержали софт, созданный с использованием тех же фреймворков, что и Magic Cat. Это намекает на потенциальную связь.
В истории коммитов мы нашли почту на Gmail. Это стало зацепкой для дальнейшего поиска информации, которая либо опровергнет, либо подтвердит теорию о том, что это действительно Даркула.
В ходе исследования мы использовали бесплатный вариант сервиса OSINT Industries. Он помогает узнать, какие аккаунты привязаны к определенному адресу электронной почты или номеру телефона. Также он показывает всю доступную публичную информацию об аккаунте.
Представь, что ты начинаешь сбрасывать пароль на сайте, а сайт тебе говорит: введи номер телефона, заканчивающийся на XX, чтобы мы выслали код. Если ты проделаешь это на куче сайтов, сможешь выяснить, на каких из них использовалась почта, и даже можешь частично расшифровать номер телефона. В OSINT Industries уже автоматизировали этот процесс и применяют в промышленных масштабах.
Пробив аккаунт на Gmail через OSINT Industries, мы нашли кое‑что интересное. Телега Даркулы была привязана к американскому номеру, который мы считали одноразовым. Номер заканчивался на 89. И тут выясняется, что этот же Gmail связан с Apple ID, где номер тоже кончается на 89.

Была ли это просто случайность? Самый быстрый способ развеять или, наоборот, укрепить подозрения, что Даркула и наш пользователь GitHub — одно и то же лицо, — это выяснить, не продолжает ли наш герой использовать тот же сервер для VPN. Мы решили отправить на связанный Gmail-адрес письмо со ссылкой‑заманухой. Если кто‑то кликнет, у нас на руках будет IP-адрес.
И на ссылку кликнули!

Это подтвердило, что email по‑прежнему активен, а кто‑то, имеющий доступ к этому аккаунту, кликнул на ссылку. IP-адрес совпал с тем, который мы видели в Magic Cat. Все больше улик указывает на связь с Даркулой.
Еще глубже в кроличью нору
Поиск от OSINT Industries в числе прочего выдал нам частичный китайский номер телефона, связанный с аккаунтом Gmail.
Для получения нового китайского телефонного номера требуется удостоверение личности. Это значит, что если мы сумеем раздобыть полный китайский номер Даркулы, то у нас появится крутая зацепка, которая выведет нас на его настоящую личность.
С доменом, который мы нашли ранее, связан еще один адрес электронной почты. На этот раз — аккаунт QQ, популярного китайского мессенджера и почтового сервиса. Мы сопоставили всю информацию об аккаунте на Gmail с данными о QQ и раскрыли почти весь телефонный номер, за исключением последних трех цифр.
Занятно, что нет единого стандарта, какие именно цифры скрывать, когда сайт показывает лишь часть номера при восстановлении аккаунта. Если разные сайты маскируют разные цифры, ты можешь наложить их результаты друг на друга и узнать значительную часть номера.
Три пропущенных цифры оставили нам 1000 возможных телефонных номеров. Мы хотели искать их через OSINT Industries, но это могло бы влететь в копеечку. Вместо этого мы решили изучить базы данных утечек информации на все возможные номера, а уже найденные результаты прогнать через OSINT Industries.

Мы подумали вот о чем: не у всех телефонных номеров есть след в сети, и шансы больше у тех, что всплывали в утечках публичных баз данных.
Наш подход, похоже, окупился: мы нашли номер телефона, связанный с аккаунтом в Instagram — с таким же именем пользователя, как в Gmail, и той же аватаркой.

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

Мы уже встречали это имя в Telegram. Даркула заваливал сеть ворохом вордовских файлов со всякими инструкциями по установке и использованию Magic Cat. В метаданных документов значилось то же имя.

История продолжается
Когда мы начали копаться в этом фишинг‑ките, нас подстегнуло то, что информации о современных фишинговых кампаниях почти не было.
Мы решили выяснить, кто стоит за этой схемой и как она вообще работает. В идеале хотелось раскопать достаточно информации, чтобы выкатить статью и рассказать обо всех тонкостях.
Наше исследование выявило сотни тысяч жертв, тысячи лицензий, купленных для использования Magic Cat, и развитую экосистему, которая позволяет неправомерно использовать известные названия организаций со всего мира.
На этом этапе мы почувствовали, что наша роль в этой истории подходит к концу. Журналисты норвежского телеканала NRK смогли взять наши находки и благодаря своему расследованию подсветить новые факты. Они открыли дверь для дискуссий о том, что мы можем сделать, чтобы пресечь преступления такого рода.
Работодатели Даркулы
Репортеры норвежского медиаресурса NRK в рамках собственного расследования обратились к независимому исследователю Ксавье Хуану, специализирующемуся на КНР.
По его данным, найденный номер телефона зарегистрирован на Юйчэна С., 24-летнего жителя китайской провинции Хэнань. Сопоставив всё, авторы расследования NRK уверенно утверждают: именно Юйчэн стоит за киберкриминальной личностью Darcula. В их распоряжении — даже его фото с удостоверения личности.

В NRK решили связаться с Даркулой напрямую и отправили сообщение, обратившись к нему по настоящему имени. Ответ пришел спустя несколько дней — от человека, представившегося как Лао Лю:
— Юйчэн работал у нас, но уволился неделю назад.
Он отказался называть компанию или ее юридический адрес, ссылаясь на конфиденциальность. Но NRK настаивает:
— Мы пишем о Magic Cat и хотим поговорить с теми, кто его создавал.
— Нас много, и я один из них, — отвечает Лю. — Да, Юйчэн тоже участвовал. Он был самым успешным продавцом. Можно сказать, один из основателей. Хотя официально он просто получал зарплату.
На вопрос, является ли Юйчэн автором программы, Лю уклончиво отвечает: один из разработчиков. И добавляет:
— Мы не хотим его терять.
Когда NRK указывает на то, что Magic Cat активно используется для фишинга, Лю настаивает:
— Мы просто продаем софт, который создает сайты. Мы никого не подталкиваем к мошенничеству. Наша сфера — кибербезопасность и борьба с фродом.
— Но Darcula в Telegram помогает мошенникам, использующим Magic Cat. У нас есть доказательства.
— Мы не знаем, кто именно использует наш продукт, — отрезает он. — Но да, я знаю, что его применяют в схемах. Мы всё закроем.
Журналисты NRK подчеркивают, что на момент публикации Magic Cat не только не был закрыт, но вышла новая, более продвинутая версия, которая позволяет еще проще обманывать людей и воровать их деньги.