В материалах, опубликованных после крупной утечки из Агентства национальной безопасности США, обнаружена сигнатура, которая привела к идентификации ранее неизвестной хакерской группировки. Речь идет о наборе данных Territorial Dispute, который распространяется в открытом доступе с 2017 года. Внутри этого набора, помимо эксплойтов и вредоносных инструментов, содержатся вспомогательные файлы с перечнем сигнатур, которые долгое время не привлекали внимания. Именно один из таких перечней, а именно сигнатура под номером 37, позволила выйти на след группы, получившей название Nazar.
Описание
Первоначально эту сигнатуру ошибочно приписали китайской группировке Emissary Panda, известной также под другими именами. Такая версия возникла из-за автоматического комментария в базе VirusTotal. Однако при ближайшем рассмотрении выяснилось, что файл, на который ссылался комментарий, представляет собой просто дамп памяти одного из легитимных установщиков, не имеющий отношения к вредоносной активности. Таким образом, атрибуция SIG37 оказалась ложной, а сам индикатор указывал только на одно имя файла, что делало его крайне сложным для идентификации.
Как показали аналитики CrySyS lab, эта сигнатура входила в реестр, составленный на основе документов из все той же утечки. CrySyS lab одной из первых обратила внимание на ценность вспомогательных файлов из набора Territorial Dispute. В их отчете, опубликованном в 2018 году, SIG37 значилась как возможный след Emissary Panda, но уже тогда эксперты отмечали низкую достоверность признаков. Дальнейшее изучение показало, что за этой сигнатурой стоит совершенно другой оператор.
В результате углубленного анализа исследователям удалось связать SIG37 с целым кластером вредоносных программ, который получил название Nazar в честь персидского амулета от сглаза. Название не случайно: в некоторых образцах найдены отладочные пути, указывающие на персидский язык, а также ресурсы на фарси. Время активности группы устанавливается примерно с 2010 по 2013 год, хотя отдельные следы могут относиться к 2008 году. При этом первые образцы стали появляться в открытых базах только в 2013 году, что затрудняет точную оценку масштаба операции.
Особый интерес представляет тот факт, что об этой группировке знало АНБ задолго до того, как она стала известна широкой публике. В документах, попавших в распоряжение журналистов, упоминается перечень драйверов, который включает используемые Nazar компоненты. Возможно, это объясняется тем, что атаки группы были направлены в основном на иранские системы, где они пересекались с операциями самого АНБ. Некоторые эксперты предполагают, что Nazar могла быть инструментом внутреннего мониторинга, но подтверждений этому пока нет.
Помимо SIG37, в перечне из Territorial Dispute содержатся десятки других сигнатур, и многие из них до сих пор не имеют однозначной атрибуции. Некоторые из них исследователи связали с известными группировками, однако SIG37 оставалась белым пятном. Её анализом занимались специалисты из Kaspersky и Chronicle, но ключ к разгадке дало именно обнаружение персидских ресурсов в образцах. Это позволило предположить, что операция, скорее всего, действовала на территории Ирана. Существует версия, что образцы Nazar встречались исключительно на иранских компьютерах, где одновременно работали инструменты АНБ. Такое совпадение могло бы объяснить, почему западные антивирусные компании долго не фиксировали данную активность. Впрочем, за неимением исторических данных эту гипотезу пока нельзя ни подтвердить, ни опровергнуть.
Техническая сторона операции выглядит нестандартно для иранских группировок того времени. Вместо примитивных программ на платформе .NET (среда для выполнения приложений от Microsoft), которыми обычно пользовались другие операторы, Nazar использовала модульную схему с перепрофилированием легитимных библиотек. Основной загрузчик представлял собой самораспаковывающийся архив, созданный с помощью одного из популярных инструментов для защиты исполняемых файлов. После запуска он распаковывал компоненты и регистрировал их в системе как обычные программные модули.
Центральный оркестратор, маскирующийся под системный процесс, устанавливался в качестве службы Windows. Он принимал команды от управляющего сервера и распределял задачи между остальными модулями. В его коде присутствовало семнадцать различных команд, но некоторые из них так и не были реализованы до конца, что говорит о продолжающейся разработке инструмента. Поздние исследования показали, что оркестратор на самом деле работает как пассивный агент, ожидающий сигналов по сети. Это значит, что у него нет прописанных адресов серверов, и команды приходят по сетевому каналу, что дополнительно усложняет обнаружение.
В состав инструментария входят модули для записи звука с микрофона, захвата изображения с экрана и отслеживания нажатий клавиш. Для их создания разработчики использовали не только собственные библиотеки, но и модифицированные версии популярных кодеков и графических утилит. Такой подход позволял снизить вероятность обнаружения, поскольку вредоносный код прятался внутри легитимных программ. Кроме того, в систему внедрялся модуль для перехвата сетевых пакетов, который устанавливался как драйвер. Этот модуль анализировал входящие и исходящие данные, хотя точное назначение его пока не выяснено. По мнению некоторых аналитиков, он мог использоваться для скрытой передачи данных или в качестве маркера для идентификации других вредоносных программ.
Обнаружение Nazar ставит перед сообществом ряд открытых вопросов. Неизвестно, насколько масштабной была эта операция и продолжается ли она до сих пор. Отсутствие данных о жертвах не позволяет определить цели атакующих. Остается также неясным, как эта группировка связана с другими известными иранскими операторами. Специалисты, имеющие доступ к телеметрии и историческим данным, могут внести существенный вклад в изучение этой угрозы, и начатая работа предоставляет для этого хорошую основу.
Индикаторы компрометации
SHA256
- 0091e2101f00751c4020ef8e115cfe12a284c9abacc886f549b40a62574a7510
- 048208864c793a670159723b38c3ea1474ccc62e06b90833bdf1683b8026e12f
- 0c09fedc5c74f90883cd3256a181d03e4376d13676c1fe266dbd04778a929198
- 1110c3e34b6bbaadc5082fabbdd69f492f3b1480724b879a3df0035ff487fd6f
- 2fe9b76496a9480273357b6d35c012809bfa3ae8976813a7f5f4959402e3fbb6
- 4d0ab3951df93589a874192569cac88f7107f595600e274f52e2b75f68593bca
- 5a924dec60c623cf73f5b8505e11512ad85e62ac571a840ab0ff48d4a04b60de
- 6b8ea9a156d495ec089710710ce3f4b1e19251c1d0e5b2c21bbeeab05e7b331f
- 75e4d73252c753cd8e177820eb261cd72fecd7360cc8ec3feeab7bd129c01ff6
- 8fb9a22b20a338d90c7ceb9424d079a61ca7ccb7f78ffb7d74d2f403ae9fbeec
- 967ac245e8429e3b725463a5c4c42fbdf98385ee6f25254e48b9492df21f2d0b
- c84100d52c09703e32951444bd7ba4e22c5d41193e7420aacbbc1f736f4c4e1f
- d34a996826ea5a028f5b4713c797247913f036ca0063cc4c18d8b04736fa0b65
- d9801b4da1dbc5264e83029abb93e800d3c9971c650ecc2df5f85bcc10c7bd61
- eb705459c2b37fba5747c73ce4870497aa1d4de22c97aaea4af38cdc899b51d3
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | rule apt_ZZ_SIG37_NAZAR_GpUpdatesExe { meta: desc = "SIG37 GpUpdates dropper, Chilkat Zip2Secure" author = "JAG-S" hash = "75e4d73252c753cd8e177820eb261cd72fecd7360cc8ec3feeab7bd129c01ff6" strings: $open = "open" ascii wide fullword $regsrv = "regsvr32.exe" ascii wide $filename1 = "Godown.dll -s" ascii wide $filename2 = "ViewScreen.dll -s" ascii wide $filename3 = "Filesystem.dll -s" ascii wide condition: uint16(0) == 0x5a4d and ($open and $regsrv and (1 of ($filename*))) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | rule apt_ZZ_SIG37_NAZAR_FarsiResources { meta: desc = "SIG37 GpUpdates Shared Farsi resources" author = "JAG-S" hash = "75e4d73252c753cd8e177820eb261cd72fecd7360cc8ec3feeab7bd129c01ff6" condition: uint16(0) == 0x5a4d and for any i in (0..pe.number_of_resources - 1): //FARSI resources ( hash.sha256(pe.resources[i].offset, pe.resources[i].length) == "893cf8c164106784669b395825f17c21f46a345babfff6144686e8e1a48bf2f1" or hash.sha256(pe.resources[i].offset, pe.resources[i].length) == "26ee0ff37e6ffd30ca5415992ececc5faeb8e6a937fcbeb3952ce5581456b7b5" ) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | rule apt_ZZ_SIG37_NAZAR_GoDownDll { meta: desc = "SIG37 Dropped TypeLibrary" author = "JAG-S" hash = "8fb9a22b20a338d90c7ceb9424d079a61ca7ccb7f78ffb7d74d2f403ae9fbeec" //?? strings: $godown1 = /Godown [0-9.]{1,4} Type LibraryWWW/ ascii wide $godown2 = "Godown.Shutdown.1" ascii wide $godown3 = "qGODOWNLibWWW" ascii wide $guid1 = "{772BA12D-8A62-4DD3-B3E8-92DA702E6F3D}" ascii wide //TypeLib reg $guid2 = "{B64E94AF-D56B-48B4-B178-AF0723E72AB5}" ascii wide //TypeLib reg $guid3 = "{DBCB4B31-21B8-4A0F-BC69-0C3CE3B66D00}" ascii wide $shutdown1 = "aShutdownd" ascii wide $shutdown2 = "IShutdownWWWd" ascii wide $shutdown3 = "IShutdown InterfaceWWW" ascii wide $shutdown4 = "method PowerOffWWW" ascii wide $shutdown5 = "property TimeoutWW" ascii wide condition: uint16(0) == 0x5a4d and ( any of ($godown*) or any of ($guid*) or 2 of ($shutdown*) ) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | rule apt_ZZ_SIG37_NAZAR_Kzher_pdb { meta: desc = "GoDown PDB Path" author = "JAG-S" hash = "4d0ab3951df93589a874192569cac88f7107f595600e274f52e2b75f68593bca" hash = "d9801b4da1dbc5264e83029abb93e800d3c9971c650ecc2df5f85bcc10c7bd61" hash = "1110c3e34b6bbaadc5082fabbdd69f492f3b1480724b879a3df0035ff487fd6f" strings: $pdb_spec = "C:\\khzer\\DLLs\\DLL's Source\\" ascii wide $pdb_gen = "C:\\khzer\\" ascii wide condition: uint16(0) == 0x5a4d and any of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | rule apt_ZZ_SIG37_NAZAR_GpUpdates_Distribute { meta: desc = "SIG37 GpUpdates unpacked distributor: Distribute.exe" author = "JAG-S" hash = "6b8ea9a156d495ec089710710ce3f4b1e19251c1d0e5b2c21bbeeab05e7b331f" parent = "d34a996826ea5a028f5b4713c797247913f036ca0063cc4c18d8b04736fa0b65" strings: $uniq_filename1 = "\\godown.dll" ascii wide $common_filename1 = "\\ViewScreen.dll" ascii wide $common_filename2 = "\\filesystem.dll" ascii wide $common_filename3 = "\\dllcache\\svchost.exe" ascii wide $common_filename4 = "\\lame_enc.dll" ascii wide $common_filename5 = "\\hodll.dll" ascii wide $service1 = "Provides basic host functionality" ascii wide $service2 = "EYService" ascii wide $service3 = "Windows Host Service" ascii wide condition: uint16(0) == 0x5a4d and ( any of ($uniq_filename*) or all of ($common_filename*) or (all of ($service*) and 3 of ($common_filename*)) ) } |